检索和过滤的区别 (query vs. filter)

1 filter与query示例1.1 准备测试数据PUT website/_doc/1{    "title": "小白学ES01",    "desc": "the first blog about es",    "level": 1,     "post_date": "2018-10-10",    "post_address": {        "country": "China",        "province": "GuangDong",        "city": "GuangZhou"    }}PUT website/_doc/2{    "title": "小白学ES02",    "desc": "the second blog about es",    "level": 3,    "post_date": "2018-11-11",    "post_address": {        "country": "China",        "province": "ZheJiang",        "city": "HangZhou"    }}1.2 搜索测试

搜索条件: 搜索博客等级(level)大于等于2, 同时发布日期(post_date)是2018-11-11的博客:

(1) 不使用filter:

GET website/_doc/_search{    "query": {        "bool": {            "must": [                { "match": { "post_date": "2018-11-11" } },                 { "range": { "level": { "gte": 2 } } }            ]        }    }}// 结果信息: "hits": {    "total": 1,    "max_score": 2.0,    "hits": [        {            "_index": "website2",            "_type": "blog",            "_id": "2",            "_score": 2.0,          // 评分为2.0            "_source": {                "title": "小白学ES02",                "desc": "the second blog about es",                "level": 3,                "post_date": "2018-11-11",                "post_address": {                    "country": "China",                    "province": "ZheJiang",                    "city": "HangZhou"                }            }        }    ]}

(2) 使用filter:

GET website/_doc/_search{    "query": {        "bool": {            "must": {                 "match": { "post_date": "2018-11-11" }            },             "filter": {                "range": { "level": { "gte": 2 } }            }        }    }}// 结果信息: "hits": {    "total": 1,    "max_score": 1.0,    "hits": [        {            "_index": "website2",            "_type": "blog",            "_id": "2",            "_score": 1.0,      // 评分为1.0            "_source": {                "title": "小白学ES02",                "desc": "the second blog about es",                "level": 3,                "post_date": "2018-11-11",                "post_address": {                    "country": "China",                    "province": "ZheJiang",                    "city": "HangZhou"                }            }        }    ]}2 filter与query的区别

filter和query一起使用时, 会先执行filter.

2.1 相关度处理上的不同

filter —— 只根据搜索条件过滤出符合的文档, 将这些文档的评分固定为1, 忽略TF/IDF信息, 不计算相关度分数;
query —— 先查询符合搜索条件的文档, 然后计算每个文档对于搜索条件的相关度分数, 再根据评分倒序排序.

建议:

  • 如果对搜索结果有排序的要求, 要将最匹配的文档排在最前面, 就用query;
  • 如果只是根据一定的条件筛选出部分数据, 不关注结果的排序, 就用filter.
     

2.2 性能上的对比

filter 性能更好, 无排序 —— 不计算相关度分数, 不用根据相关度分数进行排序, 同时ES内部还会缓存(cache)比较常用的filter的数据 (使用bitset <0或1> 来记录包含与否).

query 性能较差, 有排序 —— 要计算相关度分数, 要根据相关度分数进行排序, 并且没有cache功能.

2.3 对比结论

1) 业务关心的、需要根据匹配的相关度进行排序的搜索条件 放在 query 中;

2) 业务不关心、不需要根据匹配的相关度进行排序的搜索条件 放在 filter 中.

出处: 博客园 马瘦风的博客(https://www.cnblogs.com/shoufeng)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值