内容简介:公司目前业务系统偏向后台系统,目前包含500W+数据,在许多列表中支持各种条件查询,含有大量的模糊搜索条件。由于在mysql中模糊查询效率低下,目前公司已使用es搜索引擎进行条件搜索。es版本如下:elasticsearch版本:6.3.2java client版本:rest-high-level-client 6.3.2
公司目前业务系统偏向后台系统,目前包含500W+数据,在许多列表中支持各种条件查询,含有大量的模糊搜索条件。由于在 mysql 中模糊查询效率低下,目前公司已使用es搜索引擎进行条件搜索。es版本如下:
elasticsearch版本:6.3.2
java client版本:rest-high-level-client 6.3.2
问题:业务需要部分中文字段进行a-z拼音排序。
1.实现方案
网上查阅资料,es使用 elasticsearch-analysis-pinyin 分词插件可实现 排序 效果。具体原理是通过拼音分词器将汉字分为只含有首字母的字符串(例如:刘德华----> ldh),之后通过查询此分词字段实现排序。
2.说干就干
2.1下载、安装拼音分词器
elasticsearch-analysis-pinyin下载网址: github.com/medcl/elast…
根据自己的es版本下载对应的拼音分词器版本,由于我的是6.3.2的版本,因此下载master版本的分词器。
解压zip包,命令行移动到解决后的包下,执行mvn 打包命令(没有maven的自行下载):
mvn打包命令: mvn package
看到 BUILD SUCCESS
即为打包成功。
此时, target
目录已经生成,进入 E:\Elasticsearch\elasticsearch-analysis-pinyin-master\target\releases
目录下,解压里面的zip包,生成如下文件:
将这三个文件拷贝到es安装目录下的 plugins
目录下的 pinyin
文件夹中(pinyin文件夹需要自己创建,可以任意命名):
重启es,拼音分词器到此安装完成。
2.2索引setting、mapping设置
首先,创建索引时自定义索引setting:
由于我们需要将拼音分词器和ik分词器同时使用,因此在配置分析器时配置了两个。
PUT /pinyinTestIndex { "index" : { "analysis" : { "analyzer" : { "default" : { //默认分词器使用ik分词器 "tokenizer" : "ik_max_word" }, "pinyin_analyzer" : { //自定义拼音分词器 "tokenizer" : "my_pinyin" } }, "tokenizer" : { "my_pinyin" : { //拼音分词器配置 "type" : "pinyin", "keep_first_letter":true, "keep_separate_first_letter" : false, "keep_full_pinyin" : false, "limit_first_letter_length" : 20, "lowercase" : true, "keep_none_chinese":false } } } } } 复制代码
在拼音分词器配置中含有几个配置,这些配置决定了能不能按照你的要求进行排序。 keep_first_letter
:包含首字母,例如:刘德华> ldh,default:true。
keep_separate_first_letter
:将字母分割,例如:刘德华> l,d,h,default:false。
keep_full_pinyin
:包含全拼拼音,例如:刘德华> [ liu,de,hua],default:true。
limit_first_letter_length
:设置first_letter结果的最大长度,default:16。
lowercase
:小写非中文字母,default:true。
keep_none_chinese
: 不在结果中保留非中文字母或数字,default:true。
因此,我的拼音分词器会有如下效果 -- 如果字符串为刘德华,经过分词后成为ldh,如果字符串为刘德华A,经过分词后成为ldha,如果字符串为刘德华1,经过分词后成为ldh1。此种分词效果满足我们的业务需求,当然还有其他的配置可选,来满足不同的业务需求。
其他配置可参考elasticsearch-analysis-pinyin下载网址中的 README.md
选项进行选取。
之后,进行索引mapping文件的建立,保证字段使用拼音分词器:
POST /pinyinTestIndex/dev/_mapping { "dev": { "properties": { "name": { //name字段 "type": "text", //字符串类型支持分词 "analyzer": "pinyin_analyzer", //使用拼音分词 "fields": { //包含的另一种不分词效果 "keyword": { "type": "keyword", "ignore_above": 256 } } } } } } 复制代码
到此,索引创建完毕。
2.3 使用java client排序查询
//search api SearchSourceBuilder source = new SearchSourceBuilder(); //排序字段 SortOrder.ASC 升序 SortOrder.DESC 降序 source.sort("name", SortOrder.ASC); //索引信息 SearchRequest searchRequest = new SearchRequest("pinyinTestIndex"); searchRequest.types("dev"); searchRequest.source(source); //查询 SearchResponse response = client.search(searchRequest); 复制代码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- ES拼音前缀索引
- solr搜索配置拼音检索
- golang实现中文汉字转拼音
- 语音识别语言模型和拼音字典文件制作
- Windows Phone开发手记-WinRT下分组拼音的实现
- HTML5:给汉字加拼音?让我秀给你看
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。