需求:在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;
}
分享到:
相关推荐
Suggest组件则为Solr提供了自动补全和提示功能,极大地提升了用户体验。 标题中的“solr7.5_ik分词器,suggest配置源文件”指的是在Solr 7.5版本中使用Ik分词器和Suggest组件进行配置和使用的源文件。Ik分词器是...
在Solr中,可以通过修改`conf/stopwords.txt`文件来定制停词列表。同时,在schema.xml中,可以使用`<filter class="solr.StopFilterFactory"`配置停词过滤器,指定停词列表和是否忽略大小写。 **4. 学习和开发文档*...
本章我们将深入探讨Solr如何实现搜索引擎,并结合《解密搜索引擎技术实战》第八章的代码实例进行详细解析。 1. **Solr的基本架构** Solr的核心架构包括索引、查询和处理三个主要部分。索引部分负责将数据转换为可...
总结来说,通过Solr的函数查询和自定义插件,我们可以灵活地构建电商搜索的自定义打分机制。这不仅可以提升搜索结果的相关性,还能更好地满足业务需求,比如强调热门商品、促销商品或者高评价商品。在实际操作中,...
Solr实现电扇站内搜索Solr实现电扇站内搜索Solr实现电扇站内搜索Solr实现电扇站内搜索
除了基本功能,Solr还可以实现如拼音搜索、同义词扩展、高亮显示搜索结果、相关性评分等高级特性,进一步提升用户体验。例如,通过添加拼音分析器,用户可以用汉字拼音进行搜索;利用Solr的自定义相似度函数,可以...
Solr 提供了若干种实现这个功能的插件,如Smart Chinese Analyzer(SCA)和IK Analyzer等,它们都支持拼音分词。 Smart Chinese Analyzer 是一个针对中文的智能分析器,它不仅提供了基础的分词功能,还能处理多音字...
通过将 HBase 与 Solr 集成,可以实现 HBase 的二级索引,从而提高查询性能。 CDH(Cloudera Distribution of Hadoop)是一款基于 Hadoop 的大数据处理平台,提供了完整的数据处理解决方案。通过使用 CDH,我们可以...
本文将围绕"基于Solr的多表join查询加速方法"这一主题,深入探讨如何在Solr中实现类似join的功能,并优化查询性能。 在Solr中模拟join操作通常有两种策略:嵌入式数据模型和外部数据源查询(ExternalFileField或...
SolrCloud是Solr的分布式实现,它利用ZooKeeper进行集群协调和配置管理。 7. **CloudSolrClient**:在SolrCloud模式下,应用通常使用CloudSolrClient与Solr集群通信,它可以自动处理数据路由和复制,确保高可用性和...
Suggest.js插件的作用是,在用户开始输入查询词的时候,通过与Solr服务器交互,快速检索出可能的补全词项,并将其显示给用户。 使用suggest.js插件,开发者需要进行以下几个步骤来完成自动补全功能的开发: 1. ...
这通过配置同义词文件和同义词过滤器实现。 2. **增量创建索引**:Solr支持增量索引,意味着当新的数据加入或已有数据发生变化时,无需重新构建整个索引,而是只更新受影响的部分。这对于大型数据集来说,既节省...
5. IK 分词器的应用:IK 分词器是 Solr 的一个插件,用于中文分词,可以实现自动添加用户搜索热词的方法,通过结合 wordcount 技术和 Redis 实现热词分析。 6. Solr 的维护方式:Solr 的维护可以通过手动添加或使用...
### Solr 4.7 服务搭建详细指南 #### 一、环境准备 为了搭建 Solr 4.7 服务,我们需要确保以下环境已经准备好: ...通过以上步骤,用户可以成功搭建并配置好 Solr 4.7 服务,实现高效的数据索引和搜索功能。
然后可以通过POST请求将数据导入Solr,Solr会自动进行分词、建立倒排索引等操作,从而实现快速的全文检索。 Lucene是Solr的核心搜索引擎库,它提供了基本的搜索功能,如倒排索引、TF-IDF评分等。而Solr则在其基础上...
分片有助于水平扩展,通过将数据分散在多台服务器上,实现更大的索引和查询吞吐量。 3. **Lucene库**:Solr是基于Lucene,一个强大的全文搜索引擎库。Solr在其之上添加了更多高级特性,如 faceting(分面搜索),...
通过分析Solr 6.2.0的源码,我们可以深入了解其内部工作机制,包括索引构建、查询处理、分布式协调等核心模块。源码中包含了丰富的注释和示例,帮助开发者深入理解Solr的设计思想和实现细节。 总结来说,Solr 6.2.0...
在 Solr 中,ikanalyzer 是一个重要的组件,它通过自定义Analyzer来实现中文的分词处理。Analyzer是Solr中处理文本的核心组件,负责将原始输入文本转换为一系列的关键词(Token),这些关键词可以被索引和搜索。ik...
标题中的"ik-analyzer-solr7...通过阅读手册、配置文件以及集成文档,用户可以有效地将IK Analyzer集成到Solr 7中,实现更精确的中文搜索功能。同时,自定义词典的使用使得IK Analyzer能更好地适应各种特定的业务场景。