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

2023-11-16

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

一、需求

筛选 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 client
            RestClient restClient = RestClient.builder(
                    new HttpHost("127.0.0.1", 9200)).build();

            // Create the transport with a Jackson mapper
            ElasticsearchTransport transport = new RestClientTransport(
                    restClient, new JacksonJsonpMapper());

            // And create the API client
            ElasticsearchClient 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 顺序一致

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 使用 Android WebViewClient 启用特定 SSL 协议

    我的应用程序使用WebViewClient与服务器建立 SSL 连接 服务器配置为仅接受 TLSv1 1 及以上协议 使用 Android 时 如何检查哪些 SSL 协议是 a 支持的和 b 默认启用的WebViewClient在设备上 如
  • 线程“main”java.lang.UnsatisfiedLinkError中出现异常:java.library.path中没有opencv_java249

    我目前正在尝试在我的 32 位笔记本电脑上设置 OpenCV 但我不断收到一条令我困惑的错误消息 Exception in thread main java lang UnsatisfiedLinkError no opencv java2
  • 在 Hibernate 中创建 UPDATE RETURNING 查询

    在 Oracle 中 我们可以创建一个更新查询 该查询将使用 RETURNING 子句返回更新的记录 Hibernate中有类似的功能吗 除了数据库生成的值之外 Hibernate 显然不需要返回更新的实例 因为对象传递给Session s
  • 如何修复 Android 7.0 的 Spinner 模式下的 DatePickerDialog?

    我目前正在开发一个简单的项目 其中包含一个包含在 Web 视图中的网站 具有少量交互 以提高网站本身和 Android 移动设备之间的交互性 由于该网站包含用户生日的日期输入字段 因此我希望实现一个与所有设备兼容的旋转格式的日期选择器 我尝
  • 如何将自定义日志处理程序添加到 Google App Engine?

    我正在尝试向我的 java 应用程序添加自定义日志处理程序 我已经实现了一个扩展 java util Logging Handler 类的 InnerLogger 类 在我的logging properties中声明为处理程序 handle
  • 尝试在java中的Arraylist中查找对象的所有出现

    我有一个 Java ArrayList 我需要查找其中出现的所有特定对象 ArrayList indexOf Object 方法只找到一次出现 所以看来我还需要其他东西 我认为你不需要太花哨 以下应该可以正常工作 static
  • Java 唤醒休眠线程

    我阅读了其他帖子 但没有找到我正在寻找的确切答案 所以我希望有人能给出一些澄清 我有一个将运行一段时间的程序 我有一些在后台运行的线程来执行各种任务 为了简单起见 让我们考虑 3 个线程 ThreadA每 10 秒执行一次任务 其中Thre
  • 支持通过 OAuth 进行 Facebook/Twitter 身份验证的 CAS 服务器

    我正在寻找一个支持 Facebook Twitter 通过 OAuth 进行单点登录身份验证的 CAS 服务器 我检查过 JASIG CAS 服务器 但它看起来不支持它们 我的 java web 应用程序基于 Spring Security
  • 如何在 MySQL 中测试 Select for Update

    我正在表演SELECT FOR UPDATE或 InnoDB 表的行级锁定 我的目的是只有一个请求可以读取同一行 因此 如果两个用户同时请求相同的数据 其中只有一个人获取数据 即第一个触发查询的人 但是我如何测试锁定是否已放置 因为我正在通
  • SimpleDateFormat 将 lenient 设置为 false 时出现异常

    为什么这段代码会抛出无法解析日期的异常 SimpleDateFormat f new SimpleDateFormat yyyy MM dd T HH mm ss 000Z f setLenient false String dateStr
  • 在 eclipse 之外将 Spring MVC 应用程序部署到 tomcat 的幕后会发生什么?

    我猜想使用像 eclipse 这样很棒的 IDE 的一个缺点是你会忽略应用程序幕后发生的事情 我是一名 Ruby 开发人员 所以不是一名 Java 老手 所以我一直在用 java 编写一个项目 并使用 spring 框架进行 IOC 和 M
  • 抽象类或接口。哪种方式是正确的?

    有两种方法可以选择抽象类或接口 微软解决方案和Oracle解决方案 微软 设计指南 请使用抽象 在 Visual Basic 中为 MustInherit 类而不是接口来将协定与实现分离 http msdn microsoft com en
  • 非常大的字段会对 MySQL 数据库产生负面影响吗?

    我目前正在使用 Django 构建一个网站 并希望托管用户生物样式页面 该页面可能长达几 KB 这些字段不一定需要搜索 但在查找用户名时确实需要提供 将这些数据存储在数据库中会产生负面影响吗 如果我使用带有数据库链接的静态文本文件 我的服务
  • HTTP PUT 在 Java 中上传文件

    Edit 我想我已经弄清楚如何执行二进制数据部分 仔细检查代码 但我很确定我做对了 现在 当我尝试按照中所述完成上传时遇到新错误Vimeo API 文档 http vimeo com api docs upload streaming Ed
  • 为什么现在()? (客观化)

    为什么我想要异步加载 Objectify 实体 异步加载到底意味着什么 根据客观化有关加载的文档 https code google com p objectify appengine wiki BasicOperations Loadin
  • 如何使用云打印打印Android活动显示

    我正在尝试将 Google 云打印实现到应用程序中 遵循集成指南 https developers google com cloud print docs android 我试图通过打印 google com 来保持基本 单击我创建的打印按
  • 我们可以有虚假中断吗?

    我正在创建一个任务轮询器 每分钟都会查找任务 它看起来像这样 public class Poller private final ExecutorService e Executors newSingleThreadExecutor pub
  • 找不到符号assertEquals

    我正在尝试为计算器编写第一个单元测试 但 NetBeans 说它找不到该符号assertEquals和注释 Test 我应该包括一些东西吗 我正在使用 NetBeans 7 3 1 和 W7 package calculator impor
  • 如果抛出RuntimeException,是否可以将其作为异常捕获?

    如果我有一个try抛出一个块RuntimException子类 可以是后续的catch块将其捕获为Exception 具体来说 public class MyAppException extends RuntimeException In
  • 将带有 webapp 的 WAR 部署到 Maven 中央存储库是否有意义?

    这样做有意义吗 如果是 我在哪里可以找到使用简单的 Web Hello World 执行此操作的示例 当人们从 Maven 执行 Web 应用程序时 他们会使用 Jetty 来运行它吗 我想 tomcat 太重了 任何帮助将不胜感激 谢谢

