如何过滤掉弹性搜索中不存在的字段?

6 lucene search filtering go elasticsearch

我想检查字段是否存在,并返回不存在的文档的结果.我正在使用Golang库Elastic:https://github.com/olivere/elastic

我尝试了以下但它不起作用:

__CODE__

use*_*217 9

好的,我不会深入你的语言查询API.由于您要搜索不存在的字段(null),请exists在a中使用过滤器must(如果使用bool过滤器):

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must_not": [
            {
              "exists": {
                "field": "your_field"
              }
            }
          ]
        }
      }
    }
  },
  "from": 0,
  "size": 500
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

谢谢


Thi*_*cao 6

您可以使用带有bool 查询 must_not 的存在查询

GET /_search
{
    "query": {
        "bool": {
            "must_not": {
                "exists": {
                    "field": "your_field"
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在 Elasticsearch 6.5 中测试


fem*_*gon 1

我不会尝试提供完整的解决方案,因为我不太熟悉您使用的库(或者实际上是 go 语言)。

然而,Lucene 不支持像这里一样的纯否定查询。Lucene 需要被告知匹配什么。像这样的否定严格禁止搜索结果,但不会隐式匹配其他所有内容。

为了执行您正在寻找的操作,您需要使用布尔查询将您的非过滤器与全部匹配(我看到在库中可用)结合起来。

注意:与任何时候使用 match all 一样,性能可能会受到影响。