Elasticsearch(下面简称ES)中的bool查询在业务中使用也是比较多的。在一些非实时的分页查询,导出的场景,我们经常使用bool查询组合各种查询条件。
Bool查询包括四种子句:
mustfiltershouldmust_not1.must 文档 必须 匹配这些条件才能被包含进来。 相当于sql中的 and
2.must_not 文档 必须不 匹配这些条件才能被包含进来。 相当于sql中的 not
3.should 如果满足这些语句中的任意语句,将增加 _score ,否则,无任何影响。它们主要用于修正每个文档的相关性得分。 相当于sql中的or
4.filter 必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。
区别: must:返回的文档必须满足must子句的条件,并且参与计算分值 filter:返回的文档必须满足filter子句的条件。但是跟Must不一样的是,不会计算分值, 并且可以使用缓存 must和filter是一样的。区别是场景不一样。如果结果需要算分就使用must,否则可以考虑使用filter,使查询更高效。
下面两个语句,查询的结果是一样的。
使用filter过滤时间范围,
GET kibana_sample_data_ecommerce/_search{ "size": 1000, "query": { "bool": { "must": [ {"term": { "currency": "EUR" }} ], "filter": { "range": { "order_date": { "gte": "2023-01-25T23:45:36.000+00:00", "lte": "2023-02-01T23:45:36.000+00:00" } } } } }}使用must过滤时间范围,
GET kibana_sample_data_ecommerce/_search{ "size": 1000, "query": { "bool": { "must": [ {"term": { "currency": "EUR" }}, {"range": { "order_date": { "gte": "2023-01-25T23:45:36.000+00:00", "lte": "2023-02-01T23:45:36.000+00:00" } }} ] } }}查询的结果都是,
{ "took" : 25, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1087, "relation" : "eq" }, ...