智能提示简介
搜索的智能提示目前是各大搜索的标配应用,主要作用是避免用户输入错误的搜索词,同时将用户引导到相应的关键词搜索上。
Solr Suggestion智能提示模块
作为一个应用广泛的搜索引擎系统,Solr内置了智能提示功能,它在Solr里叫做Suggest模块.该模块可选择基于提示词文本做智能提示,还支持通过针对索引的某个字段建立索引词库做智能提示。在诸多文档中都推荐使用基于索引来做智能提示,因此我们目前的实现也是采取该方案。
Solr Suggest的配置要点
Suggest字段的选择
因为现在整个平台是基于SPU的构建的,因此决定采用SPU关键属性组合及类目名称来做Suggest的索引字段。首先在schema.xml中添加存储Suggest的新字段,如下:
termVectors="true" multiValued="true"/>
在该field的配置中,FieldType的选择非常关键,通常建议智能提示字段的FieldType不需要配置复杂的Analyzer,避免因为分词导致智能提示的词失控。
配置Suggest模块
在solrconfig.xml文件中配置Suggest模块,其中Suggest依赖于SpellChecker模块,所以这两个都需要配置。具体配置如下:
string
suggest
org.apache.solr.spelling.suggest.Suggester
org.apache.solr.spelling.suggest.tst.TSTLookup
suggestion
0.0001
spellchecker
freq
true
name="/suggest">
true
suggest
true
false
10
true
suggest
class="com.hqb360.solr.suggest.PhraseQueryConverter"/>
上述配置的具体说明可参照solr的官方文档,下面对其中几个容易疑惑的地方做一下说明
queryAnalyzerFieldType 配置参数
queryAnalyzerFieldType参数指定访问suggest的SearchHandler处理查询参数的Analyzer,如果指定的Analyzer很复杂的话,会导致suggest返回的结果不符合预期。在这们项目中,我们现希望Analyzer不对查询做任何的改变,因此选择string。
spellcheck.dictionary的值必须与searchComponent中spellchecker标签下suggest配置对应。
Suggest返回结果的排序
spellchecker组件中的comparatorClass参数可配置Suggest返回结果的排序,目前有如下几种可选方案:
Empty – in which case the default is used.
score – explicitly choose the default case
freq – Sort by frequency first, then score.
A fully qualified class name – Provide a custom comparator that implements Comparator.
可查看SuggestWordScoreComparator类了解更多细节
QueryConverter定制
上面的配置中,我们定制了自己的QueryConverter,主要原因是Solr默认的SpellQueryConvert是根据空格对查询参数做分隔,导致 “nokia e”这样的字符被当作“nokia”,“e”这样的两个字符处理,不符合我们的要求。定制的PhraseQueryConverter代码,需要打成jar包,放到Solr能访问到的目录下,在我们系统中是${solr.solr.home}/lib目录。
Suggest测试
配置完成之后,重启Solr后,访问如下链接
http://192.168.100.10:8080/solr/suggest?q=motorola%20x
结果如下:
0
0
10
0
10
motorola xoom 3g版
motorola xt875
motorola xt300
motorola xt883
motorola xt702
motorola xt806
motorola xt800
motorola xt502
motorola xt882
motorola xt316
motorola xoom 3g版
需要注意的点
重启Solr后,第一次访问时需要在Suggest请求中添加spellcheck.build=true参数,用于创建spellchecker的索引。
通过threshold参数来限制一些不常用的词不出现在智能提示列表中,当这个值设置过大时,可能导致结果太少,需要引起注意。
存在的问题
目前主要存在的问题是使用freq排序算法,返回的结果完全基于索引中字符的出现次数,没有兼顾用户搜索词语的频率,因此无法将一些热门词排在更靠前的位置。这块可定制SuggestWordScoreComparator来实现,目前还没有着手做这件事情。
参考文档
Posted insolr