首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Lucene+Solr+ElasticSearch查询匹配优化

Lucene+Solr+ElasticSearch查询匹配优化

作者头像
我是攻城师
发布2018-05-14 16:24:53
1.2K0
发布2018-05-14 16:24:53
举报
文章被收录于专栏:我是攻城师我是攻城师

当我们在处理搜索业务时候,需求往往是灵活多变的,有时候我们需要精确匹配,有时候我们又需要全文检索,而有时候,我们又想匹配度高而且还能全文检索,这似乎是精确匹配和模糊匹配一个妥协的策略,没错这就是搜索引擎出现的目的,以往的数据库是没法解决这种问题的,数据库只能回答有,没有,存在,不存在,并不能在有和没有之间做一个完美的妥协,比如说能把最匹配最相关的结果放在topN,仅靠like模糊查询是解决不了这种问题的。 Apache Lucene这个强大的全文检索核心包,提供了搜索引擎的核心组件,通过相关性评分算法(VSM/BM25),出色的了解决了相关性匹配问题,当然Solr和ElasticSearch构建在Lucene之上,自然也继承了这种优秀的能力。 默认情况下,Lucene/Solr/ES的Boolean查询有三种查询策略: (1)必须匹配 -> must (2)必须不匹配 -> mustn't (3)至少匹配一个 ->should 除此之外,对于分词字段,我们还可以通过 最小匹配查询(Minimum Should Match)来灵活控制查询策略 举个例子: 北京奇虎科技有限公司 使用IK最细粒度分词后内容:北京/奇虎/科技/有限公司/有限/有/限/公司 我们可以通过defType=edismax&mm=100%25来控制term最小命中的个数,下面来看下mm参数的详细解释: 语法一:mm=3 代表至少匹配3个term,不管总term有多少个,如果查询词分词后的term个数小于3,那么就以最小的这个term数为基准进行查询

语法二:-2 允许返回的结果里面,最多有2个不匹配term,其他的必须都匹配,这是一种反向用法

语法三:mm=75% 允许返回的结果里面,至少有75%匹配度,如果不能整除,则采取进一法来得到最小匹配个数,比如计算值=3.75,那么这个mm就等于3,如果等于0.6这个等于0

语法四:mm=-25% 反向设置,返回的结果里面最多有25%的不匹配

语法五:3<90% 如果一个字段分词后的term数,小于等于3,则要求全部匹配,如果大于3,则要求90%的匹配度

语法六:2<-25% 9<-3 小于2个term,要求全部匹配,如果是3-9个要求100%-25%=75%匹配,如果大于9个,则最多允许有3个不匹配term出现 情景1:查询北京奇虎+mm=3 能查询到北京奇虎科技有限公司 情景2:查询北京奇虎360+mm=3 不能查询到北京奇虎科技有限公司 情景3:查询北京奇虎360+mm=2 能查询到北京奇虎科技有限公司 情景4:查询北京奇虎360+mm=80%(3*80%=2.4=2) 能查询到北京奇虎科技有限公司 情景5:查询北京奇虎360+mm=-10%((3-3*0.1(减一法等0))=3)不能查询到北京奇虎科技有限公司 总结: 对于分词后term数少的,适合采用固定数进行查询限制优化查询 对于分词后term数多的,适合采用百分比进行查询限制优化 mm=0% 代表最少匹配查询词里面出现的任意一个term mm=100% 代表必须匹配查询词里面所有出现的term 大家可在自己的场景中,不断反复测试,以找到合适的阈值,从而避免查询结果集过大,有太多不相关的数据或者查询结果集偏小漏掉一些相关的数据。 参考资料: https://cwiki.apache.org/confluence/display/solr/The+DisMax+Query+Parser#TheDisMaxQueryParser-Themm(MinimumShouldMatch)Parameter https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-minimum-should-match.html

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 我是攻城师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档