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

时间:2015-03-30 22:02:20

标签: search go elasticsearch lucene filtering

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

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

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

4 个答案:

答案 0 :(得分:8)

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

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

希望这有帮助!

由于

答案 1 :(得分:0)

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

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

为了做你想要的事情,你会想要使用一个布尔查询来将你的过滤器与一个匹配全部(我看到的是available in the library)结合起来。

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

您可以将exist querybool query must_not结合使用:

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

在Elasticsearch 6.5中测试