这两个星期菜鸟一直在看solr纠错的配置,发现很多让人崩溃的地方,想请教大家的配置情况以及改进意见~

看到的大神们欢迎留言,啊,不,是一定要留言,不胜感激

以下是我在solrconfig.xml里面的配置

<requestHandler name="/select" class="solr.SearchHandler">  
    <lst name="defaults">  
      <str name="echoParams">explicit</str>  
      <int name="rows">10</int>  
      <str name="df">text</str>  
    </lst>   
  <arr name="last-components">  
        <str>spellcheck</str>  
      </arr>  
   </requestHandler>  
 ******************************************我是华丽的分界线***********************************************************
 <searchComponent name="spellcheck" class="solr.SpellCheckComponent">
    <str name="queryAnalyzerFieldType">string</str>
    <lst name="spellchecker">
      <str name="name">default</str>
      <str name="field">text</str>
      <str name="classname">solr.DirectSolrSpellChecker</str>
      <str name="distanceMeasure">internal</str>
      <float name="accuracy">0.7</float>
      <int name="maxEdits">2</int>
      <int name="minPrefix">3</int>
      <int name="maxInspections">5</int>
      <int name="minQueryLength">4</int>
      <float name="maxQueryFrequency">0.01</float>
    </lst>
********************************************************我是华丽的分界线******************************************************
<lst name="spellchecker"> <str name="name">wordbreak</str> <str name="classname">solr.WordBreakSolrSpellChecker</str> <str name="field">text</str> <str name="combineWords">true</str> <str name="breakWords">true</str> <int name="maxChanges">10</int> </lst> <lst name="spellchecker">   <str name="classname">solr.FileBasedSpellChecker</str>   <str name="name">file</str>   <str name="sourceLocation">spellings.txt</str>   <str name="characterEncoding">UTF-8</str>   <str name="spellcheckIndexDir">spellcheckerFile</str> </lst> </searchComponent>
**********************************************************我是华丽的分界线************************************************
<requestHandler name="/spell" class="solr.SearchHandler" startup="lazy">   <lst name="defaults">   <str name="df">text</str>   <str name="spellcheck.dictionary">default</str>   <str name="spellcheck.dictionary">wordbreak</str>   <str name="spellcheck.dictionary">file</str>   <str name="spellcheck">on</str>   <str name="spellcheck.extendedResults">true</str>   <str name="spellcheck.count">10</str>   <str name="spellcheck.collate">true</str>   <str name="spellcheck.collateExtendedResults">true</str>   <str name="spellcheck.maxCollationTries">10</str>   <str name="spellcheck.maxCollations">1</str>   </lst>  <arr name="last-components">     <str>spellcheck</str>   </arr> </requestHandler>

在我测试的时候发现

当我的测试url为http://localhost/solr/spell?spellcheck.q=中国&spellcheck.build=true&spellcheck.dictionary=file

即选择file方式,基于solr.FileBasedSpellChecker时,完全依赖词典,每次都会把词典中所有以“中国”为前缀的词输出,可是,“中国”这个词他是正确的啊

 

当我的测试url为http://localhost/solr/spell?spellcheck.q=中国&spellcheck.build=true&spellcheck.dictionary=default

即采用默认主索引方式的时候,他对中文似乎完全没有支持,索引中有的词,不管我输入的对不对,一概不予理会

但是对英文的辨别度灰常好,让人灰常无语

 

鉴于纠错功能是solr很重要的一部分,这样的效果实在难以接受,在查询源代码之后发现solr是有匹配若正确则不提示这一个步骤的,所以我觉得还是本菜鸟配置的问题,纠结ing...............

 

解决办法:

在网上找了很多配置方法发现别人用的都是新建的字段,后经大神指导发现我所使用的现成字段——text字段的问题

solr会在query和index处都进行分词,也就是索引和查询词都会先被分词。大家也知道solr纠错对于两个字的效果并不是很理想,如果你就错所用的字段是经过分词的字段,把中国很行(中国银行的纠错)分词成中国,很行等等在进行纠错,那他肯定无法支持中文了。

所以在这里新建一个纠错专用字段spell,index分词,query不分词来解决这个问题,以下是配置部分:

  1. 先在scheml.xml的配置,加一个这个类型:
1 <fieldType name="text_spell" class="solr.TextField" positionIncrementGap="100">
2       <analyzer type="index">
3                <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
4         <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
5       </analyzer>
6       <analyzer type="query">
7               <tokenizer class="solr.WhitespaceTokenizerFactory"/>
8       </analyzer>
9 </fieldType>

index配置分词,query不分词

  2.加一个这个字段

<field name="spell" type="text_spell" indexed="true" stored="false" multiValued="true" /> 

  3.copy一下字段,使新创建的字段中有内容

<copyField source="content" dest="spell"/>

  4.solrconfig.xml的配置

 1 <!--拼写检查 -->   
 2   <searchComponent name="spellcheck" class="solr.SpellCheckComponent">
 3 
 4     <str name="queryAnalyzerFieldType">textComplex</str>
 5     <lst name="spellchecker">
 6       <str name="name">default</str>
 7       <str name="field">spell</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     
19   </searchComponent>
20 
21 
22 
23 <requestHandler name="/spell" class="solr.SearchHandler" startup="lazy">
24     <lst name="defaults">
25       <str name="df">text</str>
26       <str name="spellcheck.dictionary">default</str>
27      
28        <str name="spellcheck">on</str>
29        <str name="spellcheck.extendedResults">false</str>       
30        <str name="spellcheck.count">5</str>
31        <str name="spellcheck.alternativeTermCount">2</str>
32        <str name="spellcheck.maxResultsForSuggest">5</str>       
33        <str name="spellcheck.collate">true</str>
34        <str name="spellcheck.collateExtendedResults">true</str>  
35        <str name="spellcheck.maxCollationTries">5</str>
36     </lst>
37     <arr name="last-components">
38       <str>spellcheck</str>
39     </arr>
40   </requestHandler>

 

 posted on 2013-12-02 16:49  瞌睡的美人鱼  阅读(897)  评论(0编辑  收藏  举报