Springboot 整合 Elasticsearch(五):使用RestHighLevelClient操作ES ②

📁 前情提要:

Springboot 整合 Elasticsearch(三):使用RestHighLevelClient操作ES ①

目录

 一、Springboot 整合 Elasticsearch

1、RestHighLevelClient API介绍

1.1、全查询 & 分页 & 排序

1.2、单条件查询

1.2.1、termQuery

1.2.2、matchQuery

1.2.3、短语检索

1.3、组合查询

1.4、范围查询

1.5、模糊查询

1.6、分组查询


一、Springboot 整合 Elasticsearch

1、RestHighLevelClient API介绍

目前的测试数据有:

1.1、全查询 & 分页 & 排序

    @Test
    public void queryAllDoc() {
        try {
            String indexName = "forest";
            SearchRequest request = new SearchRequest();
            request.indices(indexName);

            // 构建查询的请求体
            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
            sourceBuilder.query(QueryBuilders.matchAllQuery());
            // 设置分页
            sourceBuilder.from(1);
            sourceBuilder.size(3);
            // 设置排序
            sourceBuilder.sort("price",  SortOrder.DESC);

            request.source(sourceBuilder);

            SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);
            if (200 != search.status().getStatus()) {
                log.error("查询失败");
            }
            System.out.println("--------查询结果-----------");
            SearchHits hits = search.getHits();
            for (SearchHit hit : hits) {
                System.out.println(hit.getSourceAsString());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

1.2、单条件查询

1.2.1、termQuery

term属于精确匹配,而且只能查单个词(一个汉字或者一个英文单词),不会对用户输入的内容进行分词;

    @Test
    public void queryDocByKey() {
        try {
            String indexName = "forest";
            SearchRequest request = new SearchRequest();
            request.indices(indexName);
            // 构建查询的请求体
            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
            sourceBuilder.query(QueryBuilders.termQuery("price", "300"));
            request.source(sourceBuilder);

            SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);
            if (200 != search.status().getStatus()) {
                log.error("查询失败");
            }
            System.out.println("--------查询结果-----------");
            SearchHits hits = search.getHits();
            for (SearchHit hit : hits) {
                System.out.println(hit.getSourceAsString());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

1.2.2、matchQuery

match进行搜索的时候,会先进行分词拆分,拆完后,再来匹配;例如输入“枫树”,match会拆分成“枫”,“树”两个字,只要包含其中一个字的都会被查出来。

    @Test
    public void queryDocByKey() {
        try {
            String indexName = "forest";
            SearchRequest request = new SearchRequest();
            request.indices(indexName);
            // 构建查询的请求体
            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
            sourceBuilder.query(QueryBuilders.matchQuery("title", "枫树"));
            request.source(sourceBuilder);

            SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);
            if (200 != search.status().getStatus()) {
                log.error("查询失败");
            }
            System.out.println("--------查询结果-----------");
            SearchHits hits = search.getHits();
            for (SearchHit hit : hits) {
                System.out.println(hit.getSourceAsString());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

1.2.3、短语检索

要求所有的分词必须同时出现在文档中,同时位置必须紧邻一致

    @Test
    public void queryDocByPhraseKey() {
        try {
            String indexName = "forest";
            SearchRequest request = new SearchRequest();
            request.indices(indexName);
            // 构建查询的请求体
            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
            sourceBuilder.query(QueryBuilders.matchPhraseQuery("title", "枫树"));
            request.source(sourceBuilder);

            SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);
            if (200 != search.status().getStatus()) {
                log.error("查询失败");
            }
            System.out.println("--------查询结果-----------");
            SearchHits hits = search.getHits();
            for (SearchHit hit : hits) {
                System.out.println(hit.getSourceAsString());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

1.3、组合查询

  • must:返回的文档必须满足must子句的条件,并且参与计算分值;
  • mustNot:返回的文档必须不满足定义的条件;
  • should:在一个bool查询中,如果没有must或者filter,有一个或者多个should子句,那么只要满足一个就可以返回;
  • filter:返回的文档必须满足filter子句的条件,但是不会像must一样,参与计算分值;
    @Test
    public void queryByCombinationKey() {
        try {
            // 声明搜索条件对象
            String indexName = "forest";
            SearchRequest request = new SearchRequest();
            request.indices(indexName);
            // 构建查询的请求体
            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

            boolQueryBuilder.must(QueryBuilders.matchQuery("price", 1000));
            boolQueryBuilder.should(QueryBuilders.matchQuery("id", 3));
            sourceBuilder.query(boolQueryBuilder);
            request.source(sourceBuilder);
            SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);

            if (200 != search.status().getStatus()) {
                log.error("查询失败");
            }
            System.out.println("--------查询结果-----------");
            SearchHits hits = search.getHits();
            for (SearchHit hit : hits) {
                System.out.println(hit.getSourceAsString());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

[注]当使用should查询时,如果包含了must或者filter查询,那么should的查询语句就不是或者的意思了,而是有或者没有都行的含义。

1.4、范围查询

  • 闭区间查询:QueryBuilders.rangeQuery("${fieldName}").from(${fieldValue1}).to(${fieldValue2});
  • 开区间查询:QueryBuilders.rangeQuery("${fieldName}").from(${fieldValue1}, false).to(${fieldValue2}, false);
  • 大于:QueryBuilders.rangeQuery("${fieldName}").gt(${fieldValue});
  • 大于等于:QueryBuilders.rangeQuery("${fieldName}").gte(${fieldValue});
  • 小于:QueryBuilders.rangeQuery("${fieldName}").lt(${fieldValue});
  • 小于等于:QueryBuilders.rangeQuery("${fieldName}").lte(${fieldValue});
 @Test
    public void queryByCombinationKey() {
        try {
            // 声明搜索条件对象
            String indexName = "forest";
            SearchRequest request = new SearchRequest();
            request.indices(indexName);
            // 构建查询的请求体
            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

            boolQueryBuilder.must(QueryBuilders.rangeQuery("price").from(300).to(500));
            boolQueryBuilder.must(QueryBuilders.rangeQuery("inventory").from(500).to(1000));

            sourceBuilder.query(boolQueryBuilder);
            request.source(sourceBuilder);
            SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);

            if (200 != search.status().getStatus()) {
                log.error("查询失败");
            }
            System.out.println("--------查询结果-----------");
            SearchHits hits = search.getHits();
            for (SearchHit hit : hits) {
                System.out.println(hit.getSourceAsString());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

1.5、模糊查询

    @Test
    public void queryFuzzyDocByKey() {
        try {
            String indexName = "forest";
            SearchRequest request = new SearchRequest();
            request.indices(indexName);
            // 构建查询的请求体
            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
            sourceBuilder.query(QueryBuilders.fuzzyQuery("title", "松").fuzziness(Fuzziness.AUTO));
            request.source(sourceBuilder);

            SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);
            if (200 != search.status().getStatus()) {
                log.error("查询失败");
            }
            System.out.println("--------查询结果-----------");
            SearchHits hits = search.getHits();
            for (SearchHit hit : hits) {
                System.out.println(hit.getSourceAsString());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

1.6、分组查询

按价格分组后求每组的条数

    @Test
    public void queryGroupByKey() {
        try {
            // 声明搜索条件对象
            String indexName = "forest";
            SearchRequest request = new SearchRequest();
            request.indices(indexName);
            // 构建查询的请求体
            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

            sourceBuilder.aggregation(AggregationBuilders.terms("price_groupBy").field("price"));

            request.source(sourceBuilder);
            SearchResponse search = esConfig.restHighLevelClient().search(request, RequestOptions.DEFAULT);

            if (200 != search.status().getStatus()) {
                log.error("查询失败");
            }
            List<KeyAndCount> list = new ArrayList<>();
            System.out.println("--------查询结果-----------");
            Terms terms = search.getAggregations().get("price_groupBy");
            List<? extends Terms.Bucket> buckets = terms.getBuckets();
            for (Terms.Bucket bucket : buckets) {
                KeyAndCount keyAndCount = new KeyAndCount();
                keyAndCount.setKey(bucket.getKey().toString());
                keyAndCount.setCount(bucket.getDocCount());
                list.add(keyAndCount);
                System.out.println(keyAndCount);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PFA烧杯透明聚四氟乙烯刻度量杯

PFA烧杯&#xff0c;刻度清晰&#xff0c;耐酸碱&#xff0c;和有机溶剂。

模板进阶:非类型模板参数,特化

一、非类型模板参数 非类型模板参数&#xff0c;就是用一个常量作为 类/函数 的模板参数&#xff0c;在 类/函数 中可以被当成常量使用。 template<class T, size_t N>// N 为一个非类型模板参数 class Stack { public:Stack(){_a new T[N];} protected:T* _a; };int m…

Python环境安装及Selenium引入

Python环境安装 环境下载 Download Python | Python.org 环境安装 需使用管理员身份运行 查看环境是否安装成功 python --version 如果未成功则检查环境变量配置 安装 Selenium 库 pip install selenium Selenium 可以模拟用户在浏览器中的操作&#xff0c;如点击按钮、填写…

Python的异常处理机制之基础代谢

try语句是Python中的异常处理机制。当我们预料到某个代码块可能会引发异常时&#xff0c;可以将这部分代码放在try语句块中。如果try语句块中的代码执行时发生异常&#xff0c;Python会跳出当前的执行流程&#xff0c;并查找是否有对应的异常处理代码。 try语句的基本语法如下…

C++第五弹---类与对象(二)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 类与对象 1、类对象模型 1.1、如何计算类对象的大小 1.2、类对象的存储方式猜测 1.3、结构体内存对齐规则 2、this指针 2.1、this指针的引出 2.2…

Spring Cloud Alibab 入门搭建,包含Nacos中心,注册服务发现服务,Feign请求,GateWay网关,sentinel限流

源码在最后 一、安装Nacos注册中心 1.1查看Nacos官网&#xff0c;安装Nacos服务&#xff0c;下载源码或者安装包 1.2启动服务&#xff0c;默认端口为8848&#xff0c; 二、创建服务注册&发现 2.1使用脚手架&#xff0c;创建注册服务和发现服务项目&#xff0c;我用的版…

轻松玩转消息通信:SimpleAmqpClient 和 RabbitMQ 在C++中的终极指南

Rabbmq服务端 安装 这里我使用docker安装rabbitmq服务端,没有安装的就先去看其他的博客安装rabbitmq或者docker #拉取rabbitmq docker pull rabbitmq:management #运行rabbitmq,记得打开防火墙端口 docker run -d --hostname rabbitsrv --name rabbit -p 5672:5672 -p 15672…

【DL经典回顾】激活函数大汇总(十七)(Softmax2d附代码和详细公式)

激活函数大汇总&#xff08;十七&#xff09;&#xff08;Softmax2d附代码和详细公式&#xff09; 更多激活函数见激活函数大汇总列表 一、引言 欢迎来到我们深入探索神经网络核心组成部分——激活函数的系列博客。在人工智能的世界里&#xff0c;激活函数扮演着不可或缺的角…

机器硬件命令

一、查看机器核数 有以下几种方法 1、lscpu命令 lscpu命令可以显示关于CPU的信息&#xff0c;包括核数、线程数等。在终端中输入以下命令即可查看CPU核数&#xff1a;该命令会输出CPU每个物理插槽的核数。 lscpu | grep "Core(s) per socket" | awk {print $NF} …

zed2i录制前的准备

录制前需设置文件主要有两个 文件一&#xff1a;catkin_zed/src/zed-ros-wrapper-3.8.x/zed_wrapper/params/common.yaml # params/common.yaml # Common parameters to Stereolabs ZED and ZED mini cameras ---# Dynamic parameters cannot have a namespace brightness: …

力扣大厂热门面试算法题 36-38

36. 有效的数独&#xff0c;37. 解数独&#xff0c;38. 外观数列&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.16 可通过leetcode所有测试用例。 目录 36. 有效的数独 解题思路 完整代码 Java Python 37. 解数独 解题思…

ElementUI Message 消息提示,多个显示被覆盖的问题

现象截图&#xff1a; 代码&#xff1a;主要是在this.$message 方法外层加上 setTimeout 方法 <script> export default {name: "HelloWorld",props: {msg: String,},methods: {showMessage() {for (let i 0; i < 10; i) {setTimeout(() > {this.$mess…

k8s-高可用etcd集群 26

reset掉k8s2&#xff0c;k8s3&#xff0c;k8s4节点 清理完网络插件后重启 快速创建一个k8s集群 修改初始化文件 添加master节点 备份 查看etcd配置 启动docker 将etcd二进制命令从容器拷贝到本机 备份 查看快照状态 删除集群资源 恢复 停掉所有的核心组件 从快照恢复 重启所有…

如何在CasaOS系统玩客云中安装内网穿透工具实现远程访问内网主机下载资源

文章目录 1. CasaOS系统介绍2. 内网穿透安装3. 创建远程连接公网地址4. 创建固定公网地址远程访问 2月底&#xff0c;玩客云APP正式停止运营&#xff0c;不再提供上传、云添加功能。3月初&#xff0c;有用户进行了测试&#xff0c;局域网内的各种服务还能继续使用&#xff0c;但…

加密算法 —— 有哪些容易入门且实用的算法?

一、背景 对于初学者来说&#xff0c;一些相对容易入门且实用的加密算法如下&#xff1a; 1. Caesar Cipher&#xff08;凯撒密码&#xff09;: - 凯撒密码是最简单的替换式加密算法之一&#xff0c;通过将字母按照固定位数向前或向后偏移来进行加密。尽管在现代安全场景下…

API接口数据集接口pytorch api接口获取数据

API是应用程序的开发接口&#xff0c;在开发程序的时候&#xff0c;我们有些功能可能不需要从到到位去研发&#xff0c;我们可以拿现有的开发出来的功能模块来使用&#xff0c;而这个功能模块&#xff0c;就叫做库(libary)。比如说&#xff1a;要实现数据传输的安全&#xff0c…

外贸干货|小白必须知道的六大开发信模板!

外贸人必看的开发信模板&#xff08;建议收藏学习&#xff09; 一封好的开发信是开发客户环节里至关重要的节点。 大体上需得简洁明了、开门见山、立意明确。内容上要注重客户需求和问题的解决。另外&#xff0c;高质量的开发信一定不是千篇一律的&#xff0c;而是“入乡随俗…

【进阶五】Python实现SDVRP(需求拆分)常见求解算法——遗传算法(GA)

基于python语言&#xff0c;采用经典遗传算法&#xff08;GA&#xff09;对 需求拆分车辆路径规划问题&#xff08;SDVRP&#xff09; 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整3. 求解结果4. 代码片段参考 往期优质资源 经过一年多的创作&#xff0c;目前已经成熟的…

RISC-V 编译环境搭建:riscv-gnu-toolchain 和 riscv-tools

RISC-V 编译环境搭建&#xff1a;riscv-gnu-toolchain 和 riscv-tools 编译环境搭建以及说明 操作系统&#xff1a;什么系统都可以 虚拟机&#xff1a;VMmare Workstation Pro 17.50.x (版本不限) 编译环境&#xff1a;Ubuntu 18.04.5 CPU&#xff1a;i7-8750h(虚拟机分配4核…

[ C++ ] STL---string类的使用指南

目录 前言&#xff1a; string类简介 string类的常用接口 string类对象的构造函数 string类对象的赋值运算符重载 string类对象的容量操作 string类对象的访问与遍历 [ ] 下标遍历 迭代器遍历 普通迭代器iterator ​编辑 const迭代器const_iterator 反向迭代器rever…