在弹性搜索中搜索具有空/空对象字段的文档

Posted

技术标签:

【中文标题】在弹性搜索中搜索具有空/空对象字段的文档【英文标题】:search document with null/empty object field in elasticsearch 【发布时间】:2020-01-30 16:01:59 【问题描述】:

我有一个带有以下映射的弹性搜索索引,一些文档包含状态为 id:1, status:"failed" 的对象,有些为空,似乎无法找到一种方法来搜索具有“状态”的文档。 name" as ["failed", "null", "passed"] (其中任一状态为失败、通过或未设置/null 的文档)。例如,像下面这样进行术语查询会给出空结果集


"name":
"type":"keyword"

 "status": 
                "properties": 
                    "id": 
                        "type": "integer"
                    ,
                    "status": 
                        "type": "keyword"
                    
                
            

查询已尝试:


"terms": 
  "status.name": [  "failed", "null" ]
   

还尝试将status.name的映射设置为"null_value": "null"

【问题讨论】:

【参考方案1】:

使用仅包含 should 子句的 bool 查询,要求至少有一个查询必须匹配。您可以通过将exists-query 放入bool-query 的must_not-子句中来查询没有字段或在该字段中具有空值的文档(请参阅Elasticsearch 参考:Exists-query)。

GET myindex/_search

  "query": 
    "bool": 
      "should": [
        "term": "status.name": "value": "failed",
        "term": "status.name": "value": "passed",
        "bool": "must_not": "exists": "field": "status.name"
      ]
    
  

【讨论】:

不要在“status.name”上做exists,它应该只在“status”(对象)上,否则会得到空/非预期的结果结果

以上是关于在弹性搜索中搜索具有空/空对象字段的文档的主要内容,如果未能解决你的问题,请参考以下文章

弹性搜索:索引具有空值的日期字段

为啥 mongoosastic 填充/弹性搜索没有填充我的参考资料之一?我得到一个空对象

为啥 mongoosastic 填充/弹性搜索没有填充我的参考资料之一?我得到一个空对象

Elasticsearch:过滤具有空geo_point值的文档

使用and条件在mongodb文档的嵌套对象中搜索特定字符串

从文本字段中提取空数据。表已填充,但无法检索对象。 Java/JavaFX