文章目标
通过对各类型的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
相关推荐
这些jar包在特定场景下会发挥重要作用,例如solr-clustering.jar提供了集群和导航功能,solr-spellcheck.jar支持拼写检查。 对于描述中提到的"版本统一",这意味着所有的jar包应为同一版本的Solr发布。这是因为不同...
综上所述,Apache Solr不仅是一个强大的搜索平台,而且通过其丰富的API和灵活的配置选项,能够很好地满足复杂的应用场景需求。在Java开发环境下,利用Solr进行高效的搜索服务构建是完全可行且易于实现的。
Solr 7官方文档是关于Apache Solr 7版本的详尽指南,它是一个高度可扩展、高性能的全文搜索引擎服务器,广泛应用于企业级搜索场景。Solr基于Java开发,能够处理大量的索引和查询请求,并提供了丰富的功能来满足各种...
Apache Solr 是一款开源的全文检索搜索引擎平台,广泛应用于企业级搜索场景中。本篇笔记主要基于一个Java类`SolrSaoImpl`来探讨Solr的集成与使用,特别是如何通过Java API进行Solr服务器的交互。 #### 二、...
《IK Analyzer与Solr 7.2.1的整合及中文分词实践》 IK Analyzer是一款优秀的开源中文分词器,特别适用于Java环境下。在信息检索、文本挖掘等领域...在实际应用中,我们还应根据业务需求持续优化词库,以提升用户体验。
- **拼写检查与自动补全(Spellcheck & Autocomplete)**: Solr 提供了拼写纠正功能,以及基于倒排索引的自动补全服务,提升用户输入体验。 - **分布式搜索(Distributed Search)**: 对于大规模数据,Solr 支持...
此外,Solr 还提供了丰富的查询语法,如 Faceting、Highlighting、Spellcheck 和更多高级搜索特性,使其成为搭建企业级搜索引擎的首选工具。 总的来说,Solr 虽然基于 Lucene,但它提供了更完整的解决方案,包括...
- **Solr**、**Elasticsearch**、**Zoie**、**BoCo**等:基于Lucene开发的搜索引擎解决方案,各有特色。 - **Sphinx**:一款高性能的全文检索引擎,适用于大数据量的实时搜索。 - **Xapian**:一种高度可扩展的全文...