关闭

solr spell拼写检查

标签: solr搜索
177人阅读 评论(0) 收藏 举报
分类:

拼写检查(spellCheck)

首先配置 solrconfig.xml,文件可能已经有这两个元素(如果没有添加即可),需要根据我们自己的系统环境做些适当的修改。

Java代码  收藏代码
  1. <searchComponent name="spellcheck" class="solr.SpellCheckComponent">  
  2.   <lst name="spellchecker">  
  3.     <str name="name">default</str>  
  4.     <!--这里指明需要根据哪个字段的索引为依据进行拼写检查。现配置 名为 name 的字段-->  
  5.     <str name="field">name</str>  
  6.     <!--拼写检查索引的目录-->  
  7.     <str name="spellcheckIndexDir">spellchecker</str>  
  8.     <!--当commit的时候,对拼写检查索引进行构建。(只有构建后,拼写检查才有效果)-->  
  9.     <!--当然,也可以选择在optimize的时候,进行构建。那么只需要将"buildOnCommint"换为 "buildOnOptimize"-->  
  10.     <str name="buildOnCommit">true</str>  
  11.   </lst>  
  12. </searchComponent>  
  13.   
  14. <requestHandler name="/spell" class="solr.SearchHandler" startup="lazy">  
  15.   <!--默认参数-->  
  16.   <lst name="defaults">  
  17.     <str name="spellcheck.onlyMorePopular">false</str>  
  18.     <str name="spellcheck.extendedResults">false</str>  
  19.     <!--配置拼写检查提示结果的个数(可以根据需要适当加大)-->  
  20.     <str name="spellcheck.count">1</str>  
  21.   </lst>  
  22.   <arr name="last-components">  
  23.     <str>spellcheck</str>  
  24.   </arr>  
  25. </requestHandler>  

 

 

配置完之后,需要重新建遍索引才能有效。然后我们这以请求 http://localhost:8080/solr/spell?q=name:王麻字&spellcheck=true
 查询如果如下:

Java代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   <response>  
  3.     <lst name="responseHeader">  
  4.       <int name="status">0</int>  
  5.       <int name="QTime">0</int>  
  6.     </lst>  
  7.     <result name="response" numFound="0" start="0"/>  
  8.     <lst name="spellcheck">  
  9.       <lst name="suggestions">  
  10.         <lst name="王麻字">  
  11.           <int name="numFound">1</int>  
  12.           <int name="startOffset">0</int>  
  13.           <int name="endOffset">3</int>  
  14.           <arr name="suggestion">  
  15.             <str>王麻子</str>  
  16.           </arr>  
  17.         </lst>  
  18.       </lst>  
  19.     </lst>  
  20.   </response>  

 

 

有时候我们需要以多个字段为依据进行拼写检查,但上面的配置只能设一个字段。为了达到同样的效果,
我能只能另行其道了。需要用到 coptyField 技术。比如我们在 schema.xml 中定义了

Xml代码  收藏代码
  1. <field name="a" .../>   
  2. <field name="b" .../>  
  3. <field name="ab" multiValued="true" .../>  
  4. <copyField source="a" dest="ab" />   
  5. <copyField source="b" dest="ab" />  

 

 


然后配置 SpellCheckComponent 的字段为 ab 即可。


要作用Solr的SpellCheck功能,需要以下配置:
1. 在solrConfig.xml最后加入以下片段:

