Elasticsearch:理解 mapping 中的 null_value
转载自:https://elasticstack.blog.csdn.net/article/details/114266732
null 不能被索引或搜索。 当字段设置为 null(或空数组或 所有值为 null 值的数组)时,将其视为该字段没有值。使用 null_value 参数可以用指定的值替换显式的空值,以便可以对其进行索引和搜索。
例子一
PUT my-index-000001
{
"mappings": {
"properties": {
"status_code": {
"type": "keyword",
"null_value": "NULL"
}
}
}
}
在上面,我们针对 status_code 字段定义其 null_value,也就是说当我们导入一个文档,当它的 status_code 指定为 null 时,那么在导入时,实际上它是被认为是 status_code 当做 "NULL" 被导入并进行分析。我们以下面的两个文档来进行说明:
PUT my-index-000001/_doc/1
{
"status_code": null
}
PUT my-index-000001/_doc/2
{
"status_code": []
}
使用上面的两个命令写入两个文档到索引 my-index-000001 中。我们执行如下的搜索:
GET my-index-000001/_search
我们可以搜索到两个文档:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "my-index-000001",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"status_code" : null
}
},
{
"_index" : "my-index-000001",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"status_code" : [ ]
}
}
]
}
}
这显然是正确的,因为我们导入了两个文档。我们接着进行如下的搜索:
GET my-index-000001/_search
{
"query": {
"term": {
"status_code": "NULL"
}
}
}
上面的命令显示的结果为:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.2876821,
"hits" : [
{
"_index" : "my-index-000001",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.2876821,
"_source" : {
"status_code" : null
}
}
]
}
}
显然,第一个文档被搜索到,而第二个文档没有被搜索到。这是因为在第一个文档中,它清楚地指出 "status_code": null,所以在导入文档时,null_value 被认为是 status_code 而被导入并进行分析。第二个文档没有指定它是 null,所以没有被搜索出来。
例子二
假如我们有一下两个文档:
PUT twitter/_doc/1
{
"age": null
}
PUT twitter/_doc/2
{
"age": 20
}
在上面,我们有两个文档。第一个文档的 age 值为 null,也就是说它不能被搜索到。假如我们做如下的聚合:
GET twitter/_search
{
"size": 0,
"aggs": {
"avg_age": {
"avg": {
"field": "age"
}
}
}
}
那么上面的聚合返回:
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"avg_age" : {
"value" : 20.0
}
}
}
也就是说平均年龄是 20 岁,这是因为第一个文档被视为不见。我们怎么才能让第一个文档也参入聚合呢?我们可以使用 null_value 来为 null 值的字段设置一个值。我们修改 mapping 为:
DELETE twitter
PUT twitter
{
"mappings": {
"properties": {
"age": {
"type": "float",
"null_value": 0
}
}
}
}
我们再重新导入之前的两个文档:
PUT twitter/_doc/1
{
"age": null
}
PUT twitter/_doc/2
{
"age": 20
}
由于我们已经定义当 age 为 null 时,null_value 将会起作用,它的值将为 0,那么这个文档将为可见。执行如下的聚合:
GET twitter/_search
{
"size": 0,
"aggs": {
"avg_age": {
"avg": {
"field": "age"
}
}
}
}
上面的结果为:
{
"took" : 703,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"avg_age" : {
"value" : 10.0
}
}
}
现在的平均值变为 10 了,也就是 (20 + 0)/2 = 10。
这里必须注意的是,我们必须显示地指定 age 为 null,否则 null_vale 将不会起任何的作用。比如:
DELETE twitter
PUT twitter
{
"mappings": {
"properties": {
"age": {
"type": "float",
"null_value": 0
}
}
}
}
PUT twitter/_doc/1
{
"content": "This is cool"
}
PUT twitter/_doc/2
{
"age": 20,
"content": "This is cool too!"
}
在上面,第一个文档里没有定义 age,那么 null_value 将不会起作用。如果我们做如下的聚合:
GET twitter/_search
{
"size": 0,
"aggs": {
"avg_age": {
"avg": {
"field": "age"
}
}
}
}
其显示结果为:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"avg_age" : {
"value" : 20.0
}
}
}
也就是说第一个文档没有被搜索到。
Elasticsearch:理解 mapping 中的 null_value的更多相关文章
- Elasticsearch 理解mapping中的store属性
默认情况下,对字段值进行索引以使其可搜索,但不存储它们 (store). 这意味着可以查询该字段,但是无法检索原始字段值.在这里我们必须理解的一点是: 如果一个字段的mapping中含有store属性 ...
- ElasticSearch(5)-Mapping
一.Mapping概述 映射 为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成全文本(Full-text)或精确的字符串值,Elasticsearch需要知道每个字段里面都包含了 ...
- elasticsearch 之mapping
搭好elk 后,有时候会发现kibana 统计数据时,数据类型不对,这个时候就和elasticsearch的mapping有关,虽然我们可以用logstash修改传入es里的数据类型,比如 float ...
- elasticsearch的mapping映射
Mapping简述 Elasticsearch是一个schema-less的系统,但并不代表no shema,而是会尽量根据JSON源数据的基础类型猜测你想要的字段类型映射.Elasticsearch ...
- 通过Java的Domain类构建ElasticSearch的mapping
通过给定一个Java的class类自行创建ElasticSearch的mapping Order的domain类 public class Order { public String system_i ...
- ELK学习总结(4-1)elasticsearch更改mapping(不停服务重建索引)
elasticsearch更改mapping(不停服务重建索引)原文 http://donlianli.iteye.com/blog/1924721Elasticsearch的mapping一旦创建, ...
- elasticsearch更改mapping(不停服务重建索引)
转载地址:http://donlianli.iteye.com/blog/1924721?utm_source=tuicool&utm_medium=referral Elasticsearc ...
- [转]深刻理解Python中的元类(metaclass)以及元类实现单例模式
使用元类 深刻理解Python中的元类(metaclass)以及元类实现单例模式 在看一些框架源代码的过程中碰到很多元类的实例,看起来很吃力很晦涩:在看python cookbook中关于元类创建单例 ...
- elasticsearch更改mapping,不停服务重建索引(转)
原文:http://donlianli.iteye.com/blog/1924721?utm_source=tuicool&utm_medium=referral Elasticsearch的 ...
随机推荐
- C++基本数据类型范围和区别(详细)
一.基本类型的大小及范围的总结(以下所讲都是默认在32位操作系统下):字节:byte:位:bit.1.短整型short:所占内存大小:2byte=16bit:所能表示范围:-32768~32767:( ...
- 006面试题__创建String对象
常见面试题: String s = new String("hello"); 问:创建了几个对象? 答:2个 1. 创建了一个字符常量池,指向了"hello"字 ...
- 《Python编程:从入门到实践》第19章笔记:用户/用户注册/身份验证
接上篇django最基本的一些日常用法,这是第19章笔记,希望在做"动手试一试"的时候可以让自己方便参考. 这一章实现了两个功能: 1.让用户能够添加主题Topic和条目Entry ...
- YII学习总结5(视图)
<?php namespace app\controllers; use yii\web\Controller; class HelloController extends Controller ...
- Vue路由器的hash和history两种工作模式 && Vue项目编译部署
1 # 一.Vue路由器的两种工作模式 2 # 1.对于一个uri来说,什么是hash值? 井号及其后面的内容就是hash值. 3 # 2.hash值不会包括含在HTTP请求中,即:hash值不会带给 ...
- Nginx 认证模块
# Nginx用户认证模块 # 主要应用业务:文件下载.当用户需要下载某些文件的时候,我们增加用户名和密码机制来进行用户验证. # 该功能的实现是通过ngx_http_auth_basic_modul ...
- 万答#11,MySQL中char与varchar有什么区别
万答#11,MySQL中char与varchar有什么区别 1.实验场景 GreatSQL 8.0.25 InnoDB 2.实验测试 2.1 区别 参数 char varchar 长度是否可变 定长 ...
- 一键到位「GitHub 热点速览 v.22.32」
作者:HelloGitHub-小鱼干 上上周在 B 站观看了智能键盘--瀚文的制作过程,本周 GitHub 热榜上出现了它的软硬件开源项目 HelloWord-Keyboard,如果你的动手能力强不妨 ...
- HttpServletRequest 类
目录 HttpServletRequest类有什么作用 HttpServletRequest 类的常用方法 如何获取请求参数 doGet 请求的中文乱码解决: POST 请求的中文乱码解决 请求的转发 ...
- Taurus.MVC WebAPI 入门开发教程5:控制器安全校验属性【HttpGet、HttpPost】【Ack】【Token】【MicroService】。
系列目录 1.Taurus.MVC WebAPI 入门开发教程1:框架下载环境配置与运行. 2.Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World. 3.Tau ...