Elasticsearch - SpringBoot 查询 es 相关示例

avatar
作者
筋斗云
阅读量:0

文章目录

前言

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


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

    广告一刻

    为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!