当前位置:网站首页>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]所创,转载请带上原文链接,感谢
边栏推荐
- 一篇文章带你了解SVG 渐变知识
- Programmer introspection checklist
- IPFS/Filecoin合法性:保护个人隐私不被泄露
- NLP model Bert: from introduction to mastery (1)
- 有了这个神器,快速告别垃圾短信邮件
- Brief introduction of TF flags
- 前端都应懂的入门基础-github基础
- EOS创始人BM: UE,UBI,URI有什么区别?
- This article will introduce you to jest unit test
- What to do if you are squeezed by old programmers? I don't want to quit
猜你喜欢

Not long after graduation, he earned 20000 yuan from private work!

The road of C + + Learning: from introduction to mastery

Discussion on the technical scheme of text de duplication (1)

axios学习笔记(二):轻松弄懂XHR的使用及如何封装简易axios

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

Brief introduction and advantages and disadvantages of deepwalk model

一篇文章带你了解CSS 分页实例

The difference between Es5 class and ES6 class

JVM memory area and garbage collection

TRON智能钱包PHP开发包【零TRX归集】
随机推荐
Thoughts on interview of Ali CCO project team
一篇文章带你了解HTML表格及其主要属性介绍
Do not understand UML class diagram? Take a look at this edition of rural love class diagram, a learn!
Network security engineer Demo: the original * * is to get your computer administrator rights! 【***】
前端工程师需要懂的前端面试题(c s s方面)总结(二)
Using consult to realize service discovery: instance ID customization
After reading this article, I understand a lot of webpack scaffolding
关于Kubernetes 与 OAM 构建统一、标准化的应用管理平台知识!(附网盘链接)
Wechat applet: prevent multiple click jump (function throttling)
NLP model Bert: from introduction to mastery (1)
What to do if you are squeezed by old programmers? I don't want to quit
Vue.js Mobile end left slide delete component
Natural language processing - wrong word recognition (based on Python) kenlm, pycorrector
一篇文章带你了解CSS3 背景知识
Subordination judgment in structured data
The data of pandas was scrambled and the training machine and testing machine set were selected
PHP应用对接Justswap专用开发包【JustSwap.PHP】
Process analysis of Python authentication mechanism based on JWT
Nodejs crawler captures ancient books and records, a total of 16000 pages, experience summary and project sharing
Skywalking series blog 1 - install stand-alone skywalking