es之null_value
官方文档
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搜索。
总结
- 在映射中可以指定字段的null_value, 当字段的值为null值时,es会使用null_value为此字段创建索引,但不会替换文档中的null值,客户端可以使用null_value搜索文档。
- 如果索引文档的时候,没有包含某字段,那null_value搜索也无法找到此记录,可以使用exists来搜索。