我对Elasticsearch 2.3.1进行了以下查询:
{
"query": {
"bool": {
"must": {
"query": {
"multi_match": {
"query": "my search",
"type": "cross_fields",
"fields": ["field1^6", "field2", "field3^2", "field4"],
"operator": "and",
"zero_terms_query": "all"
}
}
}
},
"filter": {
"or": [{
"term": {
"pickup": true
}
}, {
"term": {
"local_delivery": true
}
}],
"and": [{
"term": {
"field5": true
}
}, {
"term": {
"field6": "my_value"
}
}]
}
}
}
}
此查询返回11K结果。如果我切换or和the的顺序如下:
{
"query": {
"bool": {
"must": {
"query": {
"multi_match": {
"query": "my search",
"type": "cross_fields",
"fields": ["field1^6", "field2", "field3^2", "field4"],
"operator": "and",
"zero_terms_query": "all"
}
}
}
},
"filter": {
"and": [{
"term": {
"field5": true
}
}, {
"term": {
"field6": "my_value"
}
}],
"or": [{
"term": {
"pickup": true
}
}, {
"term": {
"local_delivery": true
}
}]
}
}
}
}
我现在突然只有675个结果。
这些查询不应该完全相同吗?本质上我想过滤我的查询,使field5为true,field6为my_value。但我也希望拾取或local_delivery都是真的,所以:
(field5 == true && field6 == "my_value" || (pickup == true || local_delivery == true))
答案 0 :(得分:1)
使用bool查询可以解决此问题:
"filter": {
"bool": {
"should": [{
"term": {
"pickup": true
}
}, {
"term": {
"local_delivery": true
}
}],
"must": [{
"term": {
"field5": true
}
}, {
"term": {
"field6": "my_value"
}
}]
}
}