Solr Suggest说明

Solr Suggest实现搜索智能提示

Posted by iamxhu on 2012/01/12 Leave a comment (4) Go to comments

智能提示简介

搜索的智能提示目前是各大搜索的标配应用,主要作用是避免用户输入错误的搜索词,同时将用户引导到相应的关键词搜索上

Solr Suggestion智能提示模块

作为一个应用广泛的搜索引擎系统,Solr内置了智能提示功能,它在Solr里叫做Suggest模块.该模块可选择基于提示词文本做智能提示,还支持通过针对索引的某个字段建立索引词库做智能提示。在诸多文档中都推荐使用基于索引来做智能提示,因此我们目前的实现也是采取该方案。

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模块,所以这两个都需要配置。具体配置如下:

 <searchComponentclass="solr.SpellCheckComponent" name="suggest">

       <str name="queryAnalyzerFieldType">string</str>

       <lst name="spellchecker">

            <strname="name">suggest</str>

            <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>

            <strname="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str>

            <strname="field">suggestion</str>

            <!-- the indexed field to derivesuggestions from -->

            <floatname="threshold">0.0001</float>

            <strname="spellcheckIndexDir">spellchecker</str>

            <strname="comparatorClass">freq</str>

            <strname="buildOnOptimize">true</str>

 

            <!--<str name="buildOnCommit">true</str>-->

       </lst>

   </searchComponent>

   <requestHandlerclass="org.apache.solr.handler.component.SearchHandler"

                   name="/suggest">

       <lst name="defaults">

            <strname="spellcheck">true</str>

            <strname="spellcheck.dictionary">suggest</str>

            <strname="spellcheck.onlyMorePopular">true</str>

            <strname="spellcheck.extendedResults">false</str>

            <strname="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
参数指定访问suggestSearchHandler处理查询参数的Analyzer,如果指定的Analyzer很复杂的话,会导致suggest返回的结果不符合预期。在这们项目中,我们现希望Analyzer不对查询做任何的改变,因此选择string

·        spellcheck.dictionary的值必须与searchComponentspellchecker标签下<strname=”name”>suggest</str>配置对应。

·        Suggest返回结果的排序
spellchecker
组件中的comparatorClass参数可配置Suggest返回结果的排序,目前有如下几种可选方案:

o    Empty – in whichcase the default is used.

o    score –explicitly choose the default case

o    freq – Sort byfrequency first, then score.

o    A fullyqualified class name – Provide a custom comparator that implementsComparator<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来实现,目前还没有着手做这件事情。

参考文档

SpellCheckComponent
Suggester

 


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值