当前位置:网站首页>Wow, elasticsearch multi field weight sorting can play like this
Wow, elasticsearch multi field weight sorting can play like this
2020-11-06 01:28:00 【Yin Jihuan】
background
Readers ask questions :ES There is no list of the weight ranking of the , Reference ?
I've been in touch with , So I wrote this article , It can be referred to as .
In many complex business scenarios , The rules of sorting will be more complicated , A single descending order , Ascending order can't meet daily needs . however ES Provides a way to weight documents to sort , It still works .
First initialize three test data , Easy to view :
{id: 1,title: "Java How to learn ",type: 3,userId: 1,tags: ["java"],textContent: " I have to learn Java",status: 1,heat: 80}{id: 2,title: "Java How to learn ",type: 2,userId: 1,tags: ["java"],textContent: " I have to learn Java",status: 1,heat: 99}{id: 3,title: "Java How to learn ",type: 1,userId: 1,tags: ["java"],textContent: " I have to learn Java",status: 1,heat: 100}
type:1 For translation ,2 For reprint ,3 For the original
The requirement is to query userId=1 All articles of , Sort in descending order of heat , But the original type of article should be displayed in the front , Priority over heat .
If we simply sort by heat , So the order must be id by 3( degree of heat :100),2( degree of heat :99),1( degree of heat :80) It's arranged like this .
But the original type should be at the front , So the result should be 1( degree of heat :80, type : original ),3( degree of heat :100, type : translate ),2( degree of heat :99, type : Reprint ).
The sorting conditions must be in terms of heat , This is for sure . The only thing that needs to be dealt with is how to put the original type at the top , If only implementation is considered , There are many ways .
such as : The original type of heat value can be adjusted higher , But what? , The heat value needs a new field , Only for sorting , It shows the user the same heat value as before , This makes sorting simple , Or according to the heat arrangement can achieve the effect .
weightFactorFunction
stay ES In search results _score I believe you are not unfamiliar with this field , This is a ES The score given , We can sort by score , Then improve the score of the original type to achieve the desired effect .
Look directly at Java Code it , adopt FunctionScoreQueryBuilder To build the query .
@Testpublic void testSort() {FunctionScoreQueryBuilder.FilterFunctionBuilder[] filterFunctionBuilders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.termQuery("type", 3), ScoreFunctionBuilders.weightFactorFunction(100)),new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.termQuery("type", 2), ScoreFunctionBuilders.weightFactorFunction(1)),new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchQuery("type", 1), ScoreFunctionBuilders.weightFactorFunction(1))};SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();boolQuery.must(QueryBuilders.termQuery("userId", 1));FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(boolQuery, filterFunctionBuilders);searchSourceBuilder.query(functionScoreQueryBuilder).sort("_score", SortOrder.DESC).sort("heat", SortOrder.DESC);SearchRequest searchRequest = new SearchRequest(elasticSearchIndexConfig.getArticleSearchIndexName());searchRequest.types(EsConstant.DEFAULT_TYPE);searchRequest.source(searchSourceBuilder);List<ArticleDocument> searchResults = kittyRestHighLevelClient.search(searchRequest, ArticleDocument.class);searchResults.forEach(doc -> {System.out.println(doc.getId() + "\t" + doc.getType() + "\t" + doc.getHeat());});}
adopt ScoreFunctionBuilders.weightFactorFunction Set the corresponding weight for the article type , The weight of original article is 100, Everything else 1, In this way, the score of original articles is higher than that of other types of articles .
In order to rank, the score should be ranked first , Then the heat is sorted . We can get the results we want .
scriptFunction
Besides using weightFactorFunction To set the weight , In addition, it introduces a kind of higher flexibility , For more complex sorting scenarios scriptFunction.
scriptFunction It allows us to achieve weights through scripting , Look directly at the code :
@Testpublic void testSort() {String scoreScript = "if (doc['type'].value == 3) {" +" return 100;" +"} else {" +" return 1;" +"}";FunctionScoreQueryBuilder.FilterFunctionBuilder[] filterFunctionBuilders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchAllQuery(), ScoreFunctionBuilders.scriptFunction(new Script(scoreScript)))};SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();boolQuery.must(QueryBuilders.termQuery("userId", 1));FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(boolQuery, filterFunctionBuilders);searchSourceBuilder.query(functionScoreQueryBuilder).sort("_score", SortOrder.DESC).sort("heat", SortOrder.DESC);SearchRequest searchRequest = new SearchRequest(elasticSearchIndexConfig.getArticleSearchIndexName());searchRequest.types(EsConstant.DEFAULT_TYPE);searchRequest.source(searchSourceBuilder);List<ArticleDocument> searchResults = kittyRestHighLevelClient.search(searchRequest, ArticleDocument.class);searchResults.forEach(doc -> {System.out.println(doc.getId() + "\t" + doc.getType() + "\t" + doc.getHeat());});}
scoreScript It's the script that controls the weight , That is, a piece of code ( The default script is groovy), Is it convenient to do so much .
About author : Yin Jihuan , Simple technology enthusiasts ,《Spring Cloud Microservices - Full stack technology and case analysis 》, 《Spring Cloud Microservices introduction Actual combat and advanced 》 author , official account Ape world Originator .
I have compiled a complete set of learning materials , Those who are interested can search through wechat 「 Ape world 」, Reply key 「 Learning materials 」 Get what I've sorted out Spring Cloud,Spring Cloud Alibaba,Sharding-JDBC Sub database and sub table , Task scheduling framework XXL-JOB,MongoDB, Reptiles and other related information .

