Elasticsearch - SpringBoot 查询 es 相关示例

news2024/11/15 10:02:49

文章目录

  • 前言
    • Elasticsearch - SpringBoot 查询 es
      • 1. ES 整合
      • 2. 示例-简单匹配查询
      • 3. 示例-简单范围查询
      • 4. 示例-布尔查询-分页查询-match 查询
      • 5. 示例-布尔查询-分页查询-term查询

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


Elasticsearch - SpringBoot 查询 es

1. ES 整合

yml:

es:
  ip: 192.168.79.1
  port: 9200
  user: yzy
  passWord: yzy

pom:

        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.6.2</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.6.2</version>
        </dependency>

RestHighLevelClient 是 Elasticsearch 客户端,用于执行搜索、索引、删除等操作。

我们这次的demo都是基于RestHighLevelClient 来写的。

注入bean:

package org.example.config;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import cn.hutool.core.util.ObjectUtil;
import sun.misc.BASE64Encoder;

/**
* @description: TODO
* @author 杨镇宇
* @date 2024/8/29 17:02
* @version 1.0
*/
@Configuration
@Slf4j
public class EsConfig {

    @Value("${es.ip}")
    private String esIp;
    @Value("${es.port}")
    private String esPort;
    @Value("${es.user}")
    private String esUser;
    @Value("${es.passWord}")
    private String esPassWord;

    
    @Bean
    public RestHighLevelClient getHighLevelClient(){
        RestHighLevelClient restHighLevelClient = null;
        if (ObjectUtil.isNotEmpty(esIp) && ObjectUtil.isNotEmpty(esPort)){
            RestClientBuilder builder = RestClient.builder(new HttpHost(esIp,Integer.parseInt(esPort),"http"));
            restHighLevelClient = new RestHighLevelClient(builder);
            log.info("Created RestHighLevelClient: {}", restHighLevelClient);

        }
        return restHighLevelClient;
    }

    @Bean
    public RequestOptions getRequestOptions(){
        RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
        return builder.build();
    }

}

2. 示例-简单匹配查询

GET /blog_new/_search
{
  "query": {
    "match": {
      "author": "糖炒栗子"
    }
  },
  "size": 1000
}

在这里插入图片描述
对应的java代码

    private final RestHighLevelClient client;
    @Resource
    private final RequestOptions requestOptions;
    /**
     * 匹配查询
     * @return
     */
    @GetMapping("/api/find_a")
    public void getA() {
        try {
            // 创建 SearchRequest 对象,指定索引名称
            SearchRequest searchRequest = new SearchRequest("blog_new");

            // 构建查询条件
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            searchSourceBuilder.query(QueryBuilders.matchQuery("author", "糖炒栗子"));
            searchSourceBuilder.size(1000);  // 设置返回结果数量
            // 将查询条件添加到 SearchRequest 对象中
            searchRequest.source(searchSourceBuilder);

            // 通过 esIndexUtils 工具类执行查询,假设你想使用默认的 ES 客户端
            SearchResponse response = client.search(searchRequest, requestOptions).queryRequest(searchRequest, "default");

            // 处理查询响应
            if (response != null && response.getHits().getTotalHits().value > 0) {
                response.getHits().forEach(hit -> {
                    log.info(hit.getSourceAsString()); // 打印每个文档的内容
                });
            } else {
                log.info("No results found.");
            }

        }catch (Exception e){
            log.error("错误",e);

        }
    }

3. 示例-简单范围查询

GET /blog_new/_search
{
    "query": {
    "range": {
        "content": {
            "gte": 100,
             "lte": 120
        }
    }
},
    "size": 1000
}

在这里插入图片描述

对应的java代码:

    private final RestHighLevelClient client;
    @Resource
    private final RequestOptions requestOptions;
 @GetMapping("/api/find_b")
    public void getB() {
        try {
            // 创建 SearchRequest 对象,指定索引名称
            SearchRequest searchRequest = new SearchRequest("blog_new");

            // 构建查询条件
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            searchSourceBuilder.query(QueryBuilders.rangeQuery("content").gte(100).lte(120));
            searchSourceBuilder.size(1000);
            // 将查询条件添加到 SearchRequest 对象中
            searchRequest.source(searchSourceBuilder);

            // 通过 esIndexUtils 工具类执行查询,假设你想使用默认的 ES 客户端
            SearchResponse response = client.search(searchRequest, requestOptions).queryRequest(searchRequest, "default");

            // 处理查询响应
            if (response != null && response.getHits().getTotalHits().value > 0) {
                response.getHits().forEach(hit -> {
                    log.info(hit.getSourceAsString()); // 打印每个文档的内容
                });
            } else {
                log.info("No results found.");
            }

        }catch (Exception e){
            log.error("错误",e);

        }
    }

