这两个星期菜鸟一直在看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不分词来解决这个问题,以下是配置部分:
- 先在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>