详解如何在Elasticsearch中搜索空值

 更新时间:2023年01月26日 09:29:43   作者:Elasticsearch  
这篇文章主要为大家介绍了如何在Elasticsearch中搜索空值的方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

根据 Elasticsearch 文档,无法索引或搜索空值 null。 当一个字段设置为 null(或空数组或空值数组)时,它被视为该字段没有值。

那么如何找到 product_name 为空(null)的文件呢?

选项 1:null_value 映射参数

你可以在配置索引映射时定义 null_value 参数。 它将允许你在索引文档时用指定值替换显式空值 null,以便它可以被索引和搜索。

让我们创建索引名称 products,其中包含值为 NULL 的 product_name 字段。

 PUT products
 {
   "mappings": {
     "properties": {
       "product_name":{
         "type": "keyword",
         "null_value": "NULL"
       }
     }
    }
  }

让我们用 product_name 字段索引一些文档,该字段的值为 null 或空数组。

 POST products/_doc/1
 {
   "product_name": null,
   "company":"apple"
 }
 POST products/_doc/2
 {
   "product_name": [],
   "company":"apple"
  }

让我们查询并检查我们得到的结果:

  POST products/_search
  {
    "query": {
      "match": {
        "product_name": "NULL"
      }
    }
  }

上面的搜索结果为:

`
 {
   "took": 1009,
   "timed_out": false,
   "_shards": {
     "total": 1,
     "successful": 1,
     "skipped": 0,
     "failed": 0
   },
    "hits": {
      "total": {
        "value": 1,
        "relation": "eq"
      },
      "max_score": 0.2876821,
      "hits": [
        {
          "_index": "products",
          "_id": "1",
          "_score": 0.2876821,
          "_source": {
            "product_name": null,
            "company": "apple"
          }
        }
      ]
    }
  }
`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

什么??? 为什么 Elasticsearch 只返回一个文档而不返回第二个具有空数组的文档? 因为,

  • 一个空数组不包含明确的 null,因此不会被 null_value 替换。

此外,product_name 值仅作为 null 而不是作为在索引映射中设置的 NULL。 因为,

  • null_value 只影响数据的索引方式,它不会修改 _source 文档。

现在,当 product_name 为 null 或空数组时,如何将两个文档都放入结果中?

选项2:使用 MUST_NOT 查询

让我们定义没有 null_value 的索引映射和与上面相同的索引文档。

 PUT products
 {
   "mappings": {
     "properties": {
       "product_name":{
         "type": "keyword"
       }
     }
   }
  }

现在你可以使用以下查询:

  POST products/_search
  {
    "query": {
      "bool": {
        "must_not": [
          {
            "exists": {
              "field": "product_name"
            }
          }
        ]
      }
    }
  }

上述查询的结果,它现在返回两个结果:

`
 {
   "took": 1,
   "timed_out": false,
   "_shards": {
     "total": 1,
     "successful": 1,
     "skipped": 0,
     "failed": 0
   },
    "hits": {
      "total": {
        "value": 2,
        "relation": "eq"
      },
      "max_score": 0,
      "hits": [
        {
          "_index": "products",
          "_id": "1",
          "_score": 0,
          "_source": {
            "product_name": null,
            "company": "apple"
          }
        },
        {
          "_index": "products",
          "_id": "2",
          "_score": 0,
          "_source": {
            "product_name": [],
            "company": "apple"
          }
        }
      ]
    }
  }
`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

将 must_not 与 exists 查询一起使用的优点:

  • 此选项 2 不依赖于字段的数据类型,无论字段的数据类型如何,它都会起作用,但选项 1 null_value 需要与字段的数据类型相同。 例如,长字段不能有字符串 null_value。
  • 选项 1 不适用于文本类型的字段,因为 Elasticsearch 不允许为文本类型的字段设置 null_value 参数。
  • 选项 2 也是单一且高效的解决方案,因为 1) 它不需要根据字段映射中定义的值添加 null 值的开销。2)索引大小也会变小,导致索引变少,搜索查询变快。

以上就是详解如何在Elasticsearch中搜索空值的详细内容,更多关于Elasticsearch搜索空值的资料请关注脚本之家其它相关文章!

相关文章

  • python中jieba库(中文分词库)使用安装教程

    python中jieba库(中文分词库)使用安装教程

    这篇文章主要介绍了python中jieba库(中文分词库)使用安装教程,jieba库是通过中文词库的方式来识别分词的。它首先利用一个中文词库,通过词库计算汉字之间构成词语的关联概率,所以通过计算汉字之间的概率,就可以形成分词的结果,需要的朋友可以参考下
    2023-04-04
  • 详解Spring Boot实战之Rest接口开发及数据库基本操作

    详解Spring Boot实战之Rest接口开发及数据库基本操作

    本篇文章主要介绍了Spring Boot实战之Rest接口开发及数据库基本操作,具有一定的参考价值,有兴趣的可以了解一下
    2017-07-07
  • java实现Api接口加密通信方式

    java实现Api接口加密通信方式

    这篇文章主要介绍了java实现Api接口加密通信方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 一文带你了解SpringBoot的启动原理

    一文带你了解SpringBoot的启动原理

    大家通常只需要给一个类添加一个@SpringBootApplication 注解,然后再加一个main 方法里面固定的写法 SpringApplication.run(Application.class, args);那么spring boot 到底是如何启动服务的呢,接下来咱们通过源码解析,需要的朋友可以参考下
    2023-05-05
  • Springboot整合Flowable6.x导出bpmn20的步骤详解

    Springboot整合Flowable6.x导出bpmn20的步骤详解

    这篇文章主要介绍了Springboot整合Flowable6.x导出bpmn20,Flowable流程引擎可用于部署BPMN 2.0流程定义,可以十分灵活地加入你的应用/服务/构架,本文给出两种从flowable导出流程定义bpmn20.xml的方式,需要的朋友可以参考下
    2023-04-04
  • java中Class.forName方法的作用详解

    java中Class.forName方法的作用详解

    Class.forName(xxx.xx.xx) 返回的是一个类,但Class.forName方法的作用到底是什么終?下面这篇文章就来给大家详细介绍了关于java中Class.forName方法的作用,文中介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-06-06
  • SpringMVC整合mybatis实例代码

    SpringMVC整合mybatis实例代码

    MyBatis 的前身就是 iBatis 。是一个数据持久层(ORM)框架。下面通过本文给大家介绍SpringMVC整合mybatis实例代码,感兴趣的朋友一起学习吧
    2016-05-05
  • springboot 设置server.port不生效的原因及解决

    springboot 设置server.port不生效的原因及解决

    这篇文章主要介绍了springboot 设置server.port不生效的原因及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 使用java实现猜拳小游戏

    使用java实现猜拳小游戏

    这篇文章主要为大家详细介绍了使用java实现猜拳小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • java实现的汉字转五笔功能实例

    java实现的汉字转五笔功能实例

    这篇文章主要介绍了java实现的汉字转五笔功能,结合具体实例形式分析了java基于字符串遍历与编码转换等操作实现五笔编码获取的相关操作技巧,需要的朋友可以参考下
    2017-06-06

最新评论