Solr SpellCheck 应用

标签: solr spellcheck 应用 | 发表时间:2015-10-27 14:54 | 作者:lzzy_alex
出处:http://www.iteye.com

文章目标

通过对各类型的SpellCheck组件学习,完成项目拼写检查功能。本文使用基于拼写词典的实现方式,solr版本为5.3.0。

 

SpellCheck 简述

拼写检查是对用户错误输入,响应正确的检查建议。比如输入:周杰轮,响应:你是不是想找 周杰伦 ? Solr的拼写检查大致可分为两类,基于词典与基于Solr索引。

 

基于词典的拼写检查

FileBasedSpellChecker是基于外部,自定义的拼写文件(spelling.txt)作为拼写词典,通过 n-gram与Levenshtein distance算法,生成独立的拼写索引文件,与Solr主索引无关。配置方式也非常简单,可分为以下两个步骤:

 

一:配置拼写组件(solrconfig.xml ):

<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
  <lst name="spellchecker">
   <str name="classname">solr.FileBasedSpellChecker</str>
   <str name="name">file</str>
   <!--词典文件(solr.home/conf/spellings.txt),为演示先在文件中添加”周杰伦”-->
   <str name="sourceLocation">spellings.txt</str>
   <str name="characterEncoding">UTF-8</str>
   <!--基于spellings.txt文件生成的拼写索引目录-->
   <str name="spellcheckIndexDir">./spellcheckerFile</str>
  </lst>
</searchComponent>

 

二:将组件添加requestHandler 中:

<requestHandler name="/spell" class="solr.SearchHandler" startup="lazy">
 <lst name="defaults">
    <str name="spellcheck.dictionary">file</str>
    <str name="spellcheck.count">10</str>
  </lst>
  <arr name="last-components">
    <str>spellcheck</str>
  </arr>
</requestHandler>

访问  core1/spell?spellcheck=true&spellcheck.build=true&spellcheck.q=周杰轮

Note: 参数spellcheck.build=true代表马上生成拼写索引,该操作会基于spelling.txt文件生成词典索引,是需要消耗时间的,所以正常的拼写请求不应该用它。

<lst name="spellcheck">
  <lst name="suggestions">
   <lst name="周杰轮">
    <int name="numFound">1</int>
    <int name="startOffset">0</int>
    <int name="endOffset">3</int>
    <arr name="suggestion">
     <str>周杰伦</str>
    </arr>
   </lst>
  </lst>
</lst>

 

基于索引的拼写检查

基于Solr索引(Terms)生成相关的拼写检查建议,不依赖外部拼写文件,拼写建议也可以与索引同步更新。实现方式有以下两种:

 

IndexBasedSpellCheck

 

基于当前Solr索引,生成一份并行的拼写索引。可使用CopyField将Solr索引中的某些域(如Title, Body)连接起来,构成一个拼写建议域。

<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
  <lst name="spellchecker">
   <str name="classname">solr.IndexBasedSpellChecker</str>
   <str name="spellcheckIndexDir">./spellchecker</str>
   <str name="field">content</str>
   <str name="buildOnCommit">true</str>
  </lst>
</searchComponent>

classname:                    实现类名称,缺省就是solr.IndexBasedSpellChecker

spellcheckIndexDir:      拼写索引所在目录

field:                             索引中的拼写建议域, 应避免使用过多的语言处理(近义词,提干)

buildOnCommit:          是否将Solr索引的每次commit更新到拼写索引中

组件配置完成后,与上例一样,将它添加到requestHandler中就可以使用了。

 

DirectSolrSpellChecker

直接使用Solr 索引做拼写建议,从而避免在使用IndexBasedSpellChecker时对拼写索引的重复构建,确保拼写建议总是最新的。

<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
  <lst name="spellchecker">
   <str name="name">default</str>
   <str name="field">content</str>
   <str name="classname">solr.DirectSolrSpellChecker</str>
   <str name="distanceMeasure">internal</str>
   <float name="accuracy">0.5</float>
   <int name="maxEdits">2</int>
   <int name="minPrefix">1</int>
   <int name="maxInspections">5</int>
   <int name="minQueryLength">4</int>
   <float name="maxQueryFrequency">0.01</float>
   <float name="thresholdTokenFrequency">.01</float>
  </lst>
</searchComponent>

field:拼写建议域,应避免使用过多的语言处理(近义词,提干),通常使用CopyFiled实现

distanceMeasure:匹配的度量标准,internal表示采用编辑距离(Levenshtein)描述匹配程度,编辑距离越小,两个串的相似度越大。

accuracy:因为是共用Solr索引,为避免SpellCheck与正常用户查询冲突而导致性能问题,使用accuracy设置有效建议的临界值,保证冲突发生时对拼写检查的访问频度。

maxEdits:最大编辑(容错)距离,即可接受的错字拼写范围,值只能是1或2(因为很少有人会连续打错2个以上的字),缺省是2。

minPrefix:Terms应该共享的最小字符个数,只有满足条件的Term才会被列入建议范围。

