Elasticsearch - SpringBoot 查询 es 相关示例
创始人
2024-09-26 14:54:59
0

文章目录

  • 前言
    • 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:

                     org.elasticsearch             elasticsearch             7.6.2                               org.elasticsearch.client             elasticsearch-rest-high-level-client             7.6.2          

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

相关内容

热门资讯

安卓系统安不了小红书吗,安卓系... 最近有个问题在朋友圈里闹得沸沸扬扬,那就是“安卓系统安不了小红书吗?”这事儿可真是让人一头雾水,今天...
安卓系统下的游戏,探索热门游戏... 你有没有发现,手机里的游戏越来越好玩了?尤其是安卓系统下的那些游戏,简直让人停不下来!今天,就让我带...
深度系统安装安卓工具,一步到位... 亲爱的读者,你是否曾梦想过拥有一台完全由自己组装的安卓系统?想象那是一种怎样的自由和掌控感!今天,就...
安卓系统的虚拟男友 你有没有想过,在繁忙的生活中,有个虚拟的男朋友陪伴,那会是怎样的体验呢?没错,就是安卓系统的虚拟男友...
一加电视安卓系统,打造流畅智能... 亲爱的读者们,你是否在寻找一款既能满足日常观影需求,又能畅享安卓系统乐趣的电视呢?今天,就让我带你深...
逍遥安卓怎么把系统,逍遥安卓系... 你有没有想过,你的安卓手机系统是不是该换换口味了?别看它现在运行得风生水起,但有时候,换一个全新的系...
安卓系统内存占用评测,深度解析... 你有没有发现,随着智能手机的普及,安卓系统已经成为了我们生活中不可或缺的一部分。但是,你是否曾好奇过...
优学派 安卓系统版本,版本升级... 你有没有发现,现在的学习设备越来越智能了?今天,我就要和你聊聊一款特别火的学习神器——优学派,还有它...
苹果系统变安卓app,探索跨平... 你知道吗?最近苹果系统上的一些热门应用竟然悄悄地变成了安卓版的APP!这可真是让人眼前一亮的大事呢!...
安卓系统调用播放录音,Andr... 你有没有想过,手机里那些美妙的录音,是怎么被我们轻松播放的呢?今天,就让我带你一探究竟,揭秘安卓系统...
安卓系统安装应用黑屏,安卓系统... 最近是不是你也遇到了安卓系统安装应用时突然黑屏的尴尬情况?这可真是让人头疼啊!别急,今天就来给你详细...
老版安卓操作系统,操作系统的发... 你有没有想过,手机里的那些老版安卓操作系统,它们就像是一段段尘封的记忆,承载着我们的青春和回忆呢?今...
安卓系统免费开发版,解锁无限创... 你有没有想过,为什么安卓系统那么受欢迎?你知道吗,其实安卓系统有一个特别的地方,那就是它的免费开发版...
安卓系统未来会不会,未知。 你有没有想过,那个陪伴我们手机生活的安卓系统,它的未来会怎样呢?想象每天早上醒来,手机屏幕上跳出的信...
安卓手机2.3系统root,解... 你有没有想过给你的安卓手机2.3系统来个“大变身”?没错,我要说的就是那个神秘的root操作!别小看...
安卓系统的双屏手机,安卓系统引... 你知道吗?最近手机界可是掀起了一股新潮流,那就是安卓系统的双屏手机。这种手机不仅外观独特,功能也相当...
安卓系统如何清理文件,高效释放... 手机里的文件越来越多,是不是感觉安卓系统就像一个杂乱无章的仓库?别急,今天就来教你怎么清理安卓系统里...
调试安卓系统c源码,基于C源码... 亲爱的技术爱好者们,你是否曾对安卓系统的神秘面纱感到好奇?想要一探究竟,亲手调试安卓系统的C源码?那...
安卓系统4.0的模拟,系统革新... 你有没有想过,如果手机里的安卓系统4.0能像真人一样,活灵活现地出现在你面前,那会是怎样的场景呢?今...
安卓系统大_删除哪里,删除哪些... 手机里的安卓系统是不是越来越臃肿了?是不是觉得运行速度越来越慢,存储空间也越来越紧张?别急,今天就来...