lucene 如何过滤掉ElasticSearch中不存在的字段?

kmbjn2e3  于 2022-11-07  发布在  Lucene
关注(0)|答案(4)|浏览(352)

我想检查一个字段是否存在,并返回不存在的文档的结果。我正在使用Golang库Elastic:https://github.com/olivere/elastic
我尝试了以下方法,但不起作用:

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

agyaoht71#

好的,我不会深入研究你的语言查询API。因为你想搜索一个不存在的字段(空),所以在must_not中使用一个exists过滤器(如果你使用bool过滤器的话):

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

希望这对你有帮助!
谢谢

wyyhbhjk

wyyhbhjk2#

您可以将exist querybool query must_not搭配使用:

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

在ElasticSearch6.5中测试

h79rfbju

h79rfbju3#

您可以为not exists创建一个布尔查询,如下所示:

existsQuery := elastic.NewExistsQuery(fieldName)
existsBoolQuery := elastic.NewBoolQuery().MustNot(existsQuery)
soat7uwm

soat7uwm4#

我不会试图提供一个完整的解决方案,因为我并不真正熟悉您使用的库(或者,实际上,Go语言)。
然而,Lucene并不支持这里的纯否定查询。Lucene需要被告知 * 要 * 匹配什么。像这样的否定严格地用于禁止搜索结果,但并不隐式地匹配其他所有内容。
为了执行您正在查找的操作,您可能希望使用布尔查询将not filter与match all(我看到的是available in the library)组合在一起。
注意:与任何时候使用“全部匹配”一样,性能可能会受到影响。

相关问题