4. 示例-布尔查询-分页查询-match 查询

match 查询:用于全文检索。match 查询会对搜索词进行分析(如分词、标准化),并与文档中经过分析的字段内容进行匹配。

分页查询:
如果您想要获取第一页的结果,每页返回10个文档,您可以将"from"设置为0,
"size"设置为10。如果想获取第二页的结果,您可以将"from"设置为10,"size"设置为10,以此类推。

GET /blog_new/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "jstat命令查看jvm的GC信息2"  }},
        { "range": { "publish_date": { "gte": "2022-01-01" }}}
      ],
      "must_not": [
        { "range": { "content": { "gte": "300" }}}
      ],
      "should": [
        { "match": { "author": "yangzhenyu" }}
      ],
      "minimum_should_match": 1
    }
  },
  "from":0,
  "size": 1000
}

含义:

must: 查询条件必须满足:

title字段必须包含“jstat命令查看jvm的GC信息2”。
publish_date字段的日期必须在2022年1月1日或之后。
must_not: 查询条件不能满足:

content字段的值不能大于等于300。
should: 满足以下条件将提高文档的相关性:

author字段如果包含“yangzhenyu”。
minimum_should_match: 至少需要满足一个should条件。

from: 从结果的第0条开始返回。

size: 返回的文档数量限制为1000条。

对应的java代码:

    private final RestHighLevelClient client;
    @Resource
    private final RequestOptions requestOptions;
   @GetMapping("/api/find_c")
    public void getC() {
        try {
            // 创建 SearchRequest 对象,指定索引名称
            SearchRequest searchRequest = new SearchRequest("blog_new");

            // 构建查询条件
            BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
                    .must(QueryBuilders.matchQuery("title", "jstat命令查看jvm的GC信息2"))
                    .must(QueryBuilders.rangeQuery("publish_date").gte("2022-01-01"))
                    .mustNot(QueryBuilders.rangeQuery("content").gte(300))
                    .should(QueryBuilders.matchQuery("author", "yangzhenyu"))
                    .minimumShouldMatch(1);

            // 构建 SearchSourceBuilder
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            searchSourceBuilder.query(boolQuery);
            searchSourceBuilder.from(0);
            searchSourceBuilder.size(1000);
            searchRequest.source(searchSourceBuilder);

            // 通过 esIndexUtils 工具类执行查询,假设你想使用默认的 ES 客户端
            SearchResponse response = client.search(searchRequest, requestOptions).queryRequest(searchRequest, "default");

            // 处理查询响应
            if (response != null && response.getHits().getTotalHits().value > 0) {
                response.getHits().forEach(hit -> {
                    log.info(hit.getSourceAsString()); // 打印每个文档的内容
                });
            } else {
                log.info("No results found.");
            }

        }catch (Exception e){
            log.error("错误",e);

        }
    }

5. 示例-布尔查询-分页查询-term查询

term 精确匹配:term 查询用于精确匹配字段的内容,不进行分词。它适用于关键词或精确值的匹配,比如数值、日期、布尔值或者不需要分词的字符串(如ID、邮政编码)。
用途:用于精确匹配。在搜索时,term 查询会查找完全与提供的值匹配的文档。通常用于 keyword 类型的字段或者数值字段。

分页查询:
如果您想要获取第一页的结果,每页返回10个文档,您可以将"from"设置为0,"size"设置为10。如果想获取第二页的结果,您可以将"from"设置为10,"size"设置为10,以此类推。

GET /blog_new/_search
{
   "query": {
     "bool": {
       "must": [
         { "term": { "title.keyword": "jstat命令查看jvm的GC信息2" }},
         { "range": { "publish_date": { "gte": "2022-01-01" }}}
       ],
       "must_not": [
         { "range": { "content": { "gte": 300 }}}
       ],
       "should": [
         { "term": { "author.keyword": "yangzhenyu" }}
       ],
       "minimum_should_match": 1
     }
   },
   "from": 0,
   "size": 1000
 }

含义:

 must: 查询条件必须满足:

 title字段必须包含“jstat命令查看jvm的GC信息2”。
 publish_date字段的日期必须在2022年1月1日或之后。
 must_not: 查询条件不能满足:

 content字段的值不能大于等于300。
 should: 满足以下条件将提高文档的相关性:

 author字段如果包含“yangzhenyu”。
 minimum_should_match: 至少需要满足一个should条件。

 from: 从结果的第0条开始返回。

 size: 返回的文档数量限制为1000条。