Xml代码  收藏代码
  1. <!-- spell -->  
  2.   
  3. <searchComponent name="spellcheck" class="org.apache.solr.handler.component.SpellCheckComponent">  
  4.   
  5.   
  6.   
  7.     <lst name="spellchecker">  
  8.   
  9.       <!--  
  10.   
  11.            Optional, it is required when more than one spellchecker is configured.  
  12.   
  13.            Select non-default name with spellcheck.dictionary in request handler.  
  14.   
  15. name是可选的,如果只有一个spellchecker可以不写name  
  16.   
  17. 如果有多个spellchecker,需要在Request Handler中指定spellcheck.dictionary  
  18.   
  19.       -->  
  20.   
  21.       <str name="name">default</str>  
  22.   
  23.       <!-- The classname is optional, defaults to IndexBasedSpellChecker -->  
  24.   
  25.       <str name="classname">solr.IndexBasedSpellChecker</str>  
  26.   
  27.       <!--  
  28.   
  29.                Load tokens from the following field for spell checking,  
  30.   
  31.                analyzer for the field's type as defined in schema.xml are used  
  32.   
  33. 下面这个field名字指的是拼写检查的依据,也就是说要根据哪个Field来检查用户输入。  
  34.   
  35.       -->  
  36.   
  37.       <str name="field">name_t</str>  
  38.   
  39.       <!-- Optional, by default use in-memory index (RAMDirectory)   
  40.   
  41. SpellCheck索引文件的存放位置,是可选的,如果不写默认使用内存模式RAMDirectory。  
  42.   
  43. ./spellchecker1指的是:corex\data\spellchecker1  
  44.   
  45. -->  
  46.   
  47.       <str name="spellcheckIndexDir">./spellchecker1</str>  
  48.   
  49.       <!-- Set the accuracy (float) to be used for the suggestions. Default is 0.5 -->  
  50.   
  51.       <str name="accuracy">0.7</str>  
  52.   
  53. <!--何时创建拼写索引:buildOnCommit/buildOnOptimize -->  
  54.   
  55.    <str name="buildOnCommit">true</str>  
  56.   
  57.     </lst>  
  58.   
  59. <!-- 另一个拼写检查器,使用JaroWinklerDistance距离算法 -->  
  60.   
  61.     <lst name="spellchecker">  
  62.   
  63.        <str name="name">jarowinkler</str>  
  64.   
  65.        <str name="classname">solr.IndexBasedSpellChecker</str>  
  66.   
  67.        <str name="field">name_t</str>  
  68.   
  69.        <!-- Use a different Distance Measure -->  
  70.   
  71.        <str name="distanceMeasure">org.apache.lucene.search.spell.JaroWinklerDistance</str>  
  72.   
  73.        <str name="spellcheckIndexDir">./spellchecker2</str>  
  74.   
  75.        <str name="buildOnCommit">true</str>  
  76.   
  77.      </lst>  
  78.   
  79. <!-- 另一个拼写检查器,使用文件内容为检查依据 -->   
  80.   
  81.      <lst name="spellchecker">  
  82.   
  83.        <str name="classname">solr.FileBasedSpellChecker</str>  
  84.   
  85.        <str name="name">file</str>  
  86.   
  87.        <str name="sourceLocation">spellings.txt</str>  
  88.   
  89.        <str name="characterEncoding">UTF-8</str>  
  90.   
  91.        <str name="spellcheckIndexDir">./spellcheckerFile</str>  
  92.   
  93.        <str name="buildOnCommit">true</str>  
  94.   
  95.      </lst>  
  96.   
  97.     <!-- This field type's analyzer is used by the QueryConverter to tokenize the value for "q" parameter  
  98.  
  99. -->  
  100.   
  101.     <str name="queryAnalyzerFieldType">text</str>  
  102.   
  103.   
  104.   
  105. </searchComponent>  
  106.   
  107. <!--  
  108.   
  109.   The SpellingQueryConverter to convert raw (CommonParams.Q) queries into tokens.  Uses a simple regular expression  
  110.   
  111.   to strip off field markup, boosts, ranges, etc. but it is not guaranteed to match an exact parse from the query parser.  
  112.   
  113.   
  114.   
  115.   Optional, defaults to solr.SpellingQueryConverter  
  116.   
  117. -->  
  118.   
  119. <queryConverter name="queryConverter" class="solr.SpellingQueryConverter"/>  
  120.   
  121.   
  122.   
  123. <!--  Add to a RequestHandler  
  124.   
  125. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  
  126.   
  127. NOTE:  YOU LIKELY DO NOT WANT A SEPARATE REQUEST HANDLER FOR THIS COMPONENT.  THIS IS DONE HERE SOLELY FOR  
  128.   
  129. THE SIMPLICITY OF THE EXAMPLE.  YOU WILL LIKELY WANT TO BIND THE COMPONENT TO THE /select STANDARD REQUEST HANDLER.  
  130.   
  131. 下面这个Handler不是必需的,写在这里只是一个简单的例子,可以把相应的设置放到Standard request handler中就可以。  
  132.   
  133. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  
  134.   
  135. -->  
  136.   
  137. <requestHandler name="/spell" class="solr.SearchHandler">  
  138.   
  139.     <lst name="defaults">  
  140.   
  141.       <!-- Optional, must match spell checker's name as defined above, defaults to "default" -->  
  142.   
  143.       <str name="spellcheck.dictionary">file</str>  
  144.   
  145.       <!-- omp = Only More Popular -->  
  146.   
  147.       <str name="spellcheck.onlyMorePopular">true</str>  
  148.   
  149.       <!-- exr = Extended Results -->  
  150.   
  151.       <str name="spellcheck.extendedResults">true</str>  
  152.   
  153.       <!--  The number of suggestions to return -->  
  154.   
  155.       <str name="spellcheck.count">1</str>  
  156.   
  157.     </lst>  
  158.   
  159. <!--  Add to a RequestHandler  
  160.   
  161. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  
  162.   
  163. REPEAT NOTE:  YOU LIKELY DO NOT WANT A SEPARATE REQUEST HANDLER FOR THIS COMPONENT.  THIS IS DONE HERE SOLELY FOR  
  164.   
  165. THE SIMPLICITY OF THE EXAMPLE.  YOU WILL LIKELY WANT TO BIND THE COMPONENT TO THE /select STANDARD REQUEST HANDLER.  
  166.   
  167. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  
  168.   
  169. -->  
  170.   
  171.     <arr name="last-components">  
  172.   
  173.       <str>spellcheck</str>  
  174.   
  175.     </arr>  
  176.   
  177.   </requestHandler>  

 

 


