当前位置:网站首页>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 .
@Test
public 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 :
@Test
public 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]所创,转载请带上原文链接,感谢
边栏推荐
- Deep understanding of common methods of JS array
- Vuejs development specification
- How to select the evaluation index of classification model
- git rebase的時候捅婁子了,怎麼辦?線上等……
- PHPSHE 短信插件说明
- 一篇文章带你了解CSS对齐方式
- Mongodb (from 0 to 1), 11 days mongodb primary to intermediate advanced secret
- 一篇文章教会你使用Python网络爬虫下载酷狗音乐
- vue-codemirror基本用法:实现搜索功能、代码折叠功能、获取编辑器值及时验证
- Analysis of partial source codes of qthread
猜你喜欢
前端工程师需要懂的前端面试题(c s s方面)总结(二)
Mac installation hanlp, and win installation and use
Filecoin的经济模型与未来价值是如何支撑FIL币价格破千的
一篇文章带你了解CSS对齐方式
How long does it take you to work out an object-oriented programming interview question from Ali school?
NLP model Bert: from introduction to mastery (2)
100元扫货阿里云是怎样的体验?
零基础打造一款属于自己的网页搜索引擎
Python saves the list data
Recommendation system based on deep learning
随机推荐
Our best practices for writing react components
5.5 controlleradvice notes - SSM in depth analysis and project practice
Python saves the list data
I've been rejected by the product manager. Why don't you know
Character string and memory operation function in C language
High availability cluster deployment of jumpserver: (6) deployment of SSH agent module Koko and implementation of system service management
Programmer introspection checklist
The choice of enterprise database is usually decided by the system architect - the newstack
What is the side effect free method? How to name it? - Mario
Arrangement of basic knowledge points
Using consult to realize service discovery: instance ID customization
Mongodb (from 0 to 1), 11 days mongodb primary to intermediate advanced secret
Skywalking series blog 1 - install stand-alone skywalking
Wechat applet: prevent multiple click jump (function throttling)
What problems can clean architecture solve? - jbogard
Network security engineer Demo: the original * * is to get your computer administrator rights! 【***】
如何玩转sortablejs-vuedraggable实现表单嵌套拖拽功能
NLP model Bert: from introduction to mastery (1)
6.4 viewresolver view parser (in-depth analysis of SSM and project practice)
How to use Python 2.7 after installing anaconda3?