当前位置:首页 > 编程笔记 > 正文
已解决

es之null_value

来自网友在路上 150850提问 提问时间:2023-10-29 03:39:26阅读次数: 50

最佳答案 问答题库508位专家为你答疑解惑

官方文档

https://www.elastic.co/guide/en/elasticsearch/reference/8.8/null-value.html

什么是null值

在es中, null, [], [null] 这三个值会被当成null值(空值)

null值不能做搜索参数

get /dev-member/_search
{"query":{"term": {"employee_id": null}}
}

会报错:

{"error": {"root_cause": [{"type": "illegal_argument_exception","reason": "field name is null or empty"}],"type": "illegal_argument_exception","reason": "field name is null or empty"},"status": 400
}

原因是es不会为null值建立索引。

使用null_value搜索null值的记录

要想搜索null值文档,就要为null值创建索引。
一个方法是用一个特定值替换掉null值,比如用0来代替员工id不存在,搜索时直接使用特定值去搜索。
另一个方法是使用es提供的null_value功能。
在定义映射的时候指定null_value

"employee_id":{"type":"long","null_value":0
}

注意: null_value的值要和字段数据类型一致。
这样在索引记录的时候,es发现employee_id为null值,就会将这个文档归属到null_value指向的记录集中,本例是0。
但是es不会修改文档的原值, 所以在文档中, employee_id仍然为null值。
搜索的时候,就可以使用null_value值去搜索employe_id为null的文档。
例如:

get /dev-member/_search
{"query":{"term": {"employee_id": 0}}
}

返回的数据中 employee_id为null

{"took": 873,"timed_out": false,"_shards": {"total": 3,"successful": 3,"skipped": 0,"failed": 0},"hits": {"total": {"value": 1,"relation": "eq"},"max_score": 1,"hits": [{"_index": "dev-member","_id": "1234","_score": 1,"_source": {"user_id": "1234","employee_id": null}}]}
}

null_value不是指定默认值

一开始,我以为这是个默认值,也被gpt误导了,后面发现根本不是一回事。
如果在索引文档的时候,没有指定某个字段,那这个字段就不会存在文档中,使用null_value搜索是搜索不出来的,这时候要用exists搜索。

总结

  1. 在映射中可以指定字段的null_value, 当字段的值为null值时,es会使用null_value为此字段创建索引,但不会替换文档中的null值,客户端可以使用null_value搜索文档。
  2. 如果索引文档的时候,没有包含某字段,那null_value搜索也无法找到此记录,可以使用exists来搜索。
查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"es之null_value":http://eshow365.cn/6-27387-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!