在这里插入图片描述
对应的java代码:

    @Resource
    private final RestHighLevelClient client;
    @Resource
    private final RequestOptions requestOptions;
    @GetMapping("/api/find_d")
    public void getD() {
        try {
            // 创建 SearchRequest 对象,指定索引名称
            SearchRequest searchRequest = new SearchRequest("blog_new");

            // 构建查询条件
            BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
                    .must(QueryBuilders.termQuery("title.keyword", "jstat命令查看jvm的GC信息2"))
                    .must(QueryBuilders.rangeQuery("publish_date").gte("2022-01-01"))
                    .mustNot(QueryBuilders.rangeQuery("content").gte(300))
                    .should(QueryBuilders.termQuery("author.keyword", "yangzhenyu"))
                    .minimumShouldMatch(1);

            // 构建 SearchSourceBuilder
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            searchSourceBuilder.query(boolQuery);
            searchSourceBuilder.from(0);
            searchSourceBuilder.size(1000);
            searchRequest.source(searchSourceBuilder);

            // 通过 esIndexUtils 工具类执行查询,假设你想使用默认的 ES 客户端
            SearchResponse response = client.search(searchRequest, requestOptions).queryRequest(searchRequest, "default");

            // 处理查询响应
            if (response != null && response.getHits().getTotalHits().value > 0) {
                response.getHits().forEach(hit -> {
                    log.info(hit.getSourceAsString()); // 打印每个文档的内容
                });
            } else {
                log.info("No results found.");
            }

        }catch (Exception e){
            log.error("错误",e);

        }
    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习的基础_多层感知机的手动实现

多层感知机&#xff08;Multilayer Perceptron&#xff0c;简称MLP&#xff09;是一种前馈人工神经网络。它包含至少三层节点&#xff1a;一个输入层、一个或多个隐藏层以及一个输出层。除输入节点外&#xff0c;每个节点都是一个带有非线性激活函数的神经元&#xff08;或称为…

c# net8调用vc写的dll

dll程序&#xff08;vc,x86) 头文件 extern "C" int __declspec(dllexport) WINAPI add(int a, int b);实现 int WINAPI add(int a, int b) {return a b; }c#/net8 函数声明&#xff1a; [DllImport("dll/Dll1.dll", CallingConvention CallingCo…

redis的一些重要的基础知识

文章目录 1. rehash1.1 redis的hash表的数据结构 2. AOF日志2.1 简要介绍2.2 AOF重写 3. RDB快照3.1 执行过程3.2 存在问题解决方式 1. rehash 本文只介绍数据结构和结果图&#xff0c;如果要看文字描述过程&#xff0c;可以参考链接&#xff1a;rehash的详细过程 1.1 redis的…

最近 3 个 火火火火 的开源项目!

01 为你的敏感照片添加安全水印 EasyWatermark 是由开发者 rosuH 发起的一个开源项目&#xff0c;旨在帮助用户安全、轻松地为他们的照片添加水印。 这个工具不仅能够保护你的知识产权&#xff0c;还能在一定程度上防止照片被未经授权的人使用。EasyWatermark的核心功能包括&am…

WGCNA加权基因共表达网络一步法分析学习

WGCNA&#xff08;Weighted Gene Co-expression Network Analysis&#xff0c;加权重基因共表达网络分析&#xff09; WGCNA是一种用于分析基因表达数据的系统生物学方法。主要用于识别在基因表达数据中呈现共表达模式的基因模块&#xff0c;并将这些模块与样本特征&#xff0…

LSTM-Autoencoder深度学习模型在电动机异常检测中的应用

LSTM-Autoencoder深度学习模型在电动机异常检测中的应用 LSTM-Autoencoder Deep Learning Model for Anomaly Detection in Electric Motor Citation: Lachekhab, F.; Benzaoui, M.; Tadjer, S.A.; Bensmaine, A.; Hamma, H. LSTM-Autoencoder Deep Learning Model for Anoma…

Stable Diffusion绘画 | LightFlow工作流插件:一键导入,高效生图

LightFlow 是腾讯开源的工作流插件&#xff0c;通过它可以非常轻松地导入和导出工作流文件&#xff0c;从而快速地加载整个工作流。 下载后&#xff0c;放置在&#xff1a;SD安装目录\extensions&#xff0c;重载UI 即可使用&#xff0c;插件位置在生成图片区域下方&#xff1…

2024年8月31日CSDN自动提示的用法

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

视频结构化从入门到精通———检索比对类应用

检索比对类应用 1 认识“检索比对” 1.检索和比对的区别 检索和比对是信息处理和数据分析中常见的两种操作&#xff0c;虽然二者在一定程度上都有涉及到信息的提取和分析&#xff0c;但其侧重点和应用场景有所不同。检索主要关注从大规模数据集中定位相关信息&#xff0c;而比…

腾讯云TRTC无UI集成——分享屏幕主流、辅流(Vue2+JS+TRTC无UI集成)

先阐述一下问题&#xff0c;在项目中用到腾讯云的TRTC&#xff0c;A端发布A1、A2两个视频源&#xff0c;在B端订阅A1、A2使用两个view进行播放渲染 问题主流视频源和辅流视频源渲染在同一view上&#xff0c;控制台报错 // 播放远端视频 TRTCService.js; setRemoteVideo(view)…

智慧工地可视化整体解决方案(Word完整版)

第 一 章 系统总体设计 1.1 总体架构 1.1.1 系统拓扑 1.1.2 系统组成 1.2 设计概述 1.3 平台系统功能 1.3.1 总部数据看板 1.3.2 项目部数据看板 1.3.3 视频联网系统 1.3.4 实名制考勤系统 1.3.5 安全生产系统 1.3.6 塔吊安全监控子系统 1.3.7 施工升降机安全监控管系统 1.3.8 …

Codeforces Round 969 (Div. 2 ABCDE题) 视频讲解

A. Dora’s Set Problem Statement Dora has a set s s s containing integers. In the beginning, she will put all integers in [ l , r ] [l, r] [l,r] into the set s s s. That is, an integer x x x is initially contained in the set if and only if l ≤ x ≤…

Java程序天生就是多线程程序Java程序天生就是多线程程序吗?

一个Java程序从main()方法开始执行&#xff0c;然后按照既定的代码逻辑执行&#xff0c;看似没有其他线程参与&#xff0c;但实际上Java程序天生就是多线程程序&#xff0c;因为执行main()方法的是一个名称为main的线程。而一个Java程序的运行就算是没有用户自己开启的线程&…

AIGC提示词(2):塑造未来内容创作的核心力量

引言 &#x1f31f; 在这个数字化的时代&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;正变得越来越普遍。从自动写作到图像生成&#xff0c;AI正以前所未有的速度和多样性创造内容。然而&#xff0c;要实现高质量和相关性强的内容生成&#xff0c;关键在于有效地…

Python变量类型

参考&#xff1a; Python 变量类型 | 菜鸟教程 (runoob.com) 变量赋值 Python 中的变量赋值不需要类型声明&#xff08;重点注意这一点&#xff09;。 每个变量在内存中创建&#xff0c;都包括变量的标识&#xff0c;名称和数据这些信息。 每个变量在使用前都必须赋值&#xff…

golang zap日志模块封装sentry

我们自己写个log日志包&#xff0c;把zap和sentry封装到一起。 下面直接贴上主要部分代码&#xff08;两个模块初始化部分的代码请自行查阅官方文档&#xff09;&#xff1a; logger.go package logimport ("github.com/getsentry/sentry-go""go.uber.org/zap…

使用Redis如何实现集群会话同步?

使用Redis如何实现集群会话同步&#xff1f; 1、为什么选择Redis&#xff1f;2、如何实现&#xff1f;1. 环境准备2. 配置Web服务器3. 测试与验证4. 监控与优化 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在分布式Web应用中&#xff0c…

探索全能型AI与专业型AI的未来趋势

目录 前言1. 全能型AI与专业型AI的对比1.1 经济市场与用户吸引力1.2 精度与效果 2. AI模型的全面评估与比较2.1 精度2.2 速度2.3 鲁棒性 3. 专精化与可扩展性的权衡3.1 专精化的优势与挑战3.2 全能型AI的可扩展性 结语 前言 在人工智能领域&#xff0c;随着技术的迅猛发展&…

解决:pip install flash-attn安装失败案例【cuda】【torch】【flash-attn】

问题描述 在一个容器中部署项目环境中&#xff0c;遇到的flash-attn库总是安装失败&#xff0c;报错信息大致是&#xff1a;FileNotFoundError: [Errno 2] No such file or directory: :/usr/local/cuda/bin/nvcc&#xff0c;以及后来可能会提示’torch’未安装&#xff0c;却…

Android中服务(service)的基本用法

文章目录 Android中服务&#xff08;service&#xff09;的基本用法服务是什么定义一个服务启动和停止服务 Android中服务&#xff08;service&#xff09;的基本用法 服务是什么 服务&#xff08;Service&#xff09;是Android中实现程序后台运行的解决方案&#xff0c;它非…