如何过滤掉弹性搜索中不存在的字段?
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 query和bool query must_not:
GET /_search
{
"query": {
"bool": {
"must_not": {
"exists": {
"field": "your_field"
}
}
}
}
}
在Elasticsearch 6.5中测试过
以上是关于如何过滤掉弹性搜索中不存在的字段?的主要内容,如果未能解决你的问题,请参考以下文章