随机推荐

  • 算法设计与分析考试复习

    冒泡排序 排序思路 1 从第0个元素开始 每次用相邻的两个元素进行比较 2 一旦发现后面的一个元素小于我们前面的一个元素就交换位置 3 经过一轮冒泡排序比较之后最后一个元素就是最大值 4 排除最后一个元素 以此类推 每次比较完成后最大值都会
  • IDEA 断点调式按键/断点跳跃技巧

    一 调试按键的使用说明 对于我日常调试 Step Over Step Into使用最频繁 当然还有断点跳跃 1 Step Over 按照程序从上往下执行 遇到方法也点击这个 则跳过方法 方法其实直接执行完成 直接进入下一个语句 简单的方法或
  • 软件工程毕业设计选题大全 毕设题目推荐

    文章目录 0 前言 1 题目推荐 2 开题指导 2 1 起因 2 2 如何避坑 重中之重 2 3 为什么这么说呢 2 4 难度把控 2 5 题目名称 3 最后 0 前言 这是学长亲手整理的 软件工程毕设选题系列第三篇 都是经过学长精心审核的
  • 【Libevent】Libevent特征和事件集创建

    1 libevent特点 事件驱动 高性能 轻量级 专注于网络 跨平台 支持Windows Linux Linux Mac Os等 支持多种I O多路复用技术 epoll poll dev poll select kqueue等 支持I O
  • linux的thrift编译指南详细版(64位 + 32位)

    linux的thrift编译指南详细版 64位 32位 一 简介 二 编译 1 OpenSSL 2 libevent 3 boost 4 thrift 三 检查 四 总结 一 简介 thrift是使用IDL定义接口的支持多种开发语言的RPC
  • Spring Boot 2.x整合微信支付项目实战

    资料 zip 第 1 章项目介绍和前期准备 1 1 SpringBoot整合微信支付开发在线教育视频站点介绍 ts 1 2 中大型公司里面项目开发流程讲解 ts 1 3 在线教育站点需求分析和架构设计 ts 1 4 在线教育后台数据库设计
  • Maven第5篇:手把手教你搭建私服

    Maven第5篇 手把手教你搭建私服 环境 maven3 6 1 开发工具idea jdk1 8 本篇内容 私服介绍 windows中安装nexus私服 linux中安装nexus私服 nexus私服中各种仓库详解 配置本地Maven从ne
  • GCP application performance management lab

    最后更新2022 03 19 这是这节最后一个实验了 加油 照例先enable service 然后下载repository 再build一下 再开一个cloud shell 点一下头部标识中的 下载另一个用于debug的repositor
  • 揭开golang中defer的坑

    揭开golang中defer的坑 defer执行顺序 后进先出 是个栈 函数在执行最后的RET返回指令前 会先检查是否存在defer语句 如果有从栈中依次取出 匿名返回值在return执行时被声明然后给他赋值 所以并不会返回在defer中修
  • arduino uno r3 机械臂

    1 硬件 arduino uno r3 改进板 sg90舵机 180度 x 4 JoyStick Shield PS2游戏摇杆扩展板 或者按键 遥杆模块 3D打印件 M3螺丝螺母 10mm 15mm 25mm 以及M2螺丝螺母 2 接线 开
  • 恒流源电路简介

    一 NPN三极管恒流源 如上图 假设D1 D2正向导通压降Vf为0 7V 那么三极管Q1基级电压Ub 2Vf 1 4V 假设三极管Q1基级和发射级之间压降Ube为0 7V 那么Q1发射级的电压Ue则为Ub Ube 1 4 0 7 0 7V
  • 02:STM32--EXTI外部中断

    目录 一 中断 1 简历 2 AFIO 3 EXTI 编辑 4 NVIC基本结构 5 使用步骤 二 中断的应用 A 对外式红外传感计数器 1 连接图 编辑 2 函数介绍 3 硬件介绍 4 计数代码 B 旋转编码计数器 1 连接图 2 硬件介
  • selenium被反爬出现空白页

    第一种方法 参考 Selenium Webdriver被检测识别出来的应对方案 第二种方法 browser execute cdp cmd Page addScriptToEvaluateOnNewDocument source Objec
  • linux gdb使用

    gdb 是由 GNU 软件系统社区提供的调试器 可以监控程序执行的每一个细节 包括变量的值 函数的调用过程 内存中数据 线程的调度等 从而发现隐藏的错误或者低效的代码作用 q cpp include
  • SQL注入简介和注入方法教学

    文章目录 SQL注入原理 SQL注入危害 SQL注入判断 SQL注入的分类 按参数类型分类 按数据库返回结果分类 按注入点位置分类 按参数类型分类 数字型 字符型 搜索型 按数据库返回结果分类 回显注入 报错注入 盲注 按注入点位置分类 G
  • DCDC升压boost电路输出电压问题

    boost输出电压 在稳定后 Vo Vin 1 d 该式子表明 输出电压唯一由占空比和输入电压决定 也就是说 在开环情况下 Vo不受负载大小的影响 但是实际体验是 Vo的稳定需要通过负反馈调节 这是什么原因造成的呢 其实造成上述现象的原因
  • 赠书啦

    随着 ChatGPT 面世并迅速风靡全球 AI 又一次进入寻常百姓家 而 ChatGPT 的一个重要支持正是自然语言处理中的大规模语言模型 GPT 由于自然语言是人类最方便 最重要的交流方式 是描述知识 传承文化的重要工具 因此对自然语言处
  • CodeSmith 使用教程(9): Progress对象

    使用Progress对象可以为CodeSmith生成代码的过程显示一个进度条 这对于生成比较费时的模板操作是非常有用的 如果你使用Visual Studio 可以在状态栏中显示一进度条 使用进度条的方法是通过CodeTemplate对象的P
  • 软件测试开发学习——第六天

    静态白盒测试 检查设计和代码 静态白盒测试 在不执行软件的条件下有条理地仔细审查软件设计 体系结构和代码 从而找出软件的缺陷的过程 有时称为结构化分析 进行白盒测试的首要原因是尽早发现软件缺陷 以找出动态黑盒测试难以发现或隔离的软件缺陷 白
  • elasticsearch7.17.3实现按terms传入内容排序,类似mysql中order by filed()的排序方式

    现有一个需求 需要在elasticsearch中实现用terms筛选内容 并且按terms传入的内容顺序排列 类型于mysql中order by filed 的排序方式 具体实现如下 目录 一 需求 二 整体思路 三 es查询语句 四 ja