当前位置:网站首页>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]所创,转载请带上原文链接,感谢
边栏推荐
- Linked blocking Queue Analysis of blocking queue
- 2019年的一个小目标,成为csdn的博客专家,纪念一下
- Interface pressure test: installation, use and instruction of siege pressure test
- use Asponse.Words Working with word templates
- In order to save money, I learned PHP in one day!
- Nodejs crawler captures ancient books and records, a total of 16000 pages, experience summary and project sharing
- Calculation script for time series data
- The data of pandas was scrambled and the training machine and testing machine set were selected
- ES6学习笔记(四):教你轻松搞懂ES6的新增语法
- 在大规模 Kubernetes 集群上实现高 SLO 的方法
猜你喜欢

Interface pressure test: installation, use and instruction of siege pressure test

多机器人行情共享解决方案

Brief introduction of TF flags

一篇文章带你了解CSS 渐变知识

ES6学习笔记(五):轻松了解ES6的内置扩展对象

Python基础变量类型——List浅析

一篇文章带你了解CSS3 背景知识

Building and visualizing decision tree with Python

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

Mac installation hanlp, and win installation and use
随机推荐
EOS创始人BM: UE,UBI,URI有什么区别?
ipfs正舵者Filecoin落地正当时 FIL币价格破千来了
一篇文章带你了解HTML表格及其主要属性介绍
Synchronous configuration from git to consult with git 2consul
In order to save money, I learned PHP in one day!
从海外进军中国,Rancher要执容器云市场牛耳 | 爱分析调研
Skywalking series blog 2-skywalking using
小程序入门到精通(二):了解小程序开发4个重要文件
每个前端工程师都应该懂的前端性能优化总结:
Skywalking series blog 5-apm-customize-enhance-plugin
H5 makes its own video player (JS Part 2)
Interface pressure test: installation, use and instruction of siege pressure test
Wechat applet: prevent multiple click jump (function throttling)
至联云解析:IPFS/Filecoin挖矿为什么这么难?
Save the file directly to Google drive and download it back ten times faster
Python基础数据类型——tuple浅析
前端基础牢记的一些操作-Github仓库管理
ES6 essence:
Brief introduction and advantages and disadvantages of deepwalk model
Relationship between business policies, business rules, business processes and business master data - modern analysis