我的过滤器按类别分组.我想检索文档可以匹配类别中的任何过滤器的文档,但如果设置了两个(或更多)类别,则文档必须匹配所有类别中的任何过滤器.
如果用伪SQL编写,它将是:
SELECT * FROM Documents WHERE (CategoryA = 'A') AND (CategoryB = 'B' OR CategoryB = 'C')
我试过像这样的嵌套过滤器:
{ "sort": [{ "orderDate": "desc" }], "size": 25, "query": { "match_all": {} }, "filter": { "and": [{ "nested": { "path":"hits._source", "filter": { "or": [{ "term": { "progress": "incomplete" } }, { "term": { "progress": "completed" } }] } } }, { "nested": { "path":"hits._source", "filter": { "or": [{ "term": { "paid": "yes" } }, { "term": { "paid": "no" } }] } } }] } }
但显然我不太了解ES语法.这是在正确的轨道上还是我需要使用另一个过滤器?
这应该是它(从给定的伪SQL翻译)
{ "sort": [ { "orderDate": "desc" } ], "size": 25, "query": { "filtered": { "filter": { "and": [ { "term": { "CategoryA":"A" } }, { "or": [ { "term": { "CategoryB":"B" } }, { "term": { "CategoryB":"C" } } ] } ] } } } }
我意识到你并没有提到方面,只是为了完整起见:
您也可以使用a filter
作为基础(就像你一样)而不是filtered query
(像我一样).得到的json几乎完全相同,区别在于:
过滤后的查询将过滤主要结果以及构面
过滤器只会过滤主要结果而非过滤面.
最后,嵌套过滤器(您尝试使用)与您似乎相信的"嵌套过滤器"无关,但与嵌套文档(父子)的过滤有关