elasticsearch – 过滤该数组包含任何给定值的项

我有一套文件

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

如标题所示:有没有办法使用Nest过滤包含任何给定标签的所有文档?

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

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

编辑:下面的bitset的东西可能是一个有趣的阅读,但答案本身有点过时。这些功能中的一些功能在2.x左右。另外,Slawek在另一个答案中指出,在这种情况下,术语查询是一种简单的方式来干预搜索。重新确定最终的最佳做法。 -nz

你可能想要一个Bool Query(或更多的可能是Filter和另一个查询),一个应用子句。

bool查询有三个主要属性:must,should和must_not。它们中的每一个都接受另一个查询或一组查询。条款名称是非常不言自明的;在你的情况下,should子句可以指定一个列表过滤器,一个匹配任何一个将返回您要查找的文档。

从文档:

In a boolean query with no must clauses, one or more should clauses must match a document. The minimum number of should clauses to match can be set using the minimum_should_match parameter.

以下是Bool查询的隔离示例:

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

另外这个Bool查询作为更通用的Filtered Query中的过滤器的另一个例子:

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

无论您是使用Bool作为查询(例如,影响比赛的得分),还是作为筛选器(例如,减少打入或后筛选的命中)都是主观的,具体取决于您的需求。

除非你有理由使用和/或不(存在这样的理由),通常最好使用Bool赞成Or Filter。 Elasticsearch博客有更多关于每个不同实现的信息,以及何时可能喜欢Bool over和/或/不,以及反之亦然。

Elasticsearch博客:All About Elasticsearch Filter Bitsets

更新与重构的查询…

现在,除了所有这些之外,查询条款是所有上述的DRYer版本。它对于在引擎盖下的查询类型是正确的,它的行为与bool应该使用minimum_should_match选项的行为相同,总体来说更加简洁。

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

{
  "filtered": {
    "query": {
      "match": { "title": "hello world" }
    },
    "filter": {
      "terms": {
        "tag": [ "c", "d" ],
        "minimum_should_match": 1
      }
    }
  }
}
http://stackoverflow.com/questions/28001632/filter-items-which-array-contains-any-of-given-values

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:elasticsearch – 过滤该数组包含任何给定值的项