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