solr4.3之拼写检查SpellChecker功能

╰+哭是因爲堅強的太久メ 2022-04-14 05:15 648阅读 0赞

[b][size=large]拼写检查功能,能在搜索时,提供一个较好用户体验,所以,主流的搜索引擎都有这个功能。在这之前,笔者先简单的说一下什么是拼写检查,其实很好理解,就是你输入的搜索词,可能是你输错了,也有可能在它的检索库里面根本不存在这个词,但是这时候它能给你返回,相似或相近的结果来帮助你校正。[/size][/b]

[b][size=large]举个例子,假如你在百度里面输入在在线电瓶,可能它的索引库里面就没有,但是它有可能返回在线电影,在线电视,在线观看等等一些词,这些,就用到拼写检查的功能了。[/size][/b]

[b][size=large]solr作为一种开源的搜索服务器,对拼写检查,也提供了良好的支持,那么下面笔者就来讲下关于solr4.3的拼写检查的配置,在这之前先说明一点,作为拼写检查用,为了提高校正的准确率,一般对校正的词,不要进行分词,所以用string就好了,拼写检查的配置主要是在solrconfig.xml里面配置.
[/size][/b]

[b][size=x-large][color=red]
1,拼写组件SpellCheckComponent配置
2,在SearchHandler /select里面配置
3,在SearchHandler /spell里面配置

按照上面3来,就可以快速配置好拼写检查功能了,其实笔者上面写的4步,其实只配置2,3步就可以了,另外的第4步用默认值就可以了,在这里把它写出来,只是让大家有个认识
[/color][/size][/b]

[b][size=x-large]拼写组件SpellCheckComponent它其实是核心的东西,在他的里面可以配置1至多个拼写检查器,启动的时候所有的检查器都会加载,这次笔者主要介绍的有2个拼写检查器,一个是默认的只对主索引做拼写校正,另外一个是自定义加载spellings.txt拼写检查库,带拼写校正索引库的检查器,其他的检查器各位道友想要使用的话就自己去看wiki了。[/size][/b]

  1. <searchComponent name="spellcheck" class="solr.SpellCheckComponent">
  2. <!-- 查询分析器,如果不指定的话,默认会使用field字段类型的分词器 -->
  3. <str name="queryAnalyzerFieldType">string</str>
  4. <!-- 默认的校正器,只对主索引库管用 -->
  5. <lst name="spellchecker">
  6. <str name="name">default</str>
  7. <str name="field">my_word</str>
  8. <str name="classname">solr.DirectSolrSpellChecker</str>
  9. <str name="distanceMeasure">internal</str>
  10. <float name="accuracy">0.7</float>
  11. <int name="maxEdits">1</int>
  12. <int name="minPrefix">1</int>
  13. <int name="maxInspections">5</int>
  14. <int name="minQueryLength">4</int>
  15. <float name="maxQueryFrequency">0.01</float>
  16. </lst>
  17. <!-- 读取拼写检查库的索引进行校正可以,使用默认配置,取消注释即可 -->
  18. <lst name="spellchecker">
  19. <str name="classname">solr.FileBasedSpellChecker</str>
  20. <str name="name">file</str>
  21. <str name="sourceLocation">spellings.txt</str>
  22. <str name="characterEncoding">UTF-8</str>
  23. <str name="spellcheckIndexDir">spellcheckerFile</str>
  24. </lst>
  25. </searchComponent>

[b][size=large] 对于上面的代码,虽然可以加载多个校正器,但是在拼写检查时,只能指定特定的一个进行校正,那么为什么要配置多个校正检查器呢? 笔者个人感觉这个主要是方便在程序运行可以动态切换校正器。

在spellings.txt里面自定义的拼写检查词,注意编码的格式一定是要UTF-8无BOM的格式,这里面的词,会在solr服务启动时,自动创建spellcheckerFile文件夹并把内容加载到[/size] [/b]

  1. F:\eclipse10tomcat\webapps\solr\solr_home\collections\collection1\data\spellcheckerFile

[b][size=large]索引起来。[/size][/b]

