我的过滤器分组在一起分类。 我想检索文档,其中文档可以匹配任何类别中的任何筛选器,但如果设置了两个(或更多)类别,则文档必须与所有类别中的任何筛选器匹配。如何在ElasticSearch中嵌套AND和OR过滤器?
如果用伪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语法。这是正确的轨道还是我需要使用另一个过滤器?
没有答案过滤这个问题:''或''''term''可以通过[terms]更容易完成(http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-terms- filter.html)。而[bool](http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-bool-filter.html)的默认值是''和''。 “filter.bool.must:[{terms:progress:[”incomplete“,”complete“]}}。 {terms:paid:[“yes”,“no”]}]''可能会工作吗? – cfrick
嵌套查询/过滤器用于数组/列表(取决于您熟悉的语言,例如'a = [{'b':1},{'c':2}])''。你能写一个你的文件的例子吗?这将有助于 – Diolor
cfrick带领我走上正确的道路。我在“和”过滤器中嵌入了一堆“条款”过滤器,它似乎满足我的需求。 – MHTri