ElasticSearch painless脚本实现自定义打分排序
背景:
遇到了这样一个需求,对于历史购买的商品优先排序
自定义打分排序规则
自定义打分规则,其实就是可以根据打分规则进行排序。注意:只能对索引的keyword属性进行排序,TEXT类型的要加.keyWord,如:doc[‘索引列名.keyword’].value
需求背景:
查出来的某个字段的值等于或包含某些字符时,优先排序。
一、全匹配排序
例子:对历史购买商品优先排序
java代码实现:
其实就是拼接出painless脚本,通过NativeSearchQueryBuilder进行排序,然后通过springDataES带的search方法进行查询。
(doc[‘索引列名’].value==(‘要匹配的值’))?1000002:(doc[‘索引列名’].value==(‘要匹配的值’))?1000001:"
三目运算法中?后面跟的数值,就是权重值,权重越大,排序越靠前
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder().withQuery(QueryBuilders.matchAllQuery()).withIndices(getIndexName(ProductIndex.class)).withTypes(getType(ProductIndex.class)).withPageable(pageIndexRequest.toPageable()).withFilter(boolQueryBuilder);StringBuffer buffer = new StringBuffer();
//此处拼接painless脚本,1000000为权重
int num = historyBuyProductCodeList.size() + 1000000;
for (int i = 0; i < historyBuyProductCodeList.size(); i++) {buffer.append("(doc['索引列名'].value=='" + historyBuyProductCodeList.get(i) + "')?" + num + ":");num--;if (i == historyBuyProductCodeList.size() - 1) {buffer.append("0");break;}
}
String historyProductScriptText = buffer.toString().trim();
//我们不需要参数,所以传个没有键值对的对象进去就可以了
Map<String, Object> params = new HashMap<>();
Script script = new Script(ScriptType.INLINE, "painless", historyProductScriptText, params);
ScriptSortBuilder sortBuilder = SortBuilders.scriptSort(script, ScriptSortBuilder.ScriptSortType.NUMBER).order(SortOrder.DESC);
nativeSearchQueryBuilder.withSort(sortBuilder);
//进行查询SearchQuery searchQuery = nativeSearchQueryBuilder.withSort(order).build();Page<ProductIndex> page = productIndexRepository.search(searchQuery);
restful请求实现:
GET /索引名称/_search{"query": {"match_all": {}},"from": 0, // 分页开始的位置,默认为0"size": 1000,"sort": [{"_script": {"script": {"source": "(doc['索引列名'].value==('要匹配的值'))?1000002:(doc['索引列名'].value==('要匹配的值'))?1000001:","lang": "painless"},"type": "number","order": "desc"}}]
}
二、模糊匹配排序
java代码实现:
StringBuffer buffer = new StringBuffer();
int num = warehouseIds.size() + 10000;
for (int i = 0; i < warehouseIds.size(); i++) {//注意,这里是contains来实现的buffer.append("(doc['索引列名'].value.contains('" + warehouseIds.get(i) + "'))?" + num + ":");num--;if (i == warehouseIds.size() - 1) {buffer.append("0");break;}
}
String stockScriptText = buffer.toString().trim();
Map<String, Object> params = new HashMap<>();
Script stockScript = new Script(ScriptType.INLINE, "painless", stockScriptText, params);
ScriptSortBuilder sortBuilder = SortBuilders.scriptSort(stockScript, ScriptSortBuilder.ScriptSortType.NUMBER).order(SortOrder.DESC);
nativeSearchQueryBuilder.withSort(sortBuilder);//进行查询SearchQuery searchQuery = nativeSearchQueryBuilder.withSort(order).build();Page<ProductIndex> page = productIndexRepository.search(searchQuery);
restful请求实现:
GET /索引名称/_search{"query": {"match_all": {}},"from": 0, // 分页开始的位置,默认为0"size": 1000,"sort": [{"_script": {"script": {"source": "(doc['索引列名'].value.contains('要匹配的值'))?10002:(doc['索引列名'].value.contains('要匹配的值'))?10001:","lang": "painless"},"type": "number","order": "desc"}}]
}
ElasticSearch painless脚本实现自定义打分排序相关推荐
- 【Elasticsearch】使用 Elasticsearch Painless 脚本以递归方式遍历 JSON 字段
本文为博主九师兄(QQ:541711153 欢迎来探讨技术)原创文章,未经允许博主不允许转载.有问题可以先私聊我,本人每天都在线,会帮助需要的人. 文章目录 0.概述 1. 介绍 2.案例 2.1 示 ...
- elasticsearch自定义打分操作
ES 自定义打分 Elasticsearch 会为 query 的每个文档计算一个相关度得分 score ,并默认按照 score 从高到低的顺序返回搜索结果. 在很多场景下,我们不仅需要搜索到匹配的 ...
- Elasticsearch Scripting脚本使用总结
目录 一.概述 二.Scripting脚本使用 一.概述 Elasticsearch提供的增删改查相关API虽然能解决大部分业务场景的问题,但是在一些相对复杂的业务场景,使用增删改查不太好实现的时候, ...
- Elasticsearch Painless Script详解
文章目录 1. Painless 简介 Painless 的用途 2. 参数 3. 首选参数 4. 简短脚本形式 5. 通过 Painless 脚本访问字段 6. 示例 6.1 案例 1:Script ...
- 打分排序系统漫谈1 - 时间衰减
打分排序系统的应用非常普遍,比如电影的评分,知乎帖子的热度,和新闻文章的排序.让我们从最简单直观的平均打分开始, 聊聊各种打分方法的利弊和使用场景. 最简单的打分方法当然是一段时间的点赞量综述.显而易 ...
- python连接oracle进行监控_使用Python脚本zabbix自定义key监控oracle连接状态
目的:此次实验目的是为了zabbix服务端能够实时监控某服务器上oracle实例能否正常连接 环境:1.zabbix_server 2.zabbix_agent(含有oracle) 主要知识点: 1. ...
- orcale实现自定义优先级排序的SQL
作者: orcale实现自定义优先级排序的SQL select fchdno, bom_id, owner_id, customer_ ...
- elasticsearch分词练习、自定义分词器练习
elasticsearch分词练习.自定义分词器练习 分词练习 自定义分词器 分词练习 准备数据 post metric_zabbix/log {"@message":" ...
- SQL学习之使用order by 按照指定顺序排序或自定义顺序排序
我们通常需要根据客户需求对于查询出来的结果给客户提供自定义的排序方式,那么我们通常sql需要实现方式都有哪些,参考更多资料总结如下(不完善的和错误望大家指出): 一.如果我们只是对于在某个程序中的应用 ...
最新文章
- 380v pcb 接线端子_连接器、接线端子、插针插孔三者究竟有什么区别?
- 5G 承载网 — 前传、中传、回传
- Xcode7 项目转 Xcode6 时 出现问题
- nod32可以限制软件安装么_玻璃钢法兰安装时可以别劲么 玻璃钢法兰安装视频
- php java 单点登录_php实现多站点共用session实现单点登录的方法详解
- pytorch 画loss曲线_Pytorch使用tensorboardX可视化。超详细!!!
- linux中项目部署和日志查看
- FPGA时钟激励编写(方法二)
- 开源该如何“扎根”中国?听听他们怎么说
- python中stacked_栈式自动编码器(Stacked AutoEncoder)
- word2vec和node2vec笔记(更新ing)
- vs插件supercharger注册码
- 向 Linux kernel 社区提交patch补丁步骤总结(已验证成功)
- Tomcat-幽灵猫GhostCat漏洞复现
- easyUI-疯狂的秀才
- Windows 打开和关闭默认共享方法汇总
- 九州海上牧云记,电视剧节奏太慢?教你如何看全集
- 第三章 变量和数据类型_C语言中的小数(float,double)
- web前端开发基础知识整理以及前端视频教程
- 排序函数sort()
热门文章
- r语言中的或怎么表示什么不同_R语言中$是什么意思
- 【技术美术百人计划】美术 1.1 美术理论基础
- Jmeter定时器之吞吐量整形定时器jp@gc Throughput Shaping Timer
- Android拍照和相册+系统裁剪功能返回图片
- TCP短连接与长连接
- html如何制作悬浮窗,使用js实现悬浮窗效果方法
- FloatWindow-优雅实现Android悬浮窗
- JS程序|Z字形变换
- 基于C#和SQL SERVER的汽车配件仓储管理系统
- java 微信 摇一摇红包_微信小程序“摇一摇”的实例代码