[b][size=large][color=red]SearchHandler /select这个检索请求里面的配置很重要,拼写检查是否启用就是在这里面配置,[/color][/size][/b]

  1. <requestHandler name="/select" class="solr.SearchHandler">
  2. <!-- default values for query parameters can be specified, these
  3. will be overridden by parameters in the request
  4. -->
  5. <lst name="defaults">
  6. <str name="echoParams">explicit</str>
  7. <int name="rows">10</int>
  8. <str name="df">text</str>
  9. </lst>
  10. <!-- 这行代码非常重要,如果没有这行,拼写检查,是不起作用的-->
  11. <arr name="last-components">
  12. <str>spellcheck</str>
  13. </arr>
  14. </requestHandler>

[b][size=large]SearchHandler /spell组件使用默认配置即可[/size][/b]

  1. <requestHandler name="/spell" class="solr.SearchHandler" startup="lazy">
  2. <lst name="defaults">
  3. <str name="df">text</str>
  4. <str name="spellcheck.dictionary">direct</str>
  5. <str name="spellcheck">on</str>
  6. <str name="spellcheck.extendedResults">true</str>
  7. <str name="spellcheck.collate">true</str>
  8. <str name="spellcheck.collateExtendedResults">true</str>
  9. </lst>
  10. <arr name="last-components">
  11. <str>spellcheck</str>
  12. </arr>
  13. </requestHandler>

[b][size=large]至此,拼写检查功能已经配置完毕,可以用solr的UI页面进行主索引测试,也可以用spellCheckFile里面的副索引,测试,但是,一次只能使用一种校正方法[/size][/b]
[b][size=large]下面给出solrj代码[/size][/b]

  1. public List<String> spellcheck(String word){
  2. List<String> wordList=new ArrayList<String>();
  3. SolrQuery query = new SolrQuery();
  4. //query.set("q","name:ac");
  5. //query.set("qt", "/spell");
  6. //默认是主索引
  7. query.set("q", "my_word:"+word+"");
  8. query.set("qt", "/select");
  9. //query.set("spellcheck.build", "true");//遇到新的检查词,会自动添加到索引里面
  10. //query.set("spellcheck.dictionary", "file");//使用副索引,checkSpellFile里面的进行使用
  11. query.set("spellcheck", "true");
  12. query.set("spellcheck.count", Integer.MAX_VALUE);
  13. // params.set("spellcheck.build", "true");
  14. try {
  15. QueryResponse rsp = server.query(query);
  16. System.out.println("直接命中:"+rsp.getResults().size());
  17. SolrDocumentList ss=rsp.getResults();
  18. for(SolrDocument doc:ss){
  19. System.out.println(doc.get("my_word"));
  20. }
  21. //…上面取结果的代码
  22. SpellCheckResponse re=rsp.getSpellCheckResponse();
  23. if (re != null) {
  24. for(Suggestion s:re.getSuggestions()){
  25. List<String> list=s.getAlternatives();
  26. for(String spellWord:list){
  27. System.out.println(spellWord);
  28. // wordList.add(spellWord);
  29. }
  30. }
  31. // for(Collation s: spellCheckResponse.getCollatedResults()){
  32. // System.out.println(s.toString());
  33. // }
  34. }
  35. return wordList;
  36. } catch (SolrServerException e) {
  37. // TODO Auto-generated catch block
  38. e.printStackTrace();
  39. }
  40. return null;
  41. }

[b][size=x-large][color=red]最后,笔者关于拼写检查还有一个问题没有搞清楚,就是使用spellings.txt里面的自定义词,检索时只能检索出长度大于2的词,希望各位看到此篇文章的读者也测试一下,找一下解决方法。[/color][/size][/b]

发表评论

表情:
评论列表 (有 0 条评论,648人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Solr拼写检查

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

    相关 Texworks拼写检查

    我使用的是Tex Live2015,其中自带的编辑器 Texworks是不自带拼写检查的,那么我们书写英文单词的时候需要Word那样的拼写检查怎么办? (1)在OpenOff

    相关 拼写检查-c++

    【问题描述】        作为一个新的拼写检查程序开发团队的成员,您将编写一个模块,用已知的所有形式正确的词典来检查给定单词的正确性。        如果字典中没有这个