文档章节

Solr Suggest实现搜索智能提示

hiqj
 hiqj
发布于 2014/04/18 17:35
字数 1142
阅读 360
收藏 0

资料来源:http://www.colorfuldays.org/category/program/solr/

智能提示简介

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

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

 <searchComponent class="solr.SpellCheckComponent" 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="org.apache.solr.handler.component.SearchHandler"

                    name="/suggest">

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

    • freq – 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来实现,目前还没有着手做这件事情。

参考文档

SpellCheckComponent
Suggester

Posted in solr

Tags: solr, spellchecker, suggest

Permalink 5 Comments

 

本文转载自:http://www.colorfuldays.org/category/program/solr/

hiqj
粉丝 24
博文 208
码字总数 92586
作品 0
渝北
程序员
私信 提问
搜索引擎关键字智能提示的一种实现

搜索引擎关键字智能提示的一种实现 美团技术团队 问题背景 搜索关键字智能提示是一个搜索应用的标配,主要作用是避免用户输入错误的搜索词,并将用户引导到相应的关键词上,以提升用户搜索体...

宇智波带土
2014/06/06
305
1
solr搜索智能提示Suggest

solr1.4以后实现的智能提示,方便用户输入搜索 Suggest配置 <searchComponent name="suggest" class="solr.SpellCheckComponent"><str name="queryAnalyzerFieldType">string</str><lst nam......

lavafree
2012/12/21
3.5K
12
solr suggest推荐功能 推荐无结果

想用solr实现一个推荐功能,类似在百度搜“军”,百度搜索框下方会提示“军事”“军事网”等 ,但是推荐搜索结果为空。 solr的版本是4.10.2,字段名称为name,name的值为“军事博物馆”,用i...

小杰仔儿
2015/03/13
568
0
【转】solr+ajax智能拼音详解---solr跨域请求

  本文转自:http://blog.csdn.net/wangzhaodong001/article/details/8529090 最近刚做完solr的ajax智能拼音。总结一下。 前端:jQueryAutoComplete插件。插件详见http://download.csdn.ne...

无声胜有声
2015/12/16
0
0
Apache Solr 3.3 发布

Apache Solr 3.3 发布。Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。Apache Solr 中存储的资源是以 Document 为对象进行存储的。每...

小卒过河
2011/07/01
1.1K
1

没有更多内容

加载失败,请刷新页面

加载更多

一分快3走势规律技巧一分快3顺口溜公式

小夏QV:46~39~82~76 :包含与数字运算有关的类。 常用静态方法 abs():取绝对值,Math.abs(-100)=100 floor():向下取值,Math.floor(10.7)=10 round():四舍五入. Collections类:addAll(Col...

上官的如风
12分钟前
38
0
通过SSH传输文件[关闭]

我正在命令行上SSH到远程服务器,并尝试使用scp命令将目录复制到我的本地计算机上。 但是,远程服务器返回此“使用”消息: [Stewart:console/ebooks/discostat] jmm% scp -p ./styles/usa...

技术盛宴
15分钟前
43
0
Learn to Use CURL Command in Linux With These Examples

What is CURL ? CURL is a tool for data transfer. It is also available as a library for developers and as a CLI for terminal-based use cases. Both have the same engine inside (Tr......

Ciet
32分钟前
22
0
索引相关问题

为什么要使用索引 因为使用索引可以避免全表扫描去查找数据,提升检索效率。 什么样的信息能成为索引 主键、唯一键(使数据具备一定的区分性的字段)都能成为索引。 索引的数据结构 主流的是...

潦草的犀牛
33分钟前
39
0
如何在NSString中添加百分号

我想在数字后加一个百分号。 大概是75%。 我该怎么做? 我试过了: [NSString stringWithFormat:@"%d\%", someDigit]; 但这对我没有用。 #1楼 如果在某些情况下有帮助,则可以使用unicode...

javail
今天
55
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部