elasticsearch7.17.3实现按terms传入内容排序,类似mysql中order by filed()的排序方式

现有一个需求,需要在elasticsearch中实现用terms筛选内容,并且按terms传入的内容顺序排列
类型于mysql中order by filed()的排序方式,具体实现如下

目录

  • 一、需求
  • 二、整体思路
  • 三、es查询语句
  • 四、java生成es连接
  • 五、java调用es
  • 六、最终实现结果

一、需求

筛选 fileId 为"3",“2”,“1”,“4”,“5"的记录,并且按照"3”,“2”,“1”,“4”,"5"方式排序

二、整体思路

用terms实现数据的筛选,使用传入集合的索引当作排序的依据

三、es查询语句

terms中是筛选数据内容
sort中是自定义排序规则,将集合索引当作排序的依据

注意:sort 中的 order 内容需要为字符串集合,如果为数字集合,则此排序规则会失效

POST test/_search
{"query": {"bool": {"must": [{"terms": {"fileId": ["3","2","1","4","5"]}}]}},"sort": [{"_script": {"type": "number","order": "asc","script": {"source": "params.order.indexOf(doc['fileId'].value.toString())","params": {"order": ["3","2","1","4","5"]}}}}]
}

四、java生成es连接

	//生成es连接private ElasticsearchClient getEsClient() {try {//调用es有同步和异步之分,下列方法是同步阻塞调用// Create the low-level clientRestClient restClient = RestClient.builder(new HttpHost("127.0.0.1", 9200)).build();// Create the transport with a Jackson mapperElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());// And create the API clientElasticsearchClient client = new ElasticsearchClient(transport);return client;} catch (Exception e) {e.printStackTrace();log.error("生成esClient失败" + e);}return null;}

五、java调用es

下面方法是对java调用es实现第三步中的查询方式

注意:sort 中的 order 内容仍然需要传入字符串格式集合,否则排序都为 -1,无法实现想要的排序效果

