为什么elasticsearch中的和/或与过滤器的排序有关?

时间:2017-08-18 14:55:44

标签: elasticsearch

我对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))

1 个答案:

答案 0 :(得分:1)

使用bool查询可以解决此问题:

"filter": {
    "bool": {
        "should": [{
            "term": {
                "pickup": true
            }
        }, {
            "term": {
                "local_delivery": true
            }
        }],
        "must": [{
            "term": {
                "field5": true
            }
        }, {
            "term": {
                "field6": "my_value"
            }
        }]
    }
}