您的位置:首页 > 其它

solr学习之(四)_solr4.2.0版本的spellCheck功能的实现

2013-04-20 13:20 309 查看
尽管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">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吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息