通过Solr的Suggest实现提示词

标签: solr suggest | 发表时间:2016-06-12 16:20 | 作者:nettm
出处:http://www.iteye.com
需求:在Web端或移动设备上实现用户输入汉字或汉字的首字母,提供关联词提示。

解决方案:通过Solr提供的Suggest实现此功能,Solr版本为4.10.4

在Solr的配置文件solrconfig.xml文件中修改Suggest的配置,通过提示词文件构建搜索索引:

<searchComponent name="suggest" class="solr.SuggestComponent">
<lst name="suggester">
  <str name="name">mySuggester</str>
  <str name="lookupImpl">AnalyzingLookupFactory</str>
  <str name="dictionaryImpl">FileDictionaryFactory</str>
  <str name="field">suggest</str>
  <str name="sourceLocation">suggest.txt</str>
  <str name="suggestAnalyzerFieldType">string</str>
  <str name="buildOnOptimize">false</str>
</lst>
</searchComponent>
<requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy">
<lst name="defaults">
  <str name="suggest">true</str>
  <str name="suggest.count">5</str>
</lst>
<arr name="components">
  <str>suggest</str>
</arr>
</requestHandler>


参数说明:
name:suggester的名字,如果设置多个,可以在请求中指定。
lookupImpl:查找方式的具体实现
dictionaryImpl:字典的具体实现
field:搜索的字段
sourceLocation:字典文件
suggestAnalyzerFieldType:字段的类型
buildOnOptimize:何时创建拼写索引
suggest.count:返回的搜索结果的数量

因为要同时提供汉字和汉字拼音首字母的搜索,因此在构建字典文件时需要进行特殊处理,字典文件样例如下:

abesb|阿巴二氏病
阿巴二氏病|abesb
abkw|阿巴卡韦
阿巴卡韦|abkw
abkwsfd|阿巴卡韦双夫定
阿巴卡韦双夫定|abkwsfd
abkwsfdp|阿巴卡韦双夫定片
阿巴卡韦双夫定片|abkwsfdp


这样做就从业务需求上可以满足,但索引量成倍增多,在数据量不是特别大的时候性能问题基本可以忽略。
搜索测试的链接如下:
http://127.0.0.1:8080/solr/metis/suggest?qt=suggest&suggest.dictionary=mySuggester&wt=json&suggest.q=天
返回结果如下:

{
- responseHeader:  {
    - status: 0,
    - QTime: 1
- },
- suggest:  {
    - mySuggester:  {
        - 天:  {
            - numFound: 5,
            - suggestions:  [
                - {
                    - term: "天一止咳|tyzk",
                    - weight: 1,
                    - payload: ""
                - },
                - {
                    - term: "天一止咳糖浆|tyzktj",
                    - weight: 1,
                    - payload: ""
                - },
                - {
                    - term: "天丹通络|tdtl",
                    - weight: 1,
                    - payload: ""
                - },
                - {
                    - term: "天丹通络胶囊|tdtljn",
                    - weight: 1,
                    - payload: ""
                - },
                - {
                    - term: "天仙藤|txt",
                    - weight: 1,
                    - payload: ""
                - }
            - ]
        - }
    - }
- }
}


页面上通过jQuery的Autocomplete功能实现。
页面代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Hello World!</title>
    <link rel="stylesheet" href="./css/jquery-ui.css"/>
    <script src="./js/jquery-1.8.3.js"></script>
    <script src="./js/jquery-ui.js"></script>
    <script>
        $(function () {
            $("#tags").autocomplete({
                minLength: 0,
                delay: 100,
                source: []
            });
        });
    </script>
</head>
<body>
<div class="ui-widget">
    <label for="tags">Tags: </label>
    <input type="text" id="tags" oninput="search(this.value)"/>
</div>
</body>
<script>
    require('./renderer.js');
    require('devtron').install()
    var suggest = require('./apps/suggest/suggest.js');

    var search = function (keyword) {
        suggest.search(keyword).then(function (data) {
            console.log(data);
            $("#tags").autocomplete("option", "source", data);
        }, function (error) {
            console.error(error);
        });
    }
</script>
</html>

JavaScript部分的代码如下,需要对搜索结果的词进行格式化,这部分功能也可以通过后端实现,但性能没有前端从Solr获取结果处理快:

const http = require('http'),
    qs = require('querystring');

var Suggest = exports;

Suggest.search = function (keyword) {
    var data = {
        qt: 'suggest',
        'suggest.dictionary': 'mySuggester',
        'wt': 'json',
        'suggest.q': keyword
    };

    var content = qs.stringify(data);

    var options = {
        hostname: '127.0.0.1',
        port: 8080,
        path: '/solr/metis/suggest?' + content,
        method: 'GET'
    };

    var result = [];
    var promise = new Promise(function (resolve, reject) {
        var req = http.request(options, function (res) {
            res.on('data', function (chunk) {
                result = convert(keyword, chunk);
                resolve(result);
            });
        });

        req.on('error', function (e) {
            reject(new Error(e.message));
        });

        req.end();
    });

    return promise;
};

