当前位置:网站首页>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]所创,转载请带上原文链接,感谢
边栏推荐
- How to use parameters in ES6
- 6.6.1 localeresolver internationalization parser (1) (in-depth analysis of SSM and project practice)
- 中小微企业选择共享办公室怎么样?
- vue-codemirror基本用法:实现搜索功能、代码折叠功能、获取编辑器值及时验证
- Summary of common string algorithms
- NLP model Bert: from introduction to mastery (1)
- Relationship between business policies, business rules, business processes and business master data - modern analysis
- How to customize sorting for pandas dataframe
- Multi classification of unbalanced text using AWS sagemaker blazingtext
- 合约交易系统开发|智能合约交易平台搭建
猜你喜欢

教你轻松搞懂vue-codemirror的基本用法:主要实现代码编辑、验证提示、代码格式化

ES6学习笔记(二):教你玩转类的继承和类的对象

在大规模 Kubernetes 集群上实现高 SLO 的方法

I think it is necessary to write a general idempotent component

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

前端基础牢记的一些操作-Github仓库管理

合约交易系统开发|智能合约交易平台搭建

vue-codemirror基本用法:实现搜索功能、代码折叠功能、获取编辑器值及时验证

Python基础数据类型——tuple浅析

钻石标准--Diamond Standard
随机推荐
一篇文章带你了解SVG 渐变知识
I'm afraid that the spread sequence calculation of arbitrage strategy is not as simple as you think
采购供应商系统是什么?采购供应商管理平台解决方案
Python filtering sensitive word records
带你学习ES5中新增的方法
IPFS/Filecoin合法性:保护个人隐私不被泄露
If PPT is drawn like this, can the defense of work report be passed?
Interface pressure test: installation, use and instruction of siege pressure test
Programmer introspection checklist
Wechat applet: prevent multiple click jump (function throttling)
This article will introduce you to jest unit test
How to customize sorting for pandas dataframe
What is the difference between data scientists and machine learning engineers? - kdnuggets
一篇文章带你了解CSS 渐变知识
MeterSphere开发者手册
助力金融科技创新发展,ATFX走在行业最前列
6.6.1 localeresolver internationalization parser (1) (in-depth analysis of SSM and project practice)
The road of C + + Learning: from introduction to mastery
多机器人行情共享解决方案
Subordination judgment in structured data