当前位置: 首页 > article >正文

Elasticsearch - SpringBoot 查询 es 相关示例

文章目录

  • 前言
    • 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.kler.cn/a/284284.html

相关文章:

  • 【练习案例】30个 CSS Javascript 加载器动画效果
  • Spring Cloud Contract快速入门Demo
  • 【计算机网络】Socket编程接口
  • Typescript类型运算符、关键字以及内置高级类型
  • go reflect 反射
  • 【深度学习】LSTM、BiLSTM详解
  • Linux Debian12安装flameshot火焰截图工具
  • 线段树维护更多类型的信息
  • c++ 分布式服务器 1
  • Linux | 进程池技术解析:利用无名管道实现并发任务处理(含实现代码)
  • NTP时间服务器是什么?功能是什么?京准电钟
  • 今日(2024年8月30日)科技新闻(本周)
  • Git之2.5版本重要特性及用法实例(五十七)
  • 《机器学习》【项目】 爬虫爬取数据、数据分词、贝叶斯算法、判断分类 <完整实战详解> (全篇完结)
  • ajax学习笔记
  • 认知杂谈42
  • 【系统】Linux系统下载 ubuntu/deepin/deepin
  • JAVA毕业设计166—基于Java+Springboot+vue3的流浪宠物救助管理小程序(源代码+数据库)
  • golang学习笔记——channel使用场景
  • 【云原生】Kubernetes中如何通过Pod名称查询Docker容器ID,通过Docker容器ID查询Pod名称?
  • Kafka队列:分布式系统的消息引擎
  • 【方案合集】园区数据治理解决方案(PPT原件)
  • RK3588 系列之2—通过PC网络共享,连接开发板
  • 8款对比分析:哪款协同办公软件最适合您的团队?
  • 算法题常用的STL(Java与C++)(90%)
  • ArcEngine二次开发实用函数18:使用shp矢量对栅格文件进行掩模和GP授权获取