您的位置:

Java连接Elasticsearch详解

一、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操作的方法。