公司目前業務系統偏向後臺系統,目前包含500W+數據,在許多列表中支持各類條件查詢,含有大量的模糊搜索條件。因爲在mysql中模糊查詢效率低下,目前公司已使用es搜索引擎進行條件搜索。es版本以下:java
elasticsearch版本:6.3.2mysql
java client版本:rest-high-level-client 6.3.2git
問題:業務須要部分中文字段進行a-z拼音排序。github
網上查閱資料,es使用elasticsearch-analysis-pinyin分詞插件可實現排序效果。具體原理是經過拼音分詞器將漢字分爲只含有首字母的字符串(例如:劉德華----> ldh),以後經過查詢此分詞字段實現排序。sql
elasticsearch-analysis-pinyin下載網址:github.com/medcl/elast…api
根據本身的es版本下載對應的拼音分詞器版本,因爲個人是6.3.2的版本,所以下載master版本的分詞器。bash
解壓zip包,命令行移動到解決後的包下,執行mvn 打包命令(沒有maven的自行下載):app
mvn打包命令: mvn package
elasticsearch
看到 BUILD SUCCESS
即爲打包成功。maven
此時,target
目錄已經生成,進入E:\Elasticsearch\elasticsearch-analysis-pinyin-master\target\releases
目錄下,解壓裏面的zip包,生成以下文件:
將這三個文件拷貝到es安裝目錄下的plugins
目錄下的pinyin
文件夾中(pinyin文件夾須要本身建立,能夠任意命名):
重啓es,拼音分詞器到此安裝完成。
首先,建立索引時自定義索引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
}
}
}
}
}
}
複製代碼
到此,索引建立完畢。
//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);
複製代碼
升序效果:
降序效果:
實現拼音排序效果主要經過修改拼音分詞插件的配置,根據我的不一樣的業務需求,修改增長配置選項,達到不一樣的查詢效果。祝君好運。