zoukankan      html  css  js  c++  java
  • 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中测试如下:

  • 相关阅读:
    73. Set Matrix Zeroes
    289. Game of Live
    212. Word Search II
    79. Word Search
    142. Linked List Cycle II
    141. Linked List Cycle
    287. Find the Duplicate Number
    260. Single Number III
    137. Single Number II
    Oracle EBS中有关Form的触发器的执行顺序
  • 原文地址:https://www.cnblogs.com/blog-zuo/p/4819058.html
Copyright © 2011-2022 走看看