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

栏目: 后端 · 发布时间: 6年前

内容简介:公司目前业务系统偏向后台系统,目前包含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版本的分词器。

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

解压zip包,命令行移动到解决后的包下,执行mvn 打包命令(没有maven的自行下载):

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

mvn打包命令: mvn package

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

看到 BUILD SUCCESS 即为打包成功。

此时, target 目录已经生成,进入 E:\Elasticsearch\elasticsearch-analysis-pinyin-master\target\releases 目录下,解压里面的zip包,生成如下文件:

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

将这三个文件拷贝到es安装目录下的 plugins 目录下的 pinyin 文件夹中(pinyin文件夹需要自己创建,可以任意命名):

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

重启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);
复制代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

New Dark Age

New Dark Age

James Bridle / Verso Books / 2018-7-17 / GBP 16.99

As the world around us increases in technological complexity, our understanding of it diminishes. Underlying this trend is a single idea: the belief that our existence is understandable through comput......一起来看看 《New Dark Age》 这本书的介绍吧!

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具