function convert(keyword, data) {
    var result = [];
    var json = JSON.parse(String(data));
    var num = parseInt(json.suggest.mySuggester[keyword].numFound);
    if (num > 0) {
        var matcher = new RegExp("^[A-Za-z0-9]+$", "i");
        var tmp = json.suggest.mySuggester[keyword].suggestions;
        for (var i = 0; i < tmp.length; i++) {
            var d = tmp[i]['term'].split('\|');
            if (matcher.test(d[0])) {
                var obj = {
                    label: d[0],
                    value: d[1]
                };
                result.push(obj);
            } else {
                result.push(d[0]);
            }
        }
    }

    return result;
}


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [solr suggest] 推荐:

通过Solr的Suggest实现提示词

- - JavaScript - Web前端 - ITeye博客
需求:在Web端或移动设备上实现用户输入汉字或汉字的首字母,提供关联词提示. 解决方案:通过Solr提供的Suggest实现此功能,Solr版本为4.10.4. 在Solr的配置文件solrconfig.xml文件中修改Suggest的配置,通过提示词文件构建搜索索引:. name:suggester的名字,如果设置多个,可以在请求中指定.

Lucene5学习之Suggest关键字提示

- - 编程语言 - ITeye博客
         首先需要搞清楚Suggest模块是用来解决什么问题的. Google我想大家都用过,当我们在搜索输入框里输入搜索关键字的时候,紧贴着输入框下方会弹出一个提示框,提示框里会列出Top N个包含当前用户输入的搜索关键字的搜索热词,如图:. 在Lucene中,这种搜索关键字自动提示功能是由Suggest模块提供的.

Solr SpellCheck 应用

- - 开源软件 - ITeye博客
通过对各类型的SpellCheck组件学习,完成项目拼写检查功能. 本文使用基于拼写词典的实现方式,solr版本为5.3.0. SpellCheck 简述. 拼写检查是对用户错误输入,响应正确的检查建议. 比如输入:周杰轮,响应:你是不是想找 周杰伦. Solr的拼写检查大致可分为两类,基于词典与基于Solr索引.

Solr DocValues详解

- - 企业架构 - ITeye博客
什么是docValues. docValues是一种记录doc字段值的一种形式,在例如在结果排序和统计Facet查询时,需要通过docid取字段值的场景下是非常高效的. 为什么要使用docValues. 这种形式比老版本中利用fieldCache来实现正排查找更加高效,更加节省内存. 倒排索引将字段内存切分成一个term列表,每个term都对应着一个docid列表,这样一种结构使得查询能够非常快速,因为term对应的docid是现成就有的.

solr的使用

- - Web前端 - ITeye博客
solr的原理不和大家一一讲述,主要讲solr在使用过程中的注意事项.  首先是安装solr,安装步骤省略. (不要说我懒,安装步骤导出都是. 成功之后 需要在solr里面建立一个针对你的业务的服务,我想建立一个叫做discuz的服务. 然后你在你的solr目录 :solr-5.5.3/server/solr/  下看见了discuz   ,这是你刚刚创建的,针对某一业务的整个搜索配置都是在这个目录下配置的.

Solr调优参考

- - 淘宝网通用产品团队博客
共整理三部分,第一部分Solr常规处理,第二部分针对性性处理,前者比较通用,后者有局限性. 务必根据具体应用特性,具体调节参数,对比性能. 具体应用需要全面去把控,各个因素一起起作用. 第一部分. E文连接 http://wiki.apache.org/solr/SolrPerformanceFactors.

Solr之缓存篇

- - 淘宝网综合业务平台团队博客
Solr在Lucene之上开发了很多Cache功能,从目前提供的Cache类型有:. 而每种Cache针对具体的查询请求进行对应的Cache. 本文将从几个方面来阐述上述几种Cache在Solr的运用,具体如下:. (1)Cache的生命周期. (2)Cache的使用场景. (3)Cache的配置介绍.

Solr主从备份

- - 研发管理 - ITeye博客
SOLR复制模式,是一种在分布式环境下用于同步主从服务器的一种实现方式,因之前提到的基于rsync的SOLR不同方式部署成本过高,被SOLR1.4版本所替换,取而代之的就是基于HTTP协议的索引文件传输机制,该方式部署简单,只需配置一个文件即可. 以下讲解具体操作步骤: . 步骤分主服务器和从服务器,允许有多个从服务器,即从服务器的配置一样.

solr相似匹配

- - CSDN博客推荐文章
相似匹配   在我们使用网页搜索时,会注意到每一个结果都包含一个 “相似页面” 链接,单击该链接,就会发布另一个搜索请求,查找出与起初结果类似的文档. Solr 使用 MoreLikeThisComponent(MLT)和 MoreLikeThisHandler 实现了一样的功能. 如上所述,MLT 是与标准 SolrRequestHandler 集成在一起的;MoreLikeThisHandler 与 MLT 结合在一起,并添加了一些其他选项,但它要求发布一个单一的请求.

Solr与Mysql集成指南

- sun - 草根网:互联网界的读者文摘
在《企业级搜索引擎Solr使用入门指南》及《企业级搜索引擎Solr交流》中对Solr的使用做了简单介绍. 在数据库驱动的应用中,当时采....