作者:mobiledu2502918033 | 来源:互联网 | 2023-06-27 11:04
需要实现多个field的spellcheck功能,一直犯迷糊,现在知道怎么用了
defaultsolr.IndexBasedSpellCheckervar_poi_chinese_strspellchecker0.7truebrandsolr.IndexBasedSpellCheckerbrandbrand_spellchecker0.3truestring
要先有一个searchComponent,上面只是一个例子,brand是后面会用到的spellcheck.dictionary的标识,field是指在建索引过程中哪个field需要做spellcheck
accuracy是指字符串之间的distance要小于accuracy*query长度。
queryAnalyzerFieldType是指用哪个queryAnalyzer来进行分词,一般不分词,因为如果找到了任意一个term,表明这个query就是没问题的,就不会启动spellcheck功能。
falsefalse3spellcheck
brandfalsefalse3brand_spellcheck
这里是两个不同的requestHandler,设置spellcheck.dictionary可以指定使用哪个spellchecker来做拼写检查
如果要根据不同的field或者是使用不同的距离方法来进行拼写检查,就需要指定不同的spellchecker。或者新建一个requestHandler(这里不建议这样做,只会令solrconfig.xml文件看起来臃肿冗余)。但是,如果是同一个requestHandler里面要用好几个spellcheck,则需要满足它们的距离测量方法以及accuracy是相同的,否则只能使用不同的requestHandler。
注意在requestHandler里面的最后有一个segment
brand_spellcheck
这个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结果也有一个排序策略可供选择
freq
默认是根据距离排名,也可以根据frequency或者是自定义排名
一般比较重要比较基本的用法就是这些,其他功能就可以参考solr的手册来使用了
SpellCheckComponent