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中测试如下:

原文地址:https://www.cnblogs.com/blog-zuo/p/4819058.html