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

  • 相关阅读:
    恐怖如斯
    java在vscode中配置环境的坑
    python的迭代器模块
    一个模仿输入print就有这么多知识点
    30个python常用小技巧
    第一个只出现一次的字符
    UIScrollView属性
    iOS 中UISlider常用知识点
    iOS中UISegmentedControl常用属性
    iOS触摸事件
  • 原文地址:https://www.cnblogs.com/blog-zuo/p/4819058.html
Copyright © 2011-2022 走看看