尽管solr4.2的spellcheck功能已经配置在solr\collection1\conf\solrconfig.xml文件中了,但是我一直没有正确地看到这个模块的效果。晚上再认真看了一下apache_solr_4_cookbook.pdf这本书,然后按照书本描述配置了一下。
在solr4.0以前的版本中,spellcheck功能都需要构建自己的索引,每次配置后都需要更新索引,比较麻烦。而solr4.0以后,通过solr.DirectSolrSpellchecker就可以在main索引中直接用spellcheck功能了。通过观察solr-
- <doc>
- <field name="id">USD</field>
- <field name="name">One Dollar</field>
- <field name="manu">Bank of America</field>
- <field name="manu_id_s">boa</field>
- <field name="cat">currency</field>
- <field name="features">Coins and notes</field>
- <field name="price_c">1,USD</field>
- <field name="inStock">true</field>
- </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">textSpell</str>
- <lst name="spellchecker">
- <str name="name">direct</str>
- <str name="field">cat</str>
- <str name="classname">solr.DirectSolrSpellChecker</str>
- <str name="distanceMeasure">internal</str>
- <float name="accuracy">0.5</float>
- <int name="maxEdits">2</int>
- <int name="minPrefix">1</int>
- <int name="maxInspections">5</int>
- <int name="minQueryLength">4</int>
- <float name="maxQueryFrequency">0.01</float>
- </lst>
- </searchComponent>
- <requestHandler name="/spell" class="solr.SearchHandler" startup="lazy">
- <lst name="defaults">
- <str name="df">text</str>
- <str name="spellcheck.dictionary">direct</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>
- </lst>
- <arr name="last-components">
- <str>spellcheck</str>
- </arr>
- </requestHandler>
然后重启tomcat,在浏览器的地址栏输入:
http://localhost:8983/solr/spell?q=cat:currenc&spellcheck=true
我们就可以看到:
- <response>
- <lst name="responseHeader">
- <int name="status">0</int>
- <int name="QTime">27</int>
- </lst>
- <result name="response" numFound="0" start="0"/>
- <lst name="spellcheck">
- <lst name="suggestions">
- <lst name="currenc">
- <int name="numFound">1</int>
- <int name="startOffset">4</int>
- <int name="endOffset">11</int>
- <int name="origFreq">0</int>
- <arr name="suggestion">
- <lst>
- <str name="word">currency</str>
- <int name="freq">4</int>
- </lst>
- </arr>
- </lst>
- <bool name="correctlySpelled">false</bool>
- <lst name="collation">
- <str name="collationQuery">cat:currency</str>
- <int name="hits">0</int>
- <lst name="misspellingsAndCorrections">
- <str name="currenc">currency</str>
- </lst>
- </lst>
- </lst>
- </lst>
- </response>
解析一下吧:我输入的q=cat:currenc实际上是没有拼写正确的,正确的应该是currency,cat表示索引的一个field。
所以呢,会有这样的结果反馈:
- <bool name="correctlySpelled">false</bool> 表示拼写错误
- <lst name="collation">
- <str name="collationQuery">cat:currency</str>
- <int name="hits">0</int>
- <lst name="misspellingsAndCorrections">
- <str name="currenc">currency</str> 正确的结果应该是:currency。
So easy吧!