2. 如果使用File的方式,需要在spell.txt中加入相应的拼写建议,每个拼写建议占一行。

3. 配置文件修改完后,需要重做索引,这样会在索引目录里出现下面的目录

 

 


分别对应拼写组件中每个SpellChecker对应的索引文件。

4. 在需要拼写检查的页面加入如下方法:

Java代码  收藏代码
  1. /** 
  2.  
  3.  *  
  4.  
  5.  * get spell suggestion from core 
  6.  
  7.  * 
  8.  
  9.  * 
  10.  
  11.  * @param keyword 
  12.  
  13.  * @param coreName 
  14.  
  15.  * @return 
  16.  
  17.  * @throws Exception 
  18.  
  19.  */  
  20.   
  21. private Collection<String> getSpellCheckFromCore(String keyword,String coreName) throws Exception {  
  22.   
  23.   Collection<String> suggestion = new ArrayList<String>();  
  24.   
  25.     CoreContainer container = SearchManager.getCoreContainer();  
  26.   
  27.   SolrCore core = container.getCore(coreName);  
  28.   
  29.     SearchComponent speller = core.getSearchComponent("spellcheck");  
  30.   
  31.   
  32.   
  33.     ModifiableSolrParams params = new ModifiableSolrParams();  
  34.   
  35.     params.add(CommonParams.QT, "/spell");  
  36.   
  37.     params.add(SpellCheckComponent.SPELLCHECK_BUILD, "true");  
  38.   
  39.     params.add(CommonParams.Q, keyword);  
  40.   
  41.     params.add(SpellCheckComponent.COMPONENT_NAME, "true");  
  42.   
  43.     params.add(SpellCheckComponent.SPELLCHECK_COLLATE, "true");  
  44.   
  45.   
  46.   
  47.     SolrRequestHandler handler = core.getRequestHandler("/spell");  
  48.   
  49.     SolrQueryResponse rsp = new SolrQueryResponse();  
  50.   
  51.     rsp.add("responseHeader"new SimpleOrderedMap());  
  52.   
  53.     handler.handleRequest(new LocalSolrQueryRequest(core, params), rsp);  
  54.   
  55.     NamedList values = rsp.getValues();  
  56.   
  57.     NamedList spellCheck = (NamedList) values.get("spellcheck");  
  58.   
  59.     NamedList suggestions = (NamedList) spellCheck.get("suggestions");  
  60.   
  61.     Boolean correctlySpelled = (Boolean) suggestions.get("correctlySpelled");  
  62.   
  63.     if(correctlySpelled == null){  
  64.   
  65.      String collation = (String) suggestions.get("collation");  
  66.   
  67.      suggestion.add(collation);  
  68.   
  69.     }  
  70.   
  71.       
  72.   
  73.     return suggestion;  
  74.   
  75. }  

 

 

可以把返回的结果直接显示到页面相应的地方。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:200791次
    • 积分:3111
    • 等级:
    • 排名:第11520名
    • 原创:57篇
    • 转载:366篇
    • 译文:0篇
    • 评论:22条
    最新评论