public void test() throws Exception {//基本数据准备List<Long> fileIdList = new ArrayList<>();fileIdList.add(3L);fileIdList.add(2L);fileIdList.add(1L);fileIdList.add(4L);fileIdList.add(5L);//设置筛选内容List<String> fileIdStrList = new ArrayList<>();List<FieldValue> fileValueList = fileIdList.stream().map(m -> {FieldValue.Builder ff = new FieldValue.Builder();ff.longValue(m);fileIdStrList.add(m.toString());return ff.build();}).collect(Collectors.toList());BoolQuery.Builder queryBuilder = new BoolQuery.Builder();queryBuilder.must(_1 -> _1.terms(_2 -> _2.field("fileId").terms(_3 -> _3.value(fileValueList))));ElasticsearchClient client = getEsClient();//设置排序规则SortOptions.Builder sortOptions2 = new SortOptions.Builder();sortOptions2.script(_1 -> _1.type(ScriptSortType.Number).order(SortOrder.Asc).script(_2 -> _2.inline(_3 -> _3.source("params.order.indexOf(doc['fileId'].value.toString())").params("order", JsonData.of(fileIdStrList)))));SearchResponse<Map> search = client.search(_1 -> _1.index("test")//es默认返回10000条数据,加上此条配置才能返回全部条数.trackTotalHits(_2 -> _2.enabled(true))//查询参数.query(queryBuilder.build()._toQuery()).sort(sortOptions2.build())
//                        .from(pageBegin)
//                        .size(pageSize).source(_2 -> _2.filter(_3 -> _3.includes("fileId"))), Map.class);Long totalNum = search.hits().total().value();  //查询总条数List<Integer> resultFileIdList = search.hits().hits().stream().map(m -> (Integer) m.source().get("fileId")).collect(Collectors.toList());System.out.println(Arrays.asList(resultFileIdList));}

六、最终实现结果

最终输入结果和传入的 fileId 顺序一致

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/3065.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux上虚拟机vmware-workstation离线安装详细教程

linux上虚拟机vmware-workstation详细教程 一、VMWare基本介绍二、VMWare下载2.1 查看本地系统信息2.2 选择及下载合适的版本 三、VMWare安装3.1 安装依赖库3.2 vmware安装3.3 验证安装3.4 异常及解决方案3.4.1 Failed to start SYSV3.4.2 GLib does not have GSettings suppor…

Nacos架构与原理 - Nacos-Sync

文章目录 概述官网系统模块架构同步任务管理页面注册中心管理页面使用场景 概述 NacosSync 是⼀个支持多种注册中心的同步组件,基于 Spring boot 开发框架,数据层采用Spring Data JPA &#xff0c;遵循了标准的 JPA 访问规范&#xff0c;支持多种数据源存储,默认使用Hibernate…

用于语义图像分割的弱监督和半监督学习:弱监督期望最大化方法

这时一篇2015年的论文&#xff0c;但是他却是最早提出在语义分割中使用弱监督和半监督的方法&#xff0c;SAM的火爆证明了弱监督和半监督的学习方法也可以用在分割上。 这篇论文只有图像级标签或边界框标签作为弱/半监督学习的输入。使用期望最大化(EM)方法&#xff0c;用于弱…

qt Qss 边框渐变

目录 背景渐变 方案一 Qss 方案二 paintEvent函数 方案三 QGraphicsDropShadowEffect投影效果 背景渐变 QT里面背景是可以渐变&#xff0c;其中qlineargradient里面参数意思 spread&#xff1a;渐变方式&#xff08;具体可以查看qt帮助文档搜索PadSpread&#xff09; 坐…

走进人工智能|机器学习 解码未来的科技革命

前言: 机器学习的发展为我们提供了更智能、高效和便捷的科技产品和服务&#xff0c;可以改善我们的生活和工作方式。 文章目录 序言背景解码未来的科技革命技术支持应用领域程序员如何学总结 序言 机器学习是一种人工智能领域的技术&#xff0c;它让计算机通过数据自动地学习和…

SpringBoot 整合redis + Aop防止重复提交 (简易)

1.redis的安装 redis下载 解压 安装 # wget http://download.redis.io/releases/redis-6.0.8.tar.gz # tar xzf redis-6.0.8.tar.gz # cd redis-6.0.8 # make 看一下就会有 进入redis-6.0.8下的src目录 [rootVM-16-8-centos redis]# cd redis-6.0.8 [rootVM-16-8-centos re…

GPT模型训练实践(2)-Transformer模型工作机制

Transformer 的结构如下&#xff0c;主要由编码器-解码器组成&#xff0c;因为其不需要大量标注数据训练和天然支持并行计算的接口&#xff0c;正在全面取代CNN和RNN&#xff1a; 扩展阅读&#xff1a;What Is a Transformer Model? ​ ​ 其中 编码器中包含自注意力层和前馈…

STM32速成笔记—IWDG

文章目录 一、IWDG简介二、STM32的IWDG2.1 STM32的IWDG简介2.2 喂狗2.3 IWDG框图 三、IWDG配置步骤四、IWDG配置程序4.1 IWDG初始化程序4.2 喂狗 五、应用实例 一、IWDG简介 独立看门狗&#xff08;Independent Watchdog, IWDG&#xff09;&#xff0c;什么是看门狗&#xff1…

Spring Cloud 之注册中心 Eureka 精讲

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

【SpringCloud config分布式配置中心】—— 每天一点小知识

&#x1f4a7; S p r i n g C l o u d c o n f i g 分布式配置中心 \color{#FF1493}{SpringCloud config分布式配置中心} SpringCloudconfig分布式配置中心&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的…

软考A计划-系统集成项目管理工程师-项目范围管理(四)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

图像处理实战02-yolov5目标检测

yolov5 YOLOv5 是一种目标检测算法&#xff0c;它是 YOLO (You Only Look Once) 系列算法的最新版本。YOLOv5 采用了一种新的架构&#xff0c;它包括一个基于 CSPNet (Cross Stage Partial Network) 的主干网络以及一系列改进的技巧&#xff0c;如多尺度训练、数据增强、网络混…