版权声明
本文为[Yin Jihuan]所创,转载请带上原文链接,感谢
边栏推荐
- 2019年的一个小目标,成为csdn的博客专家,纪念一下
- vue任意关系组件通信与跨组件监听状态 vue-communication
- Skywalking series blog 1 - install stand-alone skywalking
- Character string and memory operation function in C language
- In order to save money, I learned PHP in one day!
- I think it is necessary to write a general idempotent component
- 6.3 handlerexceptionresolver exception handling (in-depth analysis of SSM and project practice)
- Interface pressure test: installation, use and instruction of siege pressure test
- If PPT is drawn like this, can the defense of work report be passed?
- NLP model Bert: from introduction to mastery (1)
猜你喜欢

Python filtering sensitive word records

速看!互联网、电商离线大数据分析最佳实践!(附网盘链接)

How to select the evaluation index of classification model

Do not understand UML class diagram? Take a look at this edition of rural love class diagram, a learn!

比特币一度突破14000美元,即将面临美国大选考验

Tool class under JUC package, its name is locksupport! Did you make it?

Python download module to accelerate the implementation of recording

A course on word embedding

如何玩转sortablejs-vuedraggable实现表单嵌套拖拽功能

至联云解析:IPFS/Filecoin挖矿为什么这么难?
随机推荐
Mongodb (from 0 to 1), 11 days mongodb primary to intermediate advanced secret
From zero learning artificial intelligence, open the road of career planning!
用一个例子理解JS函数的底层处理机制
How long does it take you to work out an object-oriented programming interview question from Ali school?
Skywalking series blog 1 - install stand-alone skywalking
git rebase的時候捅婁子了,怎麼辦?線上等……
React design pattern: in depth understanding of react & Redux principle
The choice of enterprise database is usually decided by the system architect - the newstack
一篇文章带你了解CSS3 背景知识
一篇文章带你了解SVG 渐变知识
JVM memory area and garbage collection
Electron application uses electronic builder and electronic updater to realize automatic update
Keyboard entry lottery random draw
Programmer introspection checklist
axios学习笔记(二):轻松弄懂XHR的使用及如何封装简易axios
Vuejs development specification
After reading this article, I understand a lot of webpack scaffolding
Summary of common string algorithms
Network security engineer Demo: the original * * is to get your computer administrator rights! 【***】
至联云解析:IPFS/Filecoin挖矿为什么这么难?