solr spell拼写检查

转载 2017年01月03日 09:25:23

拼写检查(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. }  

 

 

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

相关文章推荐

solr入门之solr的拼写检查功能的应用级别尝试

今天主要是收集了些拼写检查方面的资料和 尝试使用一下拼写检查的功能--=遇到了不少问题 拼写检查的四种配置目前我只算是成功了半个吧 ----------------------------...

solr拼写检查实例

拼写检查功能,能在搜索时,提供一个较好用户体验,所以,主流的搜索引擎都有这个功能。在这之前,笔者先简单的说一下什么是拼写检查,其实很好理解,就是你输入的搜索词,可能是你输错了,也有可能在它的检索库里面...

solr开发之拼写检查spellcheck

首先,修改schema.xml,增加需要检查的字段

solr高亮、拼写检查及匹配相似简单实践

高亮(highlight) 我们经常使用搜索引擎,比如在google 搜索 java ,会出现如下结果,结果中与关键字匹配的地方是红色显示与其他内容区别开来。 solr 默认已经配...

Solr.NET快速入门(五)【相似查询,拼写检查】

相似查询此功能会返回原始查询结果中返回的每个文档的类似文档列表。参数通过QueryOptions的MoreLikeThis属性定义。示例:搜索“apache”,为结果中的每个文档搜索“cat”(类别)...
  • WuLex
  • WuLex
  • 2017年03月18日 21:57
  • 522

solr入门之拼写纠错深入研究及代码Demo

昨天粗略的研究了下solr自身的拼写纠错功能,效果不是很好,今天继续研究了其中的依靠文件来纠错和主索引纠错的方式 =================== 文件加载方式 配置--      s...

solr高亮(highlight),拼写检查(spellCheck),匹配相似(moreLikeThis) 应用实践

Solr 是基于lucene的检索服务器。能够很快的搭建检索服务,并且提供的很多实用的组件。例如 高亮(highlight)、拼写检查(spellCheck)和匹配相位(moreLikeThis)。下...
  • july_2
  • july_2
  • 2013年12月17日 10:18
  • 3276

solr的spellcheck和suggest配置代码记录

string default text solr.DirectSolrSpellChecker inte...
  • tyl314
  • tyl314
  • 2014年01月06日 11:10
  • 1090

JAVA的solr操作实现(基本操作)

JAVA操作solr的实现其实很简单,但是很多细节要注意,在实际的开发中,很多人喜欢自己封装这些基础的方法以一个全新的“面貌”出现,其实都是一回事,操作熟了自然就会想到将一些实现功能用到的方法重新封装...

java操作solr实现索引,查询,删除,拼写检查等功能

使用java操作solr 前面讲了很多对solr的操作都是直接在页面上操作的,实际工作中肯定是要使用java进行操作的,在这我们就看一下如何使用java来操作solr Solr提供了solrj...
  • Truong
  • Truong
  • 2015年08月28日 18:01
  • 1393
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:solr spell拼写检查
举报原因:
原因补充:

(最多只允许输入30个字)