solr拼写检查配置
拼写检查功能,能在搜索时,提供一个较好用户体验,所以,主流的搜索引擎都有这个功能。
那么什么是拼写检查,其实很好理解,就是你输入的搜索词,可能是你输错了,也有可能在它的检索库里面根本不存在这个词,但是这时候它能给你返回,相似或相近的结果来帮助你校正。
举个例子,假如你在百度里面输入在在线电瓶,可能它的索引库里面就没有,但是它有可能返回在线电影,在线电视,在线观看等等一些词,这些,就用到拼写检查的功能了。
solr是一个基于lucene开发接口实现的成熟的搜索系统,通过不同的控件(Component)实现不同的搜索功能,其中一个SpellCheckComponent实现了拼写检查功能。
要在搜索过程中添加拼写检查功能,必须在solr的solrconfig.xml中配置spellcheck控件,并在相关SearchHandler(select/query等)中添加拼写检查参数配置。
配置如下:
1 <!-- Spell Check 2 3 The spell check component can return a list of alternative spelling 4 suggestions. 5 6 http://wiki.apache.org/solr/SpellCheckComponent 7 --> 8 <searchComponent name="spellcheck" class="solr.SpellCheckComponent"> 9 10 <!-- 将输入关键词当做text_general类型进行处理 --> 11 <str name="queryAnalyzerFieldType">text_general</str> 12 13 <!-- Multiple "Spell Checkers" can be declared and used by this 14 component 15 --> 16 17 <!-- a spellchecker built from a field of the main index --> 18 <lst name="spellchecker"> 19 <!-- 拼写检查模块名 --> 20 <str name="name">default</str> 21 <!-- 对索引中的哪个字段进行拼写检查 --> 22 <str name="field">text</str> 23 <!-- 自定义拼写检查,可以用自定义拼写检查类代替默认类 --> 24 <str name="classname">solr.DirectSolrSpellChecker</str> 25 <!-- 拼写检查编辑距离, 默认使用internal levenshtein --> 26 <str name="distanceMeasure">internal</str> 27 <!-- minimum accuracy needed to be considered a valid spellcheck suggestion --> 28 <float name="accuracy">0.5</float> 29 <!-- 最大编辑距离,与输入字符串编辑距离小于等于2的字符串被检索出来作为纠错结果 --> 30 <int name="maxEdits">2</int> 31 <!-- 与输入字符串最少有一个字符相等,才能被检索出来 --> 32 <int name="minPrefix">1</int> 33 <!-- maximum number of inspections per result. 一次纠错探测最大数量 --> 34 <int name="maxInspections">5</int> 35 <!-- 纠错元词最小长度,元词长度小于4不进行纠错 --> 36 <int name="minQueryLength">4</int> 37 <!-- maximum threshold of documents a query term can appear to be considered for correction --> 38 <float name="maxQueryFrequency">0.01</float> 39 <!-- uncomment this to require suggestions to occur in 1% of the documents 40 <float name="thresholdTokenFrequency">.01</float> 41 --> 42 </lst> 43 44 <!-- a spellchecker that can break or combine words. 不同实现的拼写检查模块 --> 45 <lst name="spellchecker"> 46 <str name="name">wordbreak</str> 47 <str name="classname">solr.WordBreakSolrSpellChecker</str> 48 <str name="field">text</str> 49 <str name="combineWords">true</str> 50 <str name="breakWords">true</str> 51 <int name="maxChanges">10</int> 52 </lst> 53 54 <!-- 使用不同编辑距离的拼写检查模块 --> 55 <!-- 56 <lst name="spellchecker"> 57 <str name="name">jarowinkler</str> 58 <str name="field">spell</str> 59 <str name="classname">solr.DirectSolrSpellChecker</str> 60 <str name="distanceMeasure"> 61 org.apache.lucene.search.spell.JaroWinklerDistance 62 </str> 63 </lst> 64 --> 65 66 <!-- a spellchecker that use an alternate comparator 67 68 comparatorClass be one of: 69 1. score (default) 70 2. freq (Frequency first, then score) 71 3. A fully qualified class name 72 --> 73 <!-- 74 <lst name="spellchecker"> 75 <str name="name">freq</str> 76 <str name="field">lowerfilt</str> 77 <str name="classname">solr.DirectSolrSpellChecker</str> 78 <str name="comparatorClass">freq</str> 79 --> 80 81 <!-- A spellchecker that reads the list of words from a file --> 82 <!-- 83 <lst name="spellchecker"> 84 <str name="classname">solr.FileBasedSpellChecker</str> 85 <str name="name">file</str> 86 <str name="sourceLocation">spellings.txt</str> 87 <str name="characterEncoding">UTF-8</str> 88 <str name="spellcheckIndexDir">spellcheckerFile</str> 89 </lst> 90 --> 91 </searchComponent>
配置好SpellCheckComponent组件后,需要配置相应的SearchHandler,在正式搜索系统应用中需要配置select和query,自己测试时可以自定义一个,如:spell,配置如下:
<requestHandler name="/spell" class="solr.SearchHandler" startup="lazy"> <lst name="defaults"> <str name="df">text</str> <!-- 下边配置了两个拼写检查子模块,是前边定义好的default和wordbreak,solr会分别用两个模块对输入进行拼写检查,最终将结果整合到一块 --> <str name="spellcheck.dictionary">default</str> <str name="spellcheck.dictionary">wordbreak</str> <str name="spellcheck">on</str> <!-- 为纠错后的提示词添加额外信息,如在索引中的频率 --> <str name="spellcheck.extendedResults">true</str> <!-- 一次纠错返回结果数量 --> <str name="spellcheck.count">10</str> <!-- The maximum number of suggestions to return for terms that exist in the index --> <str name="spellcheck.alternativeTermCount">5</str> <!-- The maximum number of results the query can return while still triggering spelling suggestions --> <str name="spellcheck.maxResultsForSuggest">5</str> <!-- 是否添加校验结果 --> <str name="spellcheck.collate">true</str> <!-- 是否添加校验拓展结果 --> <str name="spellcheck.collateExtendedResults">true</str> <!-- The maximum # of collation possibilities to try before giving up. --> <str name="spellcheck.maxCollationTries">10</str> <!-- 返回校验结果的最大数目 --> <str name="spellcheck.maxCollations">5</str> </lst> <!-- 必须将拼写检查控件添加到搜索控件序列中,若无此项则不进行拼写检查 --> <arr name="last-components"> <str>spellcheck</str> </arr> </requestHandler>
在solr中测试如下: