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的拼写检查功能的应用级别尝试

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

solr开发之拼写检查spellcheck

首先,修改schema.xml,增加需要检查的字段
  • kevinxxw
  • kevinxxw
  • 2015年11月08日 00:00
  • 2262

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

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

VIM学习笔记 拼写检查(Spell Check)

转载自这篇墙外的Blogspot文章
  • happen23
  • happen23
  • 2015年09月16日 09:31
  • 1431

vim中单词拼写检查spellchecking

vim中内置了拼写检查功能,在终端中使用简单的命令就可以开启和关闭拼写检查功能。 打开拼写检查: :set spell 关闭拼写检查: :set nospell 另外还有...
  • wangeen
  • wangeen
  • 2013年06月12日 20:47
  • 3016

Atom飞行手册翻译: 2.12 在Atom中写作

在Atom中写作虽然Atom通常可能用来编写软件的代码,但是它还可以用来高效地编写文章。这通常采用一些标记语言,比如说Markdown和Asciidoc(也就是英文手册所用的格式)来完成。下面我们会很...
  • wizardforcel
  • wizardforcel
  • 2015年08月02日 15:30
  • 705

Solr拼写检查示例

在这个Solr Spellcheck示例中,我们将讨论如何实现Apache Solr提供的拼写检查功能。 我们将向您展示如何在Solr中配置拼写检查,并讨论用于获取拼写检查建议的查询参数。为了演示So...
  • boonya
  • boonya
  • 2017年02月12日 11:15
  • 349

solr4.7.2开发实践 ——拼写检查spellcheck【需要修改为自己配置的】

文章来源:http://my.oschina.net/MrMichael/blog/261242 ①拼写检查不同于其他域,它在建立索引时需要分词,但是检索时不需要分词,所以要建立一个特殊的域,...
  • buster2014
  • buster2014
  • 2015年05月17日 16:59
  • 899

怎样写一个拼写检查器-贝叶斯-python

怎样写一个拼写检查器  Peter Norvig 翻译: Eric You XU 原版:http://norvig.com/spell-correct.html 翻译:http:/...
  • suwei19870312
  • suwei19870312
  • 2012年09月26日 15:05
  • 3131

solr拼写检查实例

拼写检查功能,能在搜索时,提供一个较好用户体验,所以,主流的搜索引擎都有这个功能。在这之前,笔者先简单的说一下什么是拼写检查,其实很好理解,就是你输入的搜索词,可能是你输错了,也有可能在它的检索库里面...
  • chenshuaining
  • chenshuaining
  • 2016年03月30日 10:59
  • 454
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:solr spell拼写检查
举报原因:
原因补充:

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