频道栏目
IT货架 > > 正文
SolrSuggestion自动联想
网友分享于:Jun 12, 2018 11:38:51 PM    来源: IT货架   

Solr Suggest的配置要点

Suggest字段的选择

因为现在整个平台是基于SPU的构建的,因此决定采用SPU关键属性组合及类目名称来做Suggest的索引字段。首先在schema.xml中添加存储Suggest的新字段,如下:

 <field name="suggestion" type="string" indexed="true" stored="true"termVectors="true" multiValued="true"/>

在该field的配置中,FieldType的选择非常关键,通常建议智能提示字段的FieldType不需要配置复杂的Analyzer,避免因为分词导致智能提示的词失控。

配置Suggest模块

在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><lst name="defaults"><str name="spellcheck">true</str><str name="spellcheck.dictionary">suggest</str><str name="spellcheck.onlyMorePopular">true</str><str name="spellcheck.extendedResults">false</str><str name="spellcheck.count">10</str><str name="spellcheck.collate">true</str></lst><arr name="components"><str>suggest</str></arr></requestHandler><queryConverter name="phraseQueryConverter"class="com.hqb360.solr.suggest.PhraseQueryConverter"/>

上述配置的具体说明可参照solr的官方文档,下面对其中几个容易疑惑的地方做一下说明

queryAnalyzerFieldType 配置参数
queryAnalyzerFieldType 参数指定访问suggest的SearchHandler处理查询参数的Analyzer,如果指定的Analyzer很复杂的话,会导致suggest 返回的结果不符合预期。在这们项目中,我们现希望Analyzer不对查询做任何的改变,因此选择string。spellcheck.dictionary的值必须与searchComponent中spellchecker标签下<str name=”name”>suggest</str>配置对应。Suggest返回结果的排序
spellchecker组件中的comparatorClass参数可配置Suggest返回结果的排序,目前有如下几种可选方案:

 

Empty – in which case the default is used.score – explicitly choose the default casefreq – Sort by frequency first, then score.A fully qualified class name – Provide a custom comparator that implements Comparator<SuggestWord>.
可查看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

结果如下:

<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>

需要注意的点

重启Solr后,第一次访问时需要在Suggest请求中添加spellcheck.build=true参数,用于创建spellchecker的索引。通过threshold参数来限制一些不常用的词不出现在智能提示列表中,当这个值设置过大时,可能导致结果太少,需要引起注意。

存在的问题

目前主要存在的问题是使用freq排序算法,返回的结果完全基于索引中字符的出现次数,没有兼顾用户搜索词语的频率,因此无法将一些热门词排在更靠前的位置。这块可定制SuggestWordScoreComparator来实现,目前还没有着手做这件事情。

广告服务联系QQ:1134687142 | 网站地图

版权所有: IT货架- 内容来自互联网,仅供用于技术学习,请遵循相关法律法规. 京ICP备11030978号-1