阅读量: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); } }