詳解Elasticsearch如何實(shí)現(xiàn)簡(jiǎn)單的腳本排序
1、背景
我有一堆學(xué)生數(shù)據(jù),其中湖北省的學(xué)生需要排在所有數(shù)據(jù)的最前面。其余省正序排序,對(duì)于同一個(gè)省的數(shù)據(jù),按照年齡倒序排序。
2、分析
對(duì)于上方的排序需求,湖北省的學(xué)生數(shù)據(jù)需要排在前端,但是湖北省并不是一個(gè)字段,那么這個(gè)時(shí)候改如何實(shí)現(xiàn)呢?對(duì)于這種場(chǎng)景我們很容易就想到需要腳本script sort來(lái)實(shí)現(xiàn)。
3、構(gòu)建數(shù)據(jù)
3.1 mapping
PUT /index_person
{
"settings": {
"number_of_shards": 1
},
"mappings": {
"properties": {
"id":{
"type": "long"
},
"name": {
"type": "keyword"
},
"age": {
"type": "integer"
},
"province":{
"type": "keyword"
}
}
}
}
3.2 插入數(shù)據(jù)
PUT /index_person/_bulk
{"index":{"_id":1}}
{"id":1, "name":"張三","age":18,"province":"湖北"}
{"index":{"_id":2}}
{"id":2, "name":"李四","age":19,"province":"湖北"}
{"index":{"_id":3}}
{"id":3, "name":"王武","age":20,"province":"西安"}
{"index":{"_id":4}}
{"id":4, "name":"趙六","age":21,"province":"西安"}
{"index":{"_id":5}}
{"id":5, "name":"錢(qián)七","age":22,"province":"上海"}
4、實(shí)現(xiàn)
4.1 根據(jù)省升序排序
4.1.1 dsl
GET index_person/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"province": {
"order": "asc"
}
}
]
}
4.1.2 運(yùn)行結(jié)果

可以看到省升序的排序順序?yàn)?nbsp;上海、湖北、西安。
4.2 湖北省排第一
4.2.1 dsl
GET index_person/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"_script": {
"type": "number",
"order": "desc",
"script": {
"lang": "painless",
"source": """
if(params['_source']['province'] == '湖北'){
1
} else {
0
}
"""
}
}
}
]
}
4.2.2 運(yùn)行結(jié)果

通過(guò)如上的 script sort排序之后,就可以看到 湖北省已經(jīng)是排到第一位了。
4.3 湖北省排第一,其余省升序排序,按照年齡倒序
4.3.1 dsl
GET index_person/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"_script": {
"type": "number",
"order": "desc",
"script": {
"lang": "painless",
"source": """
if(params['_source']['province'] == '湖北'){
1
} else {
0
}
"""
}
}
},
{
"province": {
"order": "asc"
},
"age": {
"order": "desc",
"missing": "_last"
}
}
]
}
4.3.2 java代碼
@Test
@DisplayName("腳本排序,固定的某個(gè)值的數(shù)據(jù)排在前面,其余的數(shù)據(jù)按照別的字段排序")
public void test01() throws IOException {
SearchRequest request = SearchRequest.of(searchRequest ->
searchRequest.index("index_person")
.query(query -> query.matchAll(matchAll -> matchAll))
.size(100)
.sort(sort ->
sort.script(sortScript ->
sortScript.type(ScriptSortType.Number)
.order(SortOrder.Desc)
.script(script ->
script.inline(inline ->
inline.source("if(params['_source']['province'] == params.province){\n" +
" 1\n" +
" } else {\n" +
" 0\n" +
" }")
.params("province", JsonData.of("湖北"))
)
)
)
)
.sort(sort ->
sort.field(field ->
field.field("province").order(SortOrder.Asc)
)
)
.sort(sort ->
sort.field(field ->
field.field("age").order(SortOrder.Desc).missing("_last")
)
)
);
System.out.println("request: " + request);
SearchResponse<Object> response = client.search(request, Object.class);
System.out.println("response: " + response);
}
4.3.3 運(yùn)行結(jié)果

5、完整代碼
到此這篇關(guān)于詳解Elasticsearch如何實(shí)現(xiàn)簡(jiǎn)單的腳本排序的文章就介紹到這了,更多相關(guān)Elasticsearch腳本排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Elasticsearch?自動(dòng)重啟腳本創(chuàng)建實(shí)現(xiàn)
- Elasticsearch配置文件選項(xiàng)作用詳解(es7)
- Spring?Data?Elasticsearch?5.x實(shí)現(xiàn)單詞糾錯(cuò)和自動(dòng)補(bǔ)全
- Spring?Data?Elasticsearch?5.0.x修改數(shù)據(jù)后無(wú)法立即刷新解決方法示例
- Elasticsearch中FST與前綴搜索應(yīng)用實(shí)戰(zhàn)解析
- Elasticsearch算分優(yōu)化方案之rescore_query示例詳解
- Elasticsearch8.1中的Script使用實(shí)例深入解讀
相關(guān)文章
Java設(shè)計(jì)模式中的建造者(Builder)模式解讀
這篇文章主要介紹了Java設(shè)計(jì)模式中的建造者(Builder)模式解讀, 建造者模式是一種創(chuàng)建對(duì)象的設(shè)計(jì)模式,它通過(guò)將對(duì)象的構(gòu)建過(guò)程分解為多個(gè)步驟,并使用一個(gè)建造者類(lèi)來(lái)封裝這些步驟,從而使得對(duì)象的構(gòu)建過(guò)程更加靈活和可擴(kuò)展,需要的朋友可以參考下2023-10-10
解決spring-data-jpa mysql建表編碼問(wèn)題
這篇文章主要介紹了解決spring-data-jpa mysql建表編碼問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Java Eclipse進(jìn)行斷點(diǎn)調(diào)試的方法
本篇文章主要介紹了Java Eclipse進(jìn)行斷點(diǎn)調(diào)試的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11
SpringBoot?容器刷新前回調(diào)ApplicationContextInitializer
這篇文章主要為大家介紹了SpringBoot?容器刷新前回調(diào)ApplicationContextInitializer使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Java語(yǔ)言中&&與& ||與|的區(qū)別是什么
這篇文章主要介紹了Java語(yǔ)言中&&與& ||與|的區(qū)別是什么的相關(guān)資料,需要的朋友可以參考下2017-04-04
SpringBoot自定義啟動(dòng)界面的實(shí)現(xiàn)代碼
實(shí)現(xiàn)自定義啟動(dòng)動(dòng)畫(huà)是一項(xiàng)有趣的任務(wù),雖然Spring Boot本身不提供內(nèi)置的動(dòng)畫(huà)功能,但可以通過(guò)一些技巧來(lái)實(shí)現(xiàn),本文主要以Demo的形式展示,再者下面的Demo都可以聯(lián)合使用,需要的朋友可以參考下2024-07-07

