知方号

知方号

ES中must与filter的区别<检索与查询的区别>

ES中must与filter的区别

ES中must与filter的区别

Elasticsearch(下面简称ES)中的bool查询在业务中使用也是比较多的。在一些非实时的分页查询,导出的场景,我们经常使用bool查询组合各种查询条件。

Bool查询包括四种子句:

mustfiltershouldmust_not

1.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" }, ...

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。