Lucene+Solr+ElasticSearch查询匹配优化

原创 2016年06月02日 10:53:48
当我们在处理搜索业务时候,需求往往是灵活多变的,有时候我们需要精确匹配,有时候我们又需要全文检索,而有时候,我们又想匹配度高而且还能全文检索,这似乎是精确匹配和模糊匹配一个妥协的策略,没错这就是搜索引擎出现的目的,以往的数据库是没法解决这种问题的,数据库只能回答有,没有,存在,不存在,并不能在有和没有之间做一个完美的妥协,比如说能把最匹配最相关的结果放在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 

Solr vs Elasticsearch vs Lucene

最近看到有一个客户他们用的是Elasticsearch, 说实话,本人对Elasticsearch之前了解的比较少,准确地说,对“搜索引擎”这块了解的比较少。今天就各种搜索,收集了一些“搜索引擎”相关...
  • Post_Yuan
  • Post_Yuan
  • 2017年02月27日 17:32
  • 1712

Lucene/Solr/ElasticSearch搜索问题案例分析

最近收集的两个搜索的case,如下:  案例一:  使用 A关键词:“中国诚通控股公司”搜索,不能搜到 B结果“中国诚通控股集团有限公司”  从关键词字面上看,确实不应该出现这种问题...
  • u010454030
  • u010454030
  • 2016年06月23日 18:13
  • 760

lucene、solr、nutch三者的关系

lucene是一个做搜索用的类库。 nutch和solr都是基于lucene的,二者都是可直接运行的应用程序; 直接在业务上使用lucene的倒是不太多见。   solr主要提供了建立索引(用户可以直...
  • matthewei6
  • matthewei6
  • 2016年01月30日 11:24
  • 3456

Solr 和 ElasticSearch 对比

实时搜索 elasticsearch vs solr oyhk学习笔记 什么是ElasticSearch? ElasticSearch是基于rest风格,分布式搜索引擎,非常优秀的luc...
  • AlvinNoending
  • AlvinNoending
  • 2015年05月06日 11:58
  • 7844

搜索引擎选择: Elasticsearch与Solr

搜索引擎选择: Elasticsearch与Solr 搜索引擎选型调研文档 Elasticsearch简介* Elasticsearch是一个实时的分布式搜索和分析引擎。它可以帮助你...
  • xwq911
  • xwq911
  • 2016年06月12日 19:53
  • 2007

搜索引擎solr和elasticsearch

刚开始接触搜索引擎,网上收集了一些资料,在这里整理了一下分享给大家。一、关于搜索引擎搜索引擎(Search Engine)是指根据一定的策略、运用特定的计算机程序从互联网上搜集信息,在对信息进行组织和...
  • u013142781
  • u013142781
  • 2016年04月23日 10:19
  • 6830

elasticsearch与Lucene相关介绍

Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引...
  • sinat_27747695
  • sinat_27747695
  • 2017年08月20日 21:31
  • 428

Solr进阶之拼写纠错功能的实现基础拼音

思路: 1.当汉字个数小于等于三个汉字时,使用单个词库进行匹配(最大匹配法) 将汉字转为同音字,查询单个词库中的数据,选出音一样的词语列表,加上最小距离算法(保证至少一个汉字一样),得出一个列表,...
  • sqh201030412
  • sqh201030412
  • 2016年09月21日 12:45
  • 1203

solr入门之拼写纠错深入研究及代码Demo

昨天粗略的研究了下solr自身的拼写纠错功能,效果不是很好,今天继续研究了其中的依靠文件来纠错和主索引纠错的方式 =================== 文件加载方式 配置--      s...
  • sqh201030412
  • sqh201030412
  • 2016年04月01日 18:45
  • 2627

Lucene和Solr 学习目录

几个概念先行说明一下: Lucene: 是一个索引与搜索类库,而不是完整的程序。 Solr:是一个高性能,采用Java5开发,基于Lucene的一个独立的企业级搜索应用服务器,它对外提供类似于We...
  • liuweitoo
  • liuweitoo
  • 2012年10月29日 15:12
  • 17319
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Lucene+Solr+ElasticSearch查询匹配优化
举报原因:
原因补充:

(最多只允许输入30个字)