es or查询

2023-11-05

//跨索引查询
SearchRequest request = new SearchRequest(index1,index2);

想实现类似于 select * from table where (a != 1 and b != 1) or (startTime> “2022-05-20” and (a == 1 or b == 1)) 废话不多说,直接上代码

@Autowired
    private RestHighLevelClient client;
 public List<Map<String,Object>> searchList(String index1,String index2,Map<String,Object> paramMap
            ,String time,int page,int size) {
        List<Map<String,Object>> hitList = new ArrayList();
        try {
            //搜索请求
            SearchRequest request = new SearchRequest(index1,index2);
            //请求条件构建器,这里和mybatis中的自定义查询有点类型
            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

            //等于条件(其他的一些条件)
            if (paramMap != null && !paramMap.isEmpty()) {
                paramMap.forEach((k, v) -> {
                    boolQueryBuilder.must(QueryBuilders.termsQuery(k + KEYWORD, v));
                });
            }

            
                BoolQueryBuilder query1 = QueryBuilders.boolQuery();
                query1.mustNot(QueryBuilders.termsQuery("a" + ".keyword", "1"));
                query1.mustNot(QueryBuilders.termsQuery("b" + ".keyword", "1"));

                BoolQueryBuilder query2 = QueryBuilders.boolQuery();
                //时间范围查询
                if (StringUtils.isNotBlank(time)) {
                    query2.must(QueryBuilders.rangeQuery("startTime"+KEYWORD).from(time));
                }

                BoolQueryBuilder shouldQuery = QueryBuilders.boolQuery();
                shouldQuery.should(QueryBuilders.termsQuery("a" + KEYWORD, "1"));
                shouldQuery.should(QueryBuilders.termsQuery("b" + KEYWORD, "1"));
                query2.must(shouldQuery);

                BoolQueryBuilder query3 = QueryBuilders.boolQuery();
                query3.should(query1);
                query3.should(query2);
                boolQueryBuilder.must(query3);
           

            //把查询添加放入请求中
            sourceBuilder.query(boolQueryBuilder);
            request.source(sourceBuilder);
            //起始位置
            sourceBuilder.from((page - 1) * size);
            //查询数量
            sourceBuilder.size(size);
            sourceBuilder.trackTotalHits(true);
            //建立SearchResponse
            SearchResponse response;
         
            response = client.search(request, RequestOptions.DEFAULT);
            //封装查询的信息
            for (SearchHit hit : response.getHits().getHits()) {
                hitList.add(hit.getSourceAsMap());
                log.debug("查询结果:{}", hit.getSourceAsString());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return hitList;
    }

将每一块拆成一个BoolQueryBuilder ,最后or用should()拼接起来

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

es or查询 的相关文章

随机推荐

  • JDBC与PostgreSQL(二)

    目录 一 执行DDL语句 二 执行DML语句 三 执行DQL语句 四 使用预编译的方式执行SQL语句 推荐 一 执行DDL语句 SQL的DDL语句也就是数据定义语言 Data Definition Language 在JDBC中需要获取St
  • linux下U盘和SD卡的热拔插检测

    在Linux中 可以使用udev Linux设备管理器 来检测U盘的插入和拔出事件 udev是一个用于管理和监控设备的子系统 它可以通过监视内核事件来触发相应的操作 创建一个udev规则文件 10 usb rules脚本如下 KERNEL
  • 开源水下机器人之推进器使用教程

    主要还是参考官方原文 点击打开链接 首先看看套件外观 中规中矩 比较简单 器件材料
  • 安装laravel 遇到的一个坑

    在安装php spider之前必须安装Composer 安装Composer之后 通过php spider的说明文档进行安装 出现以下错误 Failed to download vdb uri from source The Process
  • JS逆向 数据类型/常用加密之小白入门基础篇一

    JS逆向 数据类型 常用加密之小白入门基础篇一 文章目录 JS逆向 数据类型 常用加密之小白入门基础篇一 TOC 文章目录 前言 一 JavaScript 基础常识 语法基础 1 1基本数据类型 1 2 引用数据类型 1 3 语句标识符 2
  • 《武术与设计模式》创建型

    本人喜欢武术 故写下此篇 权当消遣 仅供参考 创建型 原意 创建对象的模式 单例 程序 一个对象就存在一个 武林 所谓 武林至尊 宝刀屠龙 号令天下 莫敢不从 匠人在打造屠龙宝刀时 决定打造一件世间仅此一件的宝物 简单工厂 程序 某种类型指
  • 【数据库】MySQL中的锁机制

    MySQL中的锁机制 数据库锁定机制简单来说 就是数据库为了保证数据的一致性 而使各种共享资源在被并发访问变得有序所设计的一种规则 MySQL 数据库由于其自身架构的特点 存在多种数据存储引擎 每种存储引擎的锁定机制都是为各自所面对的特定场
  • 在树莓派linux系统下写c程序

    本文主要介绍如何在树莓派 ubuntu mate系统 下写第一个c程序 两种方式 一是emacs 二是vi 一 用emacs写c程序 1 打开终端 输入 emacs hello em world c 如果你还没有安装 会出现以下提示 如图
  • 关于解决多台服务器间的文件实时同步问题

    最近要做一个相关的解决方案 在虚拟机测试没有问题 给大家分享出来 有更好的解决方案 欢迎讨论 1 1 inotify相关介绍 1 rsync 与传统的cp tar备份方式相比 rsync具有安全性高 备份迅速 支持增量备份等优点 通过rsy
  • java NIO

    概述 NIO主要有三大核心部分 Channel 通道 Buffer 缓冲区 Selector 选择器 NIO 与 IO的区别 IO是面向流的 NIO是面向缓冲区的 Java IO面向流意味着每次从流中读一个或多个字节 直至读取所有字节 它们
  • 晦涩难懂的电路反馈,看完终于懂了!

    一 反馈的基本概念 1 1 什么是反馈 反馈 就是把放大电路的输出量的一部分或全部 通过反馈网络以一定的方式又引回到放大电路的输入回路中去 以影响电路的输入信号作用的过程 1 2 放大电路中引入反馈的作用 放大电路静态工作点会随温度的变化而
  • GDI+ Graphics类

    1 GDI 的核心 Graphics类 1 The Graphics class provides methods for drawing lines curves figures images and text A Graphics ob
  • 操作系统期末复习总结

    操作系统期末复习总结 第一章 操作系统引论 1 1操作系统的目标和作用 1 1 1操作系统的目标 在计算机系统上配置操作系统 其主要目标是 方便性 有效性 可扩充性和开放性 方便性 配置OS后方便使用 有效性 提高系统资源的利用率 可扩充性
  • 西门子S7-1200PLC脉冲控制伺服程序案例

    西门子S7 1200PLC脉冲控制伺服程序案例 此程序是关于西门子1200PLC以PTO脉冲方式控制伺服电机 步进电机的功能块程序 包含两套程序 第一套程序是用梯形图写的 第二套程序是用SCL高级编程语言写的 两套程序实现的功能一致 脉冲模
  • C++——内存分区

    内存分区模型 内存分区 四大分区 编译后运行前 程序运行后 栈区 堆区 1 new使用 2 释放空间 3 new 数组 内存分区 四大分区 代码区 二进制代码 操作系统管理 全局区 全局变量 静态变量 常量 栈区 编译器自动分配释放 函数的
  • laravel 8实现 订单表按月份水平分表

    实现思路 1 设计基础表orders 2 通过后台代码创建今年6月份订单表 order 202206 今年7月份订单表 order 202207 创建表的时候需要进行判断 如果表存在 则不需要创建 这个后台代码会被多次使用并可以重复使用 选
  • Android 开发最佳实践

    https github com futurice android best practices blob master translations Chinese README cn md 组织好它们 在layoutout XMLs布局时
  • windows 向 iPad导入文件

    iPad导入 步骤 截图 步骤 Windows 下载 iTunes 打开 iTunes 账户 gt 授权 gt 对这台电脑授权 然后输入账户密码登陆 找到当前设备 gt 文件共享 gt 找到对应程序 gt 添加文件 截图
  • elementPlus自动按需导入图标

    最近在使用Vue3重构自己的项目 需要用到elementPlus里面的图标 vite中已经配置了elementPlus中的组件自动按需引入 看看图标引入的相关文档 没道理为了图标又全局引入elementPlus吧 于是就有了图标自动按需引入
  • es or查询

    跨索引查询 SearchRequest request new SearchRequest index1 index2 想实现类似于 select from table where a 1 and b 1 or startTime gt 2