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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何过滤掉弹性搜索中不存在的字段?相关的知识,希望对你有一定的参考价值。

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

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

e := elastic.NewExistsFilter("my_tag")
n := elastic.NewNotFilter(e)
filters = append(filters, n)
答案

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

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must_not": [
            {
              "exists": {
                "field": "your_field"
              }
            }
          ]
        }
      }
    }
  },
  "from": 0,
  "size": 500
}

希望这可以帮助!

谢谢

另一答案

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

但是,Lucene并不像你在这里那样支持纯粹的否定查询。 Lucene需要被告知要匹配什么。像这样的否定服务严格禁止搜索结果,但不会隐含地匹配其他所有内容。

为了做你想要的,你会想要使用一个布尔查询来组合你的非过滤器和一个匹配所有(我看到的是available in the library)。

注意:与任何时候使用全部匹配一样,性能可能会受到影响。

另一答案

您可以创建一个不存在的bool查询,如下所示:

existsQuery := elastic.NewExistsQuery(fieldName)
existsBoolQuery := elastic.NewBoolQuery().MustNot(existsQuery)
另一答案

你可以使用exist querybool query must_not

GET /_search
{
    "query": {
        "bool": {
            "must_not": {
                "exists": {
                    "field": "your_field"
                }
            }
        }
    }
}

在Elasticsearch 6.5中测试过

以上是关于如何过滤掉弹性搜索中不存在的字段?的主要内容,如果未能解决你的问题,请参考以下文章

应用聚合后过滤掉弹性搜索中的术语聚合桶

如何在弹性搜索的过滤器聚合中引用多个嵌套级别?

如何仅查询一种类型的记录的弹性搜索?

如何使用弹簧数据在弹性搜索多过滤器中查找

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

如何将配置单元映射到弹性搜索 _id 字段