我有一套文件,例如
{ tags:['a','b','c'] // ... a bunch properties }
如标题中所述:是否可以使用Nest过滤包含给定标签的所有文档?
例如,上面的记录将匹配[‘c’,’d’]
还是应该手动构建多个“ OR”?
编辑:下面的位集可能是有趣的读物,但答案本身有点过时。 其中一些功能在2.x中有所变化。Slawek还在另一个答案中指出,terms在这种情况下,查询是使搜索干燥的一种简便方法。最后重构为当前最佳实践。—nz
terms
您可能需要带有子句的Bool查询(或更可能是Filter与另一个查询一起)should。
should
该布尔查询有三个主要属性:must,should,和must_not。这些中的每一个都接受另一个查询或查询数组。子句名称是不言自明的;在您的情况下,该should子句可以指定一个列表过滤器,与其中任何一个匹配项将返回您要查找的文档。
must
must_not
从文档:
在没有must子句的布尔查询中,一个或多个should子句必须与文档匹配。可以使用minimum_should_match参数设置应匹配的最少应子句数。
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
bool
should``minimum_should_match
这是最后一个查询的重构:
{ "filtered": { "query": { "match": { "title": "hello world" } }, "filter": { "terms": { "tag": [ "c", "d" ], "minimum_should_match": 1 } } } }