maxInspections:对可能命中的结果进行校验的最大数目,缺省是5条。

minQueryLength:最小查询长度,小于则不触发查询请求,缺省是4。

maxQueryFrequency:约束Term至少应该在N篇文档中出现,才有资格成为建议目标。可以使用百分比(如 .01,1%),或数值(如4)。

thresholdTokenFrequency:Term在文档集中出现的的最少次数,只有满足条件的Term才会列入建议范围。可以使用百分比或绝对数值表示。

 

Warm: 测试中对已分词(Tokenizer by mmseg4j)的中文域做拼写检查效果并不理想,只有使用原生态的域(type=string)才能出现拼写效果,可这样有违初衷,尤其在使用copyfield对长文本域(如描述)关联时。如果大家有解决的方法,请告知。

 

参阅资料

编辑距离http://baike.baidu.com/view/2020247.html

apache-solr-ref-guide-5.3.pdf



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [solr spellcheck 应用] 推荐:

Solr SpellCheck 应用

- - 开源软件 - ITeye博客
通过对各类型的SpellCheck组件学习,完成项目拼写检查功能. 本文使用基于拼写词典的实现方式,solr版本为5.3.0. SpellCheck 简述. 拼写检查是对用户错误输入,响应正确的检查建议. 比如输入:周杰轮,响应:你是不是想找 周杰伦. Solr的拼写检查大致可分为两类,基于词典与基于Solr索引.

Solr Facet技术的应用与研究

- - 美团技术团队
在 《搜索引擎关键字智能提示的一种实现》一文中介绍过,美团的CRM系统负责管理销售人员的门店(POI)和项目(DEAL)信息,提供统一的检索功能,其索引层采用的是SolrCloud. 在用户搜索时,如果能直观地给出每个品类的POI数目,各个状态的DEAL数目,可以更好地引导用户进行搜索,进而提升搜索体验.

html5全局属性spellcheck

- Stanley - Designsor
不多说,截图看一下说明问题:. 设置元素的这个属性为false即可关闭拼写检查:. 默认为true值,如果设置为readonly或者disabled,则默认为false. 除了ie之外,ff,chrome,safari,opera都支持~. 经常有产品或者测试问我这货是什么,这次你们都知道怎么和他们解释了吧,你妹的…….

Lucene5学习之SpellCheck拼写纠错

- - ITeye博客
        最近有点累,让这篇又姗姗来迟了,各位不好意思,让你们久等了. 趁着周末一个人没什么事,继续Lucene5系列的脚步,今天主题是Suggest模块下另一个功能:拼写纠错. 大家还是看图吧,这样会比较形象:.        看完上面两张图片,我想大家应该已经知道SpellCheck是用来解决问题的了吧.

Solr DocValues详解

- - 企业架构 - ITeye博客
什么是docValues. docValues是一种记录doc字段值的一种形式,在例如在结果排序和统计Facet查询时,需要通过docid取字段值的场景下是非常高效的. 为什么要使用docValues. 这种形式比老版本中利用fieldCache来实现正排查找更加高效,更加节省内存. 倒排索引将字段内存切分成一个term列表,每个term都对应着一个docid列表,这样一种结构使得查询能够非常快速,因为term对应的docid是现成就有的.

solr的使用

- - Web前端 - ITeye博客
solr的原理不和大家一一讲述,主要讲solr在使用过程中的注意事项.  首先是安装solr,安装步骤省略. (不要说我懒,安装步骤导出都是. 成功之后 需要在solr里面建立一个针对你的业务的服务,我想建立一个叫做discuz的服务. 然后你在你的solr目录 :solr-5.5.3/server/solr/  下看见了discuz   ,这是你刚刚创建的,针对某一业务的整个搜索配置都是在这个目录下配置的.

Solr调优参考

- - 淘宝网通用产品团队博客
共整理三部分,第一部分Solr常规处理,第二部分针对性性处理,前者比较通用,后者有局限性. 务必根据具体应用特性,具体调节参数,对比性能. 具体应用需要全面去把控,各个因素一起起作用. 第一部分. E文连接 http://wiki.apache.org/solr/SolrPerformanceFactors.

Solr之缓存篇

- - 淘宝网综合业务平台团队博客
Solr在Lucene之上开发了很多Cache功能,从目前提供的Cache类型有:. 而每种Cache针对具体的查询请求进行对应的Cache. 本文将从几个方面来阐述上述几种Cache在Solr的运用,具体如下:. (1)Cache的生命周期. (2)Cache的使用场景. (3)Cache的配置介绍.

Solr主从备份

- - 研发管理 - ITeye博客
SOLR复制模式,是一种在分布式环境下用于同步主从服务器的一种实现方式,因之前提到的基于rsync的SOLR不同方式部署成本过高,被SOLR1.4版本所替换,取而代之的就是基于HTTP协议的索引文件传输机制,该方式部署简单,只需配置一个文件即可. 以下讲解具体操作步骤: . 步骤分主服务器和从服务器,允许有多个从服务器,即从服务器的配置一样.