一、Elasticsearch简介
Elasticsearch是一个基于Lucene的分布式搜索引擎,能实现近实时的全文搜索并具有以下特点:
1、分布式搜索引擎,数据可以分片存储在集群中,提供水平扩展能力;
2、支持多种数据格式,包括结构化和非结构化数据;
3、提供丰富的RESTful API,使用简单方便;
4、提供机器学习和数据分析的功能。
因此,Elasticsearch在企业搜索、日志分析、安全日志分析、异常检测、物联网等领域得到了广泛的应用。
二、Java连接Elasticsearch
Elasticsearch提供Java API,可以很方便地在Java应用中使用Elasticsearch。
1、Maven依赖
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.12.1</version>
</dependency>
这里使用了最新版本的elasticsearch7.12.1。
2、连接Elasticsearch
public static RestHighLevelClient createClient() {
// 确认es集群节点地址
String hostname = "localhost";
RestClientBuilder builder = RestClient.builder(new HttpHost(hostname, 9200, "http"));
RestHighLevelClient client = new RestHighLevelClient(builder);
return client;
}
这里连接了本地的Elasticsearch集群,默认地址为localhost:9200。
3、CRUD操作
Java API提供了与RESTful API对应的接口,可以进行CRUD操作。
a)创建索引
// 创建索引
public static void createIndex(RestHighLevelClient client, String index) throws IOException {
// 创建索引请求
CreateIndexRequest request = new CreateIndexRequest(index);
// 客户端执行请求
CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
System.out.println("创建索引 + " + index + " " + response.isAcknowledged());
}
这里创建了一个名为index的索引。
b)删除索引
// 删除索引
public static void deleteIndex(RestHighLevelClient client, String index) throws IOException {
DeleteIndexRequest request = new DeleteIndexRequest(index);
// 客户端执行请求
AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);
System.out.println("删除索引 + " + index + " " + response.isAcknowledged());
}
这里删除了名为index的索引。
c)添加文档
// 添加文档
public static void addDoc(RestHighLevelClient client, String index, String id, String source) throws IOException {
IndexRequest request = new IndexRequest(index);
request.id(id);
request.source(source, XContentType.JSON);
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
System.out.println("添加文档 + " + id + " " + response.getResult());
}
这里向名为index的索引中添加了一条id为1的文档。
d)获取文档
// 获取文档
public static void getDoc(RestHighLevelClient client, String index, String id) throws IOException {
// 获取文档请求
GetRequest getRequest = new GetRequest(index, id);
GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
System.out.println("获取文档 + " + id + " " + getResponse.getSourceAsString());
}
这里获取了名为index的索引中id为1的文档。
e)更新文档
// 更新文档
public static void updateDoc(RestHighLevelClient client, String index, String id, String source) throws IOException {
UpdateRequest request = new UpdateRequest(index, id);
request.doc(source, XContentType.JSON);
UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
System.out.println("更新文档 + " + id + " " + response.getResult());
}
这里修改了名为index的索引中id为1的文档。
f)删除文档
// 删除文档
public static void deleteDoc(RestHighLevelClient client, String index, String id) throws IOException {
DeleteRequest request = new DeleteRequest(index, id);
DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
System.out.println("删除文档 + " + id + " " + response.getResult());
}
这里删除了名为index的索引中id为1的文档。
三、与Spring Boot集成
当使用Spring Boot开发应用时,使用Elasticsearch也可以很方便地集成。
1、Maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
这里使用了Spring Boot提供的spring-boot-starter-data-elasticsearch。
2、配置文件
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300
spring.data.elasticsearch.cluster-name=my-application
这里配置了连接localhost:9300的Elasticsearch集群,集群名称为my-application。
3、实体类
@Document(indexName = "index", type = "doc")
public class Doc {
@Id
private String id;
private String name;
private Integer age;
// getter and setter
}
这里定义了一个名为index的索引,对应的实体为Doc。
4、ElasticsearchRepository
public interface DocRepository extends ElasticsearchRepository<Doc, String> {
}
这里定义了一个继承自ElasticsearchRepository的DocRepository接口,该接口提供了多种CRUD操作。
5、CRUD操作
使用Spring Boot集成Elasticsearch后,使用ElasticsearchRepository接口提供的方法可以对Elasticsearch进行CRUD操作。
a)添加文档
@Autowired
private DocRepository docRepository;
Doc doc = new Doc();
doc.setId("1");
doc.setName("Tom");
doc.setAge(20);
docRepository.save(doc);
这里向名为index的索引中添加了一条id为1的文档。
b)获取文档
Doc doc = docRepository.findById("1").orElse(null);
if(doc != null){
System.out.println(doc.getName() + " " + doc.getAge());
}
这里获取了名为index的索引中id为1的文档。
c)更新文档
Doc doc = docRepository.findById("1").orElse(null);
if(doc != null){
doc.setAge(21);
docRepository.save(doc);
}
这里修改了名为index的索引中id为1的文档的age字段。
d)删除文档
docRepository.deleteById("1");
这里删除了名为index的索引中id为1的文档。
四、总结
Java连接Elasticsearch是一项在实际应用中很重要的功能,通过本文的介绍,我们可以清晰地了解到Java与Elasticsearch的连接方式,以及在Java应用中实现CRUD操作的方法。