尽管solr4.2的spellcheck功能已经配置在solr\collection1\conf\solrconfig.xml文件中了,但是我一直没有正确地看到这个模块的效果。晚上再认真看了一下apache_solr_4_cookbook.pdf这本书,然后按照书本描述配置了一下。
在solr4.0以前的版本中,spellcheck功能都需要构建自己的索引,每次配置后都需要更新索引,比较麻烦。而solr4.0以后,通过solr.DirectSolrSpellchecker就可以在main索引中直接用spellcheck功能了。通过观察solr-4.2.0\example\exampledocs\money.xml文件,我们可以看到里面有一个cat属性。
- <doc>
- <field name="id">USDfield>
- <field name="name">One Dollarfield>
- <field name="manu">Bank of Americafield>
- <field name="manu_id_s">boafield>
- <field name="cat">currencyfield>
- <field name="features">Coins and notesfield>
- <field name="price_c">1,USDfield>
- <field name="inStock">truefield>
- doc>
我这里就以cat属性为例,学习一下solr4.2中实现spellcheck的功能。
第一步:把solrconfig.xml的
- <searchComponent name="spellcheck" class="solr.SpellCheckComponent">
- ……
- searchComponent>
- <requestHandler name="/spell" class="solr.SearchHandler" startup="lazy">
- ……
- requestHandler>
配置成如下:
- <searchComponent name="spellcheck" class="solr.SpellCheckComponent">
- <str name="queryAnalyzerFieldType">textSpellstr>
- <lst name="spellchecker">
- <str name="name">directstr>
- <str name="field">catstr>
- <str name="classname">solr.DirectSolrSpellCheckerstr>
- <str name="distanceMeasure">internalstr>
- <float name="accuracy">0.5float>
- <int name="maxEdits">2int>
- <int name="minPrefix">1int>
- <int name="maxInspections">5int>
- <int name="minQueryLength">4int>
- <float name="maxQueryFrequency">0.01float>
- lst>
- searchComponent>
- <requestHandler name="/spell" class="solr.SearchHandler" startup="lazy">
- <lst name="defaults">
- <str name="df">textstr>
- <str name="spellcheck.dictionary">directstr>
- <str name="spellcheck">onstr>
- <str name="spellcheck.extendedResults">truestr>
- <str name="spellcheck.count">10str>
- <str name="spellcheck.collate">truestr>
- <str name="spellcheck.collateExtendedResults">truestr>
- lst>
- <arr name="last-components">
- <str>spellcheckstr>
- arr>
- requestHandler>
然后重启tomcat,在浏览器的地址栏输入:
http://localhost:8983/solr/spell?q=cat:currenc&spellcheck=true
我们就可以看到:
- <response>
- <lst name="responseHeader">
- <int name="status">0int>
- <int name="QTime">27int>
- lst>
- <result name="response" numFound="0" start="0"/>
- <lst name="spellcheck">
- <lst name="suggestions">
- <lst name="currenc">
- <int name="numFound">1int>
- <int name="startOffset">4int>
- <int name="endOffset">11int>
- <int name="origFreq">0int>
- <arr name="suggestion">
- <lst>
- <str name="word">currencystr>
- <int name="freq">4int>
- lst>
- arr>
- lst>
- <bool name="correctlySpelled">falsebool>
- <lst name="collation">
- <str name="collationQuery">cat:currencystr>
- <int name="hits">0int>
- <lst name="misspellingsAndCorrections">
- <str name="currenc">currencystr>
- lst>
- lst>
- lst>
- lst>
- response>
解析一下吧:我输入的q=cat:currenc实际上是没有拼写正确的,正确的应该是currency,cat表示索引的一个field。
所以呢,会有这样的结果反馈:
- <bool name="correctlySpelled">falsebool> 表示拼写错误
- <lst name="collation">
- <str name="collationQuery">cat:currencystr>
- <int name="hits">0int>
- <lst name="misspellingsAndCorrections">
- <str name="currenc">currencystr> 正确的结果应该是:currency。
So easy吧!