elasticsearch版本:7.17.3
目标:实现对类型为text字段的中文排序
执行下面命令后,重启es即可
sudo bin/elasticsearch-plugin install analysis-icu
下面内容是创建了一个名为es_test的索引内容,其中包含名为fileName字段,以ik分词器分词,排序内容以icu分词器排序
PUT /es_test
{
"mappings":{
"properties":{
"fileName":{
"type":"text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart",
"fields": {
"sort": {
"type": "icu_collation_keyword",
"index": false,
"language": "zh",
"country": "pinyin"
}
}
}
}
}
}
GET es_test/_search
{
"sort": [
{
"fileName.sort": {
"order": "desc"
}
}
]
}
这里只写client.search中的内容,要想看如何完整的调用,可以看我此系列的其他文章
SortOptions sortOption = SortOptions.of(_1 -> _1.field(_2 -> _2.field("fileName.sort").order(SortOrder.Desc)));
SearchResponse<Map> search = client.search(_1 -> _1
.index(indexName)
//es默认返回10000条数据,加上此条配置才能返回全部条数
.trackTotalHits(_2 -> _2.enabled(true))
//查询参数
.query(queryBuilder.build()._toQuery())
.from(pageBegin)
.size(dto.getPageSize())
.sort(sortOption)
, Map.class);
执行以下命令,根据自己的版本对应的修改
bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-pinyin/releases/download/v7.17.3/elasticsearch-analysis-pinyin-7.17.3.zip
下面内容是创建了一个名为es_test的索引内容,其中包含名为fileName字段,以ik分词器分词,相当于还创建了一个名为pinyin的字段,用pinyin分词器支持排序功能
PUT /es_test
{
"settings": {
"analysis": {
"analyzer": {
"ik_max_word": {
"tokenizer": "ik_max_word"
},
"ik_smart": {
"tokenizer": "ik_smart"
},
"pinyin_analyzer": {
"tokenizer": "my_pinyin"
}
},
"tokenizer": {
"my_pinyin": {
"type": "pinyin",
"keep_separate_first_letter": false,
"keep_full_pinyin": true,
"keep_original": true,
"limit_first_letter_length": 16,
"lowercase": true,
"remove_duplicated_term": true,
"trim_whitespace": true
}
}
}
},
"mappings":{
"properties":{
"fileName":{
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart",
"fields": {
"pinyin": {
"type": "text",
"analyzer": "pinyin_analyzer",
"fielddata":true
}
}
}
}
}
}
POST es_test/_search
{
"sort": [
{
"fileName.pinyin": {
"order": "asc"
}
}
]
}
这里只写client.search中的内容,要想看如何完整的调用,可以看我此系列的其他文章
SortOptions sortOption = SortOptions.of(_1 -> _1.field(_2 -> _2.field("fileName.pinyin").order(SortOrder.Desc)));
SearchResponse<Map> search = client.search(_1 -> _1
.index(indexName)
//es默认返回10000条数据,加上此条配置才能返回全部条数
.trackTotalHits(_2 -> _2.enabled(true))
//查询参数
.query(queryBuilder.build()._toQuery())
.from(pageBegin)
.size(dto.getPageSize())
.sort(sortOption)
, Map.class);
还有其他的支持中文排序的实现方式,比如用smartcn分词器或者jieba分词器,具体大家可以自己多多尝试尝试