Elasticsearch - SpringBoot 查询 es 相关示例

前言

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


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);

        }
    }
  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的示例,展示如何在Spring Boot中集成Elasticsearch: 1. 添加依赖:在你的Spring Boot项目的pom.xml文件中,添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> ``` 2. 配置连接信息:在application.properties(或application.yml)文件中,配置Elasticsearch的连接信息,例如: ```properties spring.data.elasticsearch.cluster-nodes=localhost:9200 ``` 3. 创建实体类:创建一个与Elasticsearch索引对应的实体类,可以使用`@Document`注解指定索引名称和类型,以及使用`@Field`注解指定字段的映射关系。例如: ```java import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.FieldType; @Document(indexName = "my_index", type = "my_type") public class MyEntity { @Id private String id; @Field(type = FieldType.Text) private String name; // getter/setter } ``` 4. 创建Repository接口:创建一个继承自`ElasticsearchRepository`的接口,用于对Elasticsearch进行操作。例如: ```java import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; public interface MyEntityRepository extends ElasticsearchRepository<MyEntity, String> { } ``` 5. 使用Repository进行操作:在你的服务类或控制器中,注入`MyEntityRepository`并使用它进行操作。例如: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class MyService { @Autowired private MyEntityRepository repository; public void save(MyEntity entity) { repository.save(entity); } public List<MyEntity> search(String keyword) { return repository.findByName(keyword); } } ``` 这样,你就完成了Spring BootElasticsearch的集成。你可以通过调用`save`方法将实体对象保存到Elasticsearch中,通过调用`search`方法进行搜索操作。 请注意,这只是一个简单的示例,你可以根据自己的需求进行更复杂的操作和配置。更多关于Spring Data Elasticsearch的使用方法,请参考官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栗子~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值