一尘不染

过滤哪个数组包含任何给定值的项目

elasticsearch

我有一套文件,例如

{
    tags:['a','b','c']
    // ... a bunch properties
}

如标题中所述:是否可以使用Nest过滤包含给定标签的所有文档?

例如,上面的记录将匹配[‘c’,’d’]

还是应该手动构建多个“ OR”?


阅读 231

收藏
2020-06-22

共1个答案

一尘不染

编辑:下面的位集可能是有趣的读物,但答案本身有点过时。
其中一些功能在2.x中有所变化。Slawek还在另一个答案中指出,terms在这种情况下,查询是使搜索干燥的一种简便方法。最后重构为当前最佳实践。—nz

您可能需要带有子句的Bool查询(或更可能是Filter与另一个查询一起)should

该布尔查询有三个主要属性:mustshould,和must_not。这些中的每一个都接受另一个查询或查询数组。子句名称是不言自明的;在您的情况下,该should子句可以指定一个列表过滤器,与其中任何一个匹配项将返回您要查找的文档。

从文档:

在没有must子句的布尔查询中,一个或多个should子句必须与文档匹配。可以使用minimum_should_match参数设置应匹配的最少应子句数。

这是一个独立的Bool查询的示例:

{
  "bool": {
    "should": [
      { "term": { "tag": "c" }},
      { "term": { "tag": "d" }}
    ]
  }
}

这是该布尔查询作为另一个通用过滤查询中的过滤器的另一个示例:

{
  "filtered": {
    "query": {
      "match": { "title": "hello world" }
    },
    "filter": {
      "bool": {
        "should": [
          { "term": { "tag": "c" }},
          { "term": { "tag": "d" }}
        ]
      }
    }
  }
}

使用Bool作为查询(例如,影响比赛的得分)还是将其用作过滤器(例如,减少随后被得分或后过滤的命中),这取决于您的要求。

通常最好使用Bool代替Or
Filter
,除非您有使用And / Or /
Not的理由(确实存在此类理由)。Elasticsearch博客提供了有关每种实现的更多信息,并提供了有关何时可能更喜欢Bool而不是And / Or /
Not(反之亦然)的好示例。

Elasticsearch博客:关于Elasticsearch过滤器位集的所有信息

使用重构的查询进行更新…

现在,所有的 出的方式,terms查询是以上所有的机版本。对于引擎盖下的查询类型,它做的是正确的事情,其行为与使用选项的bool+
相同,并且总体而言更为简洁。should``minimum_should_match

这是最后一个查询的重构:

{
  "filtered": {
    "query": {
      "match": { "title": "hello world" }
    },
    "filter": {
      "terms": {
        "tag": [ "c", "d" ],
        "minimum_should_match": 1
      }
    }
  }
}
2020-06-22