`
lzzy_alex
  • 浏览: 29045 次
社区版块
存档分类
最新评论

Solr SpellCheck 应用

    博客分类:
  • Solr
 
阅读更多

文章目标

通过对各类型的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

分享到:
评论

相关推荐

    SOLR的应用教程

    3.1.1 Solr的应用模式 29 3.1.2 SOLR的使用过程说明 30 3.2 一个简单的例子 30 3.2.1 Solr Schema 设计 30 3.2.2 构建索引 30 3.2.3 搜索测试 31 3.3 搜索引擎的规划设计 32 3.3.1 定义业务模型 32 3.3.2 定制索引...

    solr开发应用教程

    Solr 3.5开发应用教程,偏实战

    solr简单应用操作的代码部分

    solr简单应用操作的代码部分,要20个字说些什么呢,体验到了出教程很麻烦啊

    开源企业搜索引擎SOLR的应用教程

    开源企业搜索引擎SOLR的应用教程 Apache Solr 是一个开源的搜索服务器,Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。定制 Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述...

    Solr 样例应用程序:j-solr1.zip

    Solr 样例应用程序:j-solr1.zip

    开源企业搜索引擎SOLR的应用教程.pdf

    开源企业搜索引擎SOLR的应用教程, Apache Solr 是一个开源的搜索服务器,Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。定制 Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述...

    solr 查询应用

    solr 查询应用solr 查询应用

    solr简单应用操作 (一)

    solr的简单应用和讲解操作,看书和查资料完成的。

    开源企业搜索引擎SOLR的 应用教程

    开源企业搜索引擎SOLR的 应用教程 讲解原理和使用

    开源企业搜索引擎SOLR的应用教程.doc

    可以看一下,加深了解.开源企业搜索引擎SOLR的应用教程,配合源程序有助于你们的使用。

    Solr技术培训资料(基础知识+高级应用)。

    这是我整理的关于Solr的技术培训资料,它包含了关于Solr的基础知识和高级应用,例如分组、分词器、权重等问题,因为本人在学习solr时发现资源太少,所以整理了一些,当然由于本人技术不足,难免知识点不够全面,有...

    Solr 3.5开发应用教程.pdf

    Apache Solr 是一个开源的搜索服务器,Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache ...定制 Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述所有 Field 及其内容的 XML 文档就可以了。

    solr企业应用

    此文档很好的介绍了solr,以及solr应用的技术,以及分词等很多内容。

    solr3.5配置及应用

    初学者学习solr时,可以借助此文档入门,学习solr

    solr.war包solr.war包solr.war包solr.war包solr.war包

    solr.warsolr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包...

    Solr3.5开发应用指导

    基于Solr3.5的最新开发应用指导,文字加代码说明模式(Schedule.xml)、配置(solrconfig.xml)、索引,搜索等详细开发内容。

    开源企业搜索引擎Solr的应用教程.doc

    适合于对数据库驱动的应用数据进行索引,尤其是替代传统的like ‘%expression%’来实现对varchar或clob等字段的索引,对于实现站内搜索是一种值得采纳的方案。但在分布式处理、接口封装上尚需要自己进行一定程度的...

Global site tag (gtag.js) - Google Analytics