詳解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
來實(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":"錢七","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é)果
通過如上的 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ù)后無法立即刷新解決方法示例
- Elasticsearch中FST與前綴搜索應(yīng)用實(shí)戰(zhàn)解析
- Elasticsearch算分優(yōu)化方案之rescore_query示例詳解
- Elasticsearch8.1中的Script使用實(shí)例深入解讀
相關(guān)文章
Spring Boot中如何使用Convert接口實(shí)現(xiàn)類型轉(zhuǎn)換器
這篇文章主要介紹了Spring Boot中使用Convert接口實(shí)現(xiàn)類型轉(zhuǎn)換器的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08全排列算法-遞歸與字典序的實(shí)現(xiàn)方法(Java)
下面小編就為大家?guī)硪黄帕兴惴?遞歸與字典序的實(shí)現(xiàn)方法(Java) 。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04Java數(shù)據(jù)結(jié)構(gòu)優(yōu)先隊(duì)列實(shí)練
通常都把隊(duì)列比喻成排隊(duì)買東西,大家都很守秩序,先排隊(duì)的人就先買東西。但是優(yōu)先隊(duì)列有所不同,它不遵循先進(jìn)先出的規(guī)則,而是根據(jù)隊(duì)列中元素的優(yōu)先權(quán),優(yōu)先權(quán)最大的先被取出,這篇文章主要介紹了java優(yōu)先隊(duì)列的真題,感興趣的朋友一起看看吧2022-07-07Mybatis-Plus的應(yīng)用場(chǎng)景描述及注入SQL原理分析
MyBatis-Plus是一個(gè) MyBatis 的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開發(fā)、提高效率而生,本文重點(diǎn)給大家介紹Mybatis-Plus的應(yīng)用場(chǎng)景及注入SQL原理分析,感興趣的朋友跟隨小編一起學(xué)習(xí)吧2021-05-05springboot+kafka中@KafkaListener動(dòng)態(tài)指定多個(gè)topic問題
這篇文章主要介紹了springboot+kafka中@KafkaListener動(dòng)態(tài)指定多個(gè)topic問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12Springboot之修改啟動(dòng)端口的兩種方式(小結(jié))
這篇文章主要介紹了Springboot之修改啟動(dòng)端口的兩種方式(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09request.getParameter()方法的簡(jiǎn)單理解與運(yùn)用方式
在JavaWeb開發(fā)中,request對(duì)象扮演著至關(guān)重要的角色,它是HTTP請(qǐng)求的封裝,request.getParameter()用于獲取客戶端通過GET或POST方式發(fā)送的參數(shù),與之相對(duì),request.setAttribute()用于在服務(wù)器端設(shè)置屬性,這些屬性只在一次請(qǐng)求中有效2024-10-10