`

<转>Solr Suggest实现搜索智能提示

 
阅读更多

 

智能提示简介

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

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

链接:http://www.colorfuldays.org/tag/solr/

 

分享到:
评论
2 楼 panghaoyu 2017-03-17  
实现一个智能提示功能需要ajax、数据库、jsp/php、算法等很多知识,
如果数据量大,还需要特殊优化
一个小功能,花费太大精力很不划算
92find.com上的一个js插件实现了搜索框自动补全托管服务,
只要一行javascript代码就可以实现百度、淘宝搜索框提示的全部功能
比如:汉字拼音匹配、拼音前缀匹配、模糊搜索、智能容错,还可以自定义提示词汇及其排序权重
花五分钟我的网站就可以部署同百度、淘宝一样强大好用的输入提示功能
同时兼容IE、Firefox、Safari、Chrome、Opera各种浏览器
兼容ios、Android、Windows
1 楼 panghaoyu 2017-03-15  
实现一个智能提示功能需要ajax、数据库、jsp/php、算法等很多知识,
如果数据量大,还需要特殊优化
一个小功能,花费太大精力很不划算
我使用了92find.c-o-m的搜索框智能提示功能托管服务,
只要一行javascript代码就可以实现百度、淘宝搜索框提示的全部功能
比如:汉字拼音匹配、拼音前缀匹配、模糊搜索、智能容错,还可以自定义提示词汇及其排序权重
花五分钟我的网站就可以部署同百度、淘宝一样强大好用的输入提示功能
同时兼容IE、Firefox、Safari、Chrome、Opera各种浏览器
兼容ios、Android、Windows

相关推荐

    t淘淘商城项目 商城项目 视频和源码教程 详细

    &lt;groupId&gt;org.apache.solr&lt;/groupId&gt; &lt;artifactId&gt;solr-solrj&lt;/artifactId&gt; &lt;version&gt;${solrj.version}&lt;/version&gt; &lt;/dependency&gt; &lt;/dependencies&gt; &lt;/dependencyManagement&gt; &lt;build&gt; &lt;finalName&gt;${project....

    nutch2.3.1安装文档教程

    &lt;value&gt;org.apache.nutch.indexer.solr.SolrIndexer&lt;/value&gt; &lt;/property&gt; &lt;property&gt; &lt;name&gt;searcher.class&lt;/name&gt; &lt;value&gt;org.apache.nutch.searcher.solr.SolrSearcher&lt;/value&gt; &lt;/property&gt; &lt;property&gt; ...

    使用xml更新solr索引

    `&lt;doc&gt;`元素可以有可选属性`boost`,用于设置文档的评分,影响搜索结果的排序。默认值为1.0,更大的值会导致文档在搜索结果中排名更高。例如: ```xml &lt;add&gt; &lt;doc boost="2.5"&gt; &lt;field name="employeeId"&gt;05991&lt;/...

    hanlp-lucene-plugin:HanLP中文分词Lucene插件,支持包括Solr内置的基于Lucene的系统

    Maven &lt; dependency&gt; &lt; groupId&gt;com.hankcs.nlp&lt;/ groupId&gt; &lt; artifactId&gt;hanlp-lucene-plugin&lt;/ artifactId&gt; &lt; version&gt;1.1.7&lt;/ version&gt; &lt;/ dependency&gt;Solr快速上手将和共两个jar放入${webapp}/WEB-INF/li

    手把手教你 对 solr8 配置用户登录验证 涉及到的配置文件

    Solr 是一个流行的开源搜索引擎,提供了全文搜索、高级查询语法、多语言支持等功能。在 Solr 8 中,为了确保系统的安全性和数据的隐私性,配置用户登录验证是非常重要的步骤。本文将详细介绍如何对手动配置 Solr 8 ...

    Solr 学习(3) —-Solr 数据导入 <一>DIH简单使用

    NULL 博文链接:https://martin3000.iteye.com/blog/1328833

    使用java实现solr-7.1.0的api和solr最新支持的sql查询

    &lt;groupId&gt;org.apache.solr&lt;/groupId&gt; &lt;artifactId&gt;solr-solrj&lt;/artifactId&gt; &lt;version&gt;7.1.0&lt;/version&gt; &lt;/dependency&gt; ``` 接下来,你需要配置Solr服务器的连接信息,如主机地址、端口和核心名。然后,创建一个`...

    ikanalyzer-solr

    &lt;fieldType name="text_ik" class="solr.TextField" positionIncrementGap="100"&gt; &lt;analyzer type="index"&gt; &lt;tokenizer class="org.apache.lucene.analysis.cn.ik.analyzer.IKAnalyzer"/&gt; &lt;/analyzer&gt; &lt;analyzer...

    solrconfig.xml和schema.xml说明

    - **定义**:`&lt;dataDir&gt;${solr.data.dir:d:/Server/Solr/data}&lt;/dataDir&gt;` 这个节点定义了索引数据和日志文件的存放位置。默认情况下,如果没有指定其他路径,则会使用 `d:/Server/Solr/data` 作为存储路径。这对于...

    solr追加と削除

    标题“solr追加と削除”涉及到的是Apache Solr的相关操作,Solr是一个流行的开源全文搜索引擎,常用于实现高效、可扩展的信息检索服务。在这个主题下,我们主要讨论如何在Solr中进行数据的添加和删除。 首先,我们...

    Apache Solr 搜索架构分析外部设计篇PDF

    ### Apache Solr搜索架构分析——外部设计篇 #### 一、引言 随着互联网技术的飞速发展,数据量呈爆炸性增长,高效且准确地检索海量数据成为了现代信息技术领域的一项重要挑战。Apache Solr作为一款开源的企业级...

    solr4.7服务搭建

    ### Solr 4.7 服务搭建详细指南 #### 一、环境准备 为了搭建 Solr 4.7 服务,我们需要确保以下环境已经准备好: ...通过以上步骤,用户可以成功搭建并配置好 Solr 4.7 服务,实现高效的数据索引和搜索功能。

    solr在java中的使用实例代码

    在Java中使用Apache Solr,主要依赖于SolrJ库,这是一个专门用于与Solr进行交互的Java客户端。...通过上述代码,我们可以实现对Solr索引的增、删、查、改操作,从而在Java应用中充分利用Solr的强大搜索功能。

    详解spring中使用solr的代码实现

    如果你不打算使用Spring Data Solr提供的模板方式,而是直接使用Solr的原生API,可以自定义`SolrCloudServerFactoryBean`类,实现`FactoryBean&lt;SolrServer&gt;`和`InitializingBean`接口,以便在Spring容器初始化时进行...

    solr demo文件txt版

    - 提取所有 `&lt;a&gt;`, `&lt;img&gt;`, `&lt;script&gt;` 和 `&lt;link&gt;` 元素的链接,并打印相关信息。 - `&lt;a&gt;` 标签代表超链接。 - `&lt;img&gt;` 标签用于显示图像。 - `&lt;script&gt;` 标签用于包含JavaScript脚本。 - `&lt;link&gt;` 标签用于...

    solr7.5_ik分词器,suggest配置源文件文件

    Suggest组件则为Solr提供了自动补全和提示功能,极大地提升了用户体验。 标题中的“solr7.5_ik分词器,suggest配置源文件”指的是在Solr 7.5版本中使用Ik分词器和Suggest组件进行配置和使用的源文件。Ik分词器是...

    Solr学习笔记。。

    - `dataDir`:定义索引存储位置,默认为`solr/data`,可通过配置指定其他路径,如`&lt;dataDir&gt;/var/data/solr&lt;/dataDir&gt;`。 - `autoCommit`:控制索引的自动提交。默认情况下,Solr将更改存储在内存中,直到接收到...

    solr的安装使用步骤

    &lt;groupId&gt;org.apache.solr&lt;/groupId&gt; &lt;artifactId&gt;solr-solrj&lt;/artifactId&gt; &lt;version&gt;4.10.3&lt;/version&gt; &lt;/dependency&gt; &lt;!-- 其他依赖项 --&gt; &lt;/dependencies&gt; ``` 3. **编写代码**:利用 SolrJ API 实现数据...

    LoremIpsumSearch:包含与 lucene 和 solr 一起使用的搜索算法

    LoremIpsum搜索 包含与 lucene 和 solr 一起使用的搜索算法... export CLASSPATH="&lt;lucene&gt;/lucene/replicator/lib/*:&lt;nutch&gt;/build/*:&lt;nutch&gt;/build/lib/*:&lt;lucene&gt;/solr/dist/*:&lt;lucene&gt;/solr/ dist/solrj-lib/*:*:.

Global site tag (gtag.js) - Google Analytics