<转>Solr Suggest实现搜索智能提示
?
搜索的智能提示目前是各大搜索的标配应用,主要作用是避免用户输入错误的搜索词,同时将用户引导到相应的关键词搜索上。
作为一个应用广泛的搜索引擎系统,Solr内置了智能提示功能,它在Solr里叫做Suggest模块.该模块可选择基于提示词文本做智能提示,还支持通过针对索引的某个字段建立索引词库做智能提示。在诸多文档中都推荐使用基于索引来做智能提示,因此我们目前的实现也是采取该方案。
因为现在整个平台是基于SPU的构建的,因此决定采用SPU关键属性组合及类目名称来做Suggest的索引字段。首先在schema.xml中添加存储Suggest的新字段,如下:
<field name="suggestion" type="string" indexed="true" stored="true" termVectors="true" multiValued="true"/>
在该field的配置中,FieldType的选择非常关键,通常建议智能提示字段的FieldType不需要配置复杂的Analyzer,避免因为分词导致智能提示的词失控。
在solrconfig.xml文件中配置Suggest模块,其中Suggest依赖于SpellChecker模块,所以这两个都需要配置。具体配置如下:
<searchComponent name="suggest"> <str name="queryAnalyzerFieldType">string</str> <lst name="spellchecker"> <str name="name">suggest</str> <str name="classname">org.apache.solr.spelling.suggest.Suggester</str> <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str> <str name="field">suggestion</str> <!-- the indexed field to derive suggestions from --> <float name="threshold">0.0001</float> <str name="spellcheckIndexDir">spellchecker</str> <str name="comparatorClass">freq</str> <str name="buildOnOptimize">true</str> <!--<str name="buildOnCommit">true</str>--> </lst> </searchComponent> <requestHandler class="com.hqb360.solr.suggest.PhraseQueryConverter"/>
上述配置的具体说明可参照solr的官方文档,下面对其中几个容易疑惑的地方做一下说明
?
配置完成之后,重启Solr后,访问如下链接
http://192.168.100.10:8080/solr/suggest?q=motorola%20x
结果如下:
<response> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">0</int> </lst> <lst name="spellcheck"> <lst name="suggestions"> <lst name="motorola x"> <int name="numFound">10</int> <int name="startOffset">0</int> <int name="endOffset">10</int> <arr name="suggestion"> <str>motorola xoom 3g版</str> <str>motorola xt875</str> <str>motorola xt300</str> <str>motorola xt883</str> <str>motorola xt702</str> <str>motorola xt806</str> <str>motorola xt800</str> <str>motorola xt502</str> <str>motorola xt882</str> <str>motorola xt316</str> </arr> </lst> <str name="collation">motorola xoom 3g版</str> </lst></lst></response>
目前主要存在的问题是使用freq排序算法,返回的结果完全基于索引中字符的出现次数,没有兼顾用户搜索词语的频率,因此无法将一些热门词排在更靠前的位置。这块可定制SuggestWordScoreComparator来实现,目前还没有着手做这件事情。
链接:http://www.colorfuldays.org/tag/solr/
?