ElasticSearch使用案例-使用记录
一、针对ES库中数据进行增删改等基础业务实现
1.基础环境
Java语言开发
JDK 11
Spring Boot集成
自行安装ElasticSerach的客户端:ElasticSearch以及可视化Kibana
2. 所需依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.5.14</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>4.2.11</version>
</dependency>
3. 全局配置类
/**
* 一般配置文件中写入Ip端口等信息,如果增加账号密码同步写入即可
*/
@Configuration
public class ElasticSearchClientConfig {
@Value("${data.es.ip}")
private String ip;
@Value("${es.port}")
private Integer esPort;
@Bean
public RestHighLevelClient restHighLevelClient(){
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost(ip, esPort, "http")));
// 此处可以配置连接时长SocketTime时间
return client;
}
}
二、使用场景案例代码
1. 创建对应索引
/**
* 测试类
*/
public class ElasticsearchDemo {
// 引入依赖以及注入配置类之后直接引用客户端
@Autowired
private RestHighLevelClient restHighLevelClient;
/**
* 创建ES索引
*/
public void creatEsIndexTest(){
try {
//创建一个索引请求对象
CreateIndexRequest request = new CreateIndexRequest("your_index_name");
// 定义字段类型映射
XContentBuilder mapping = XContentFactory.jsonBuilder()
.startObject().startObject("properties").startObject("id").field("type", "text").endObject()
.startObject("name").field("type", "keyword").endObject()
// 添加更多字段定义...
.endObject()
.endObject();
// 设置映射
request.mapping(mapping);
// 发送创建索引请求
CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
// 打印创建索引的响应信息
System.out.println("Index created: " + createIndexResponse.index());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
2. 查询索引数据
ES 中查询方式有很多种
针对某一个索引中根据其中某一个字段检索:
1.检索针对不同的字段类型有不同的检索方式
1). 例如:索引中name字段类型为Text类型,检索方式为一般为match不支持多参但是支持分词
2). 例如:索引中sex字段类型为Keyword类型,检索方式一般为term、terms等支持多参不支持分词
模糊搜索局里的两种类型都支持检索方式为:wildcard检索方式下面会有代码示例。
检索方式支持聚合,支持子聚合等还是比较丰富的。
/**
* 测试类
*/
public class ElasticsearchDemo {
// 引入依赖以及注入配置类之后直接引用客户端
@Autowired
private RestHighLevelClient restHighLevelClient;
/**
* 查询索引数据
*/
public void selectEsIndexTest(){
try {
// 每一个searchRequest.source().query()只有一种检索方式
//根据当前的Index_name创建查询对象
//假设索引中字段有id, name, time, sex等
SearchRequest searchRequest = new SearchRequest("index_name");
//根据name进行模糊匹配:字段类型为keyword
searchRequest.source().query(QueryBuilders.wildcardQuery("name", "*张三*"));
//也可以在参数中间增加通配符,但是这样使用方式就不如增加分词器
searchRequest.source().query(QueryBuilders.wildcardQuery("", "*张*三*"));
//根据name进行等价匹配:字段类型为keyword
searchRequest.source().query(QueryBuilders.termQuery("name", "张三"));
//根据name进行等价匹配:字段类型为Text
searchRequest.source().query(QueryBuilders.matchQuery("name", "张三"));
//检索name为张三并且time时间为2023-03-01到2023-03-02的数据
// 与条件:bool查询方式表明有多个条件,语义与Mysql中where条件中的and一样只不过需要加一个条件就增加一个must即可
QueryBuilders.boolQuery().must(QueryBuilders.termQuery("name", "张三"))
.must(QueryBuilders.rangeQuery("time").gte("2023-03-01").lte("2023-03-02"));
//或条件检索 替换must即可
QueryBuilders.boolQuery().should(QueryBuilders.termQuery("name", "张三"))
.should(QueryBuilders.termQuery("sex", "男"));
//非条件
QueryBuilders.boolQuery().mustNot(QueryBuilders.termQuery("name", "张三"))
.mustNot(QueryBuilders.rangeQuery("time").gte("2023-03-01").lte("2023-03-02"));
//时间范围 需要定义好自己的字段类型format支持的类型
QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery("time").gte("2023-03-01").lte("2023-03-02"));
//复杂条件 可以使用should must等嵌套使用
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
3. 根据ID修改数据
/**
* 测试类
*/
public class ElasticsearchDemo {
// 引入依赖以及注入配置类之后直接引用客户端
@Autowired
private RestHighLevelClient restHighLevelClient;
/**
* 根据ID修改数据
*/
public void updateEsIndexTest(){
try {
// 要更新的索引和文档ID
String indexName = "your_index_name";
String documentId = "your_document_id";
// 构建更新请求
UpdateRequest updateRequest = new UpdateRequest(indexName, documentId);
// 定义要更新的字段值
XContentBuilder docBuilder = XContentFactory.jsonBuilder().startObject()
.field("field1", "new_value") // 将 "field1" 的值更新为 "new_value"
// 添加更多字段更新...
.endObject();
// 设置更新内容
updateRequest.doc(docBuilder);
// 发送更新请求
UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
// 打印更新的响应信息
System.out.println("Update response: " + updateResponse.getResult());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
4. 根据ID删除某一条数据或者多条数据
/**
* 测试类
*/
public class ElasticsearchDemo {
// 引入依赖以及注入配置类之后直接引用客户端
@Autowired
private RestHighLevelClient restHighLevelClient;
/**
* 根据ID删除数据
*/
public void deleteEsIndexTest(){
try {
// 连接到Elasticsearch集群,确保替换成你的Elasticsearch节点信息
try (RestHighLevelClient client = new RestHighLevelClient.Builder()
.build()) {
// 要删除的索引
String indexName = "your_index_name";
// 构建删除请求
DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(indexName);
// 定义查询条件,这里是一个示例条件,value可以是一个List<Stirng> 可以是你创建的任意一个字段
List<String> idsList = new ArrayList<>();
//根据业务添加值
deleteByQueryRequest.setQuery(QueryBuilders.termsQuery("field1", idsList));
// 发送删除请求
DeleteByQueryResponse deleteByQueryResponse = client.deleteByQuery(deleteByQueryRequest, RequestOptions.DEFAULT);
// 打印删除的响应信息
System.out.println("Delete by query response: " + deleteByQueryResponse);
} catch (IOException e) {
e.printStackTrace();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}