solr spellcheck 功能

来源:互联网 发布:李连杰眼睛 知乎 编辑:程序博客网 时间:2024/05/17 22:24

需要实现多个field的spellcheck功能,一直犯迷糊,现在知道怎么用了

<searchComponent name="spellcheck" class="solr.SpellCheckComponent">    <lst name="spellchecker">      <str name="name">default</str>      <str name="classname">solr.IndexBasedSpellChecker</str>      <str name="field">var_poi_chinese_str</str>      <str name="spellcheckIndexDir">spellchecker</str>      <str name="accuracy">0.7</str>      <str name="buildOnCommit">true</str>    </lst>    <lst name="spellchecker">      <str name="name">brand</str>      <str name="classname">solr.IndexBasedSpellChecker</str>      <str name="field">brand</str>      <str name="spellcheckIndexDir">brand_spellchecker</str>      <str name="accuracy">0.3</str>      <str name="buildOnCommit">true</str>    </lst>    <str name="queryAnalyzerFieldType">string</str></searchComponent>

要先有一个searchComponent,上面只是一个例子,brand是后面会用到的spellcheck.dictionary的标识,field是指在建索引过程中哪个field需要做spellcheck

accuracy是指字符串之间的distance要小于accuracy*query长度。

queryAnalyzerFieldType是指用哪个queryAnalyzer来进行分词,一般不分词,因为如果找到了任意一个term,表明这个query就是没问题的,就不会启动spellcheck功能。


<requestHandler name="/spell" class="solr.SearchHandler">    <lst name="defaults">      <str name="spellcheck.onlyMorePopular">false</str>      <str name="spellcheck.extendedResults">false</str>      <str name="spellcheck.count">3</str>    </lst>    <arr name="last-components">      <str>spellcheck</str>    </arr></requestHandler>

<requestHandler name="/brand_spell" class="solr.SearchHandler">    <lst name="defaults">      <str name="spellcheck.dictionary">brand</str>      <str name="spellcheck.onlyMorePopular">false</str>      <str name="spellcheck.extendedResults">false</str>      <str name="spellcheck.count">3</str>    </lst>    <arr name="last-components">      <str>brand_spellcheck</str>    </arr></requestHandler>

这里是两个不同的requestHandler,设置spellcheck.dictionary可以指定使用哪个spellchecker来做拼写检查

如果要根据不同的field或者是使用不同的距离方法来进行拼写检查,就需要指定不同的spellchecker。或者新建一个requestHandler(这里不建议这样做,只会令solrconfig.xml文件看起来臃肿冗余)。但是,如果是同一个requestHandler里面要用好几个spellcheck,则需要满足它们的距离测量方法以及accuracy是相同的,否则只能使用不同的requestHandler。


注意在requestHandler里面的最后有一个segment

<arr name="last-components">      <str>brand_spellcheck</str>    </arr>
这个last-components指定了该requestHandler使用哪个searchComponent来进行一些查询(或者是拼写检查等其他操作)。

不过requestHandler里面的那些searchComponent的属性都可以动态的使用url来设定。

例如:

http://10.141.201.53:8080/solr/poi/spell?wt=xml&indent=true&spellcheck=true&spellcheck.q=adibas&spellcheck.dictionary=brand


这是使用searchComponent里的brand来进行spellcheck的结果,可见由于它的accuracy只有0.3,所以得到的结果可以有很多(但是不多于spellcheck.count个)


这里使用searchComponent里的default来进行检查,accuracy有0.7,所以只找出了adidas一个(distance为1)


这里为什么brand没有找出adidas。。那是因为数据库里面的数据比较渣,adidas商店的brand信息为空,如果有的话,那么adidas肯定在第一个图里排第一。


好吧这里那就再举个例子:

http://10.141.201.53:8080/solr/poi/spell?wt=xml&indent=true&spellcheck=true&spellcheck.q=东方商厦店&spellcheck.dictionary=default


http://10.141.201.53:8080/solr/poi/spell?wt=xml&indent=true&spellcheck=true&spellcheck.q=东方商厦店&spellcheck.dictionary=brand


可以看到由于数据的不同以及accuracy的不同,default和brand这两个spellchecker返回的结果不同,但是距离最小的 东方商厦 都排在最前面



这里的spellcheck结果也有一个排序策略可供选择

 <!-- comparatorClass be one of:       1. score (default)       2. freq (Frequency first, then score)       3. A fully qualified class name  -->  <str name="comparatorClass">freq</str>

默认是根据距离排名,也可以根据frequency或者是自定义排名


一般比较重要比较基本的用法就是这些,其他功能就可以参考solr的手册来使用了

SpellCheckComponent

0 0