• 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
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    会报错:

    {
      "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
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

    使用null_value搜索null值的记录

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

    "employee_id":{
        "type":"long",
        "null_value":0
    }
    
    • 1
    • 2
    • 3
    • 4

    注意: 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
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    返回的数据中 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
            }
          }
        ]
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    null_value不是指定默认值

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

    总结

    1. 在映射中可以指定字段的null_value, 当字段的值为null值时,es会使用null_value为此字段创建索引,但不会替换文档中的null值,客户端可以使用null_value搜索文档。
    2. 如果索引文档的时候,没有包含某字段,那null_value搜索也无法找到此记录,可以使用exists来搜索。
  • 相关阅读:
    万字长文硬核AQS源码分析
    transformer理解
    单点登录和JWT的介绍与使用
    【JavaScript 进阶教程】对象新增方法 defineProperty 与 keys 的说明与使用
    三.镜头知识之FOV
    【660-线性代数】补充秩为1的方阵性质 & 矩阵练习
    长安链同步节点配置与启动
    【计算机网络】图解应用层协议
    “一带一路”是创新之路。推进“一带一路”建设应促进科技同()、科技同金融深度融合。
    每日一个设计模式之【装饰器模式】
  • 原文地址:https://blog.csdn.net/crazyman2010/article/details/134076094