当前位置: 首页 > news >正文

elasticsearch实战---中文拼音A-Z排序(完美解决)

0.背景

公司目前业务系统偏向后台系统,目前包含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);
复制代码

2.4 查看结果

升序效果:

降序效果:

3.总结

实现拼音排序效果主要通过修改拼音分词插件的配置,根据个人不同的业务需求,修改增加配置选项,达到不同的查询效果。祝君好运。

相关文章:

  • NOIP2018 游记
  • Python 的经典设计格言,格言来源于 Python 但不限于 Python
  • 关于微信小程序登录,后端如何生成3rd_session?(后端为c#)
  • hadoop和spark的区别
  • 解决Composer 使用时要求输入授权用户名密码问题
  • Java实现视频网站的视频上传、视频转码、视频关键帧抽图, 及视频播放功能
  • gitlab 502问题解决
  • CEF与代理
  • VS2010安装与启动
  • jQuery快速入门
  • 线下比特币现金交易的区块链创企CoinText.io完成60万美元种子轮融资
  • SCOI2008着色方案(记忆化搜索)
  • 高性能iOS应用开发(二):应用的生命周期
  • Blockathon(2018)上海竞赛项目成果今天揭晓
  • 版本
  • @jsonView过滤属性
  • [nginx文档翻译系列] 控制nginx
  • CSS 提示工具(Tooltip)
  • js写一个简单的选项卡
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • SpiderData 2019年2月16日 DApp数据排行榜
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 安卓应用性能调试和优化经验分享
  • 大数据与云计算学习:数据分析(二)
  • 后端_ThinkPHP5
  • 基于HAProxy的高性能缓存服务器nuster
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 山寨一个 Promise
  • 什么是Javascript函数节流?
  • 使用 Docker 部署 Spring Boot项目
  • 数组的操作
  • 说说动画卡顿的解决方案
  • 一份游戏开发学习路线
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 进程与线程(三)——进程/线程间通信
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​学习一下,什么是预包装食品?​
  • #include<初见C语言之指针(5)>
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (ibm)Java 语言的 XPath API
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (办公)springboot配置aop处理请求.
  • (分享)自己整理的一些简单awk实用语句
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (译)计算距离、方位和更多经纬度之间的点
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)Linux下编译安装log4cxx
  • (转)树状数组
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • *** 2003
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料