ElasticSearch Java 开发与Spring Boot集成实践

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:Elasticsearch是一个全文搜索引擎,广泛用于信息检索和数据分析。本教程详细介绍了如何使用Java API在Java环境中与Elasticsearch进行交互,包括数据的索引、查询、更新和删除操作。同时也涉及了如何通过Spring Boot框架整合Elasticsearch,并提供了实际操作的Demo。 ElasticSearch java开发Demo(5.1.5)_Javaelasticsearch_ES使用java开发_ela

1. ElasticSearch概述及应用场景

Elasticsearch简介

Elasticsearch是一个开源、分布式的搜索与分析引擎,它能够存储、搜索和分析大量结构化和非结构化数据。它建立在Apache Lucene之上,提供了简单的REST API进行交互,广泛应用于日志数据分析、搜索引擎、应用搜索、大数据实时分析等领域。

Elasticsearch的核心功能

  • 实时搜索:Elasticsearch支持对大量数据进行实时搜索,用户几乎可以即时获得搜索结果。
  • 数据存储:它可以存储任何形式的数据,并对这些数据进行索引和搜索。
  • 数据分析:Elasticsearch提供了强大的数据分析功能,包括聚合、数据统计等。
  • 可扩展性:Elasticsearch具备良好的水平扩展性,能够轻松扩展至数百个节点。
  • 安全性:提供认证、授权、加密等安全特性。

Elasticsearch的应用场景

  • 日志分析 :Elasticsearch可以作为日志平台,收集、存储和分析系统日志,提高问题的排查效率。
  • 搜索引擎 :它被广泛应用于构建互联网搜索引擎,支持复杂的搜索需求。
  • 应用搜索 :开发者可以将Elasticsearch集成到自己的应用中,提供搜索功能。
  • 电子商务 :Elasticsearch能够提升电子商务网站的搜索能力,改善用户体验。
  • 大数据分析 :Elasticsearch可用于分析大量的结构化和非结构化数据,快速提取有价值的信息。

随着数据的爆炸性增长和实时性要求的提升,Elasticsearch在处理大规模数据集方面显示出无可比拟的优势,成为当今数据驱动型企业的核心组件。

2. Java环境中Elasticsearch API的安装与配置

2.1 安装ElasticSearch和Java客户端

2.1.1 下载和安装ElasticSearch

ElasticSearch 是一个高度可扩展的开源全文搜索和分析引擎。它可以近乎实时地存储、搜索和分析大量数据。在 Java 环境中与 ElasticSearch 交互,首先需要在服务器上下载并安装 ElasticSearch 本身。

在本章节,我们将介绍如何在 Linux 环境下下载并安装 ElasticSearch。请根据你的操作系统和环境,参照 ElasticSearch 官方文档进行相应的安装。

首先,访问 ElasticSearch 官方网站下载页面,选择合适版本的压缩包。这里我们以下载版本 7.10.0 为例:

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.0-linux-x86_64.tar.gz

下载完成后,使用 tar 命令解压缩安装包:

tar -xzf elasticsearch-7.10.0-linux-x86_64.tar.gz

解压完成后,进入解压缩后的目录:

cd elasticsearch-7.10.0/

启动 ElasticSearch 服务,可以通过以下命令:

./bin/elasticsearch

服务启动后,可以通过访问 http://localhost:9200 来检查 ElasticSearch 是否成功运行。

2.1.2 下载和安装Java客户端

为了在 Java 程序中与 ElasticSearch 交互,我们需要使用官方提供的 Java 客户端。可以访问 Maven 中央仓库下载对应的依赖。

在项目的 pom.xml 文件中添加如下依赖:

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.10.0</version>
</dependency>

确保依赖正确添加后,即可在 Java 代码中使用。简单示例代码如下:

RestHighLevelClient client = new RestHighLevelClient(
    RestClient.builder(new HttpHost("localhost", 9200, "http")));

请确保你的防火墙设置允许对 ElasticSearch 端口的访问,否则可能会遇到连接问题。

2.2 配置ElasticSearch和Java客户端

2.2.1 配置ElasticSearch

配置 ElasticSearch 主要是通过编辑其配置文件 elasticsearch.yml 来实现的。默认情况下,配置文件位于解压缩目录下的 config 文件夹中。

为了增强安全性,你可能需要设置 xpack.security.enabled true 并配置相应的用户权限。此外,也可以配置集群名称、节点名称等信息。

cluster.name: "my-application"
node.name: "node-1"
network.host: 192.168.0.1
http.port: 9200

确保配置更改之后,重新启动 ElasticSearch 服务以应用更改。

2.2.2 配置Java客户端

配置 Java 客户端主要是为了调整其连接参数,如连接超时、重试次数等,以便更好地适应不同的网络环境和需求。

RestHighLevelClient 的构造方法中提供了丰富的参数配置。例如,可以指定连接超时和操作超时:

RestClient lowLevelClient = RestClient.builder(
    new HttpHost("localhost", 9200, "http"))
    .setRequestConfigCallback(requestConfigBuilder -> 
        requestConfigBuilder.setConnectTimeout(5000)
                           .setSocketTimeout(60000))
    .build();

RestHighLevelClient client = new RestHighLevelClient(lowLevelClient);

在这个例子中,我们设置了连接超时时间为5秒,操作超时时间为1分钟。请根据实际情况调整这些参数。

以上步骤介绍了在 Java 环境中安装和配置 ElasticSearch 及其官方 Java 客户端的基本流程。接下来,我们会继续深入到如何使用 Java API 与 ElasticSearch 进行交互,包括连接、索引、查询、更新和删除操作。

3. Elasticsearch与Java客户端的连接方法

3.1 建立连接的基本方法

Elasticsearch与Java客户端连接是进行数据交互的第一步。了解如何建立连接对于开发者来说是至关重要的。我们将详细介绍在Java中如何建立和关闭Elasticsearch连接。

3.1.1 创建和关闭连接

首先,要创建连接,我们需要使用Elasticsearch提供的Java High Level REST Client。以下是使用该客户端创建连接的基本步骤。

RestHighLevelClient client = new RestHighLevelClient(
    RestClient.builder(
        new HttpHost("localhost", 9200, "http")
    )
);

在这段代码中,我们构建了一个 RestHighLevelClient 实例。构造函数接受一个 RestClient.Builder 对象,它通过 HttpHost 设置Elasticsearch服务器的地址、端口和协议。默认情况下,Elasticsearch使用HTTP协议,端口通常是9200。

然后,为了确保资源得到妥善释放,我们需要实现 AutoCloseable 接口来管理资源。在Java 7及以上版本,可以使用try-with-resources语句:

try (RestHighLevelClient client = new RestHighLevelClient(
    RestClient.builder(
        new HttpHost("localhost", 9200, "http")
    )
)) {
    // 在这里使用client执行操作
} catch (IOException e) {
    e.printStackTrace();
}

try语句块结束时,会自动调用 RestHighLevelClient close() 方法,以关闭与Elasticsearch的连接并释放相关资源。对于Java 7之前的版本,可以使用try-finally块来实现相同的资源管理。

为了深入理解连接的工作原理,我们可以通过以下步骤分析代码:

  1. 引入所需的依赖库。确保项目中包含了Elasticsearch的Java High Level REST Client库。
  2. 创建 RestHighLevelClient 实例,初始化时传入 RestClient.builder
  3. 使用try-with-resources语句管理资源,确保即使发生异常也能正确关闭客户端。
  4. 在try块中编写业务逻辑代码,执行对Elasticsearch的操作。
  5. 在catch块中处理可能出现的 IOException ,这是一种常见的异常处理方式。

在实际应用中,正确地管理连接资源能够有效地避免资源泄露和不必要的性能开销。接下来,我们将继续探讨连接的高级方法,如连接池的使用和异常处理机制。

4. 使用Java API对Elasticsearch文档进行索引

4.1 创建索引和添加文档

4.1.1 创建索引

在Elasticsearch中,创建索引是一种将文档结构化存储到数据库的过程。索引就像是传统关系数据库中的表,它定义了存储的文档类型及其格式。我们可以利用Java API来创建索引,并在其中添加文档。

import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentType;

public boolean createIndex(Client client, String indexName) {
    CreateIndexRequest request = new CreateIndexRequest(indexName);
    // 可以在这里设置索引的配置,例如分片数、副本数等
    request.settings(Settings.builder().put("index.number_of_shards", 3).put("index.number_of_replicas", 2));
    // 执行创建索引操作
    CreateIndexResponse response = client.admin().indices().create(request).actionGet();
    // 检查是否创建成功
    return response.isAcknowledged();
}

在这个代码块中,我们通过 CreateIndexRequest 构造了一个创建索引的请求,并且通过 Settings.builder() 定义了索引的配置参数,如分片数和副本数。最后我们通过 client.admin().indices().create(request).actionGet() 执行创建请求,并通过返回的响应判断索引是否被成功创建。

4.1.2 添加文档

文档是Elasticsearch索引中的基本存储单元,它相当于关系数据库中的一行记录。文档在Elasticsearch中是以JSON格式存储的。

import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.common.xcontent.XContentType;

public boolean indexDocument(Client client, String indexName, String id, String jsonString) {
    IndexRequest request = new IndexRequest(indexName);
    request.id(id); // 设置文档的ID
    request.source(jsonString, XContentType.JSON); // 设置文档的内容及格式

    // 执行添加文档操作
    IndexResponse response = client.index(request).actionGet();
    // 检查操作是否成功
    return response.status().equals(RestStatus.CREATED) || response.status().equals(RestStatus.OK);
}

在这个方法中,我们首先创建了一个 IndexRequest 请求,并通过 request.id(id) 设置了文档的唯一标识符。然后通过 request.source(jsonString, XContentType.JSON) 将JSON格式的字符串添加到索引中。通过执行 client.index(request).actionGet() 来添加文档,并通过响应的状态码判断操作是否成功。

4.2 索引和文档的高级操作

4.2.1 文档的更新和删除

文档更新和删除是Elasticsearch中常见的操作。在Java API中,我们可以使用特定的请求来完成这些任务。

文档的更新
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.Client;

public boolean updateDocument(Client client, String indexName, String id, String jsonString) {
    UpdateRequest updateRequest = new UpdateRequest(indexName, id);
    updateRequest.doc(jsonString, XContentType.JSON); // 更新文档的内容

    // 执行更新操作
    UpdateResponse response = client.update(updateRequest).actionGet();
    // 检查操作是否成功
    return response.status().equals(RestStatus.OK);
}

这段代码展示了一个更新操作的实现。通过 UpdateRequest 构造一个更新请求,并通过 updateRequest.doc(jsonString, XContentType.JSON) 设置新的文档内容。执行更新操作后,我们检查返回的状态码来确认操作是否成功。

文档的删除
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.client.Client;

public boolean deleteDocument(Client client, String indexName, String id) {
    DeleteRequest deleteRequest = new DeleteRequest(indexName, id);

    // 执行删除操作
    DeleteResponse response = client.delete(deleteRequest).actionGet();

    // 检查操作是否成功
    return response.status().equals(RestStatus.OK);
}

这段代码演示了如何使用 DeleteRequest 来删除指定索引中的文档。通过调用 client.delete(deleteRequest).actionGet() 执行删除,并通过返回的状态码判断操作是否成功。

4.2.2 多文档操作

Elasticsearch的Java API也支持批量操作文档,这可以大幅提高数据处理的效率。

import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.Client;

public BulkResponse bulkIndex(Client client, List<Pair<String, String>> documents, String indexName) {
    BulkRequestBuilder bulkRequest = client.prepareBulk();

    for (Pair<String, String> documentPair : documents) {
        String id = documentPair.getKey();
        String jsonString = documentPair.getValue();
        IndexRequest indexRequest = new IndexRequest(indexName);
        indexRequest.id(id);
        indexRequest.source(jsonString, XContentType.JSON);
        bulkRequest.add(indexRequest);
    }

    // 执行批量添加操作
    BulkResponse response = bulkRequest.get();
    // 检查是否有失败的操作
    if (response.hasFailures()) {
        // 处理失败情况
    }

    return response;
}

在这个例子中,我们构建了一个 BulkRequestBuilder 来添加多个文档。通过遍历文档列表,将每个文档通过 IndexRequest 添加到批量请求中。使用 bulkRequest.get() 执行批量操作,并检查是否有失败的情况发生。

本章节详细介绍了如何在Java环境中使用Elasticsearch API进行索引的创建和文档的添加、更新和删除操作。下一章节将聚焦于使用Java API实现Elasticsearch文档的查询操作。

5. Java API实现Elasticsearch文档的查询

在处理大量数据时,有效地检索特定文档至关重要。Elasticsearch 提供了强大的查询能力,而 Java API 则提供了一种在 Java 应用程序中构建和执行这些查询的方法。本章将深入探讨如何使用 Java API 对 Elasticsearch 中的文档进行查询,并讨论基本和高级查询操作。

5.1 基本查询操作

Elasticsearch 提供了一个简单的查询语言,即 Query DSL,通过它可以构建复杂的查询。使用 Java API 实现基本查询操作是理解更复杂查询的基础。

5.1.1 查询所有文档

查询所有文档是文档检索中最基础的操作。我们可以使用 match_all 查询来实现这一点,该查询将会返回索引中的所有文档。

// 创建一个搜索请求
SearchRequest searchRequest = new SearchRequest("posts");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
searchRequest.source(searchSourceBuilder);
// 执行搜索请求
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

在上面的代码中, matchAllQuery() 创建了一个 match_all 查询,这将导致返回索引中的所有文档。然后我们构建了一个 SearchRequest 并设置了一个 SearchSourceBuilder ,这个构建器用于配置我们的查询。最后,我们通过 Elasticsearch 客户端执行了搜索请求并获取了响应。

5.1.2 分页和排序查询

在实际应用中,我们往往需要实现分页查询和排序。Elasticsearch 的 from 和 size 参数允许我们进行分页操作。排序可以通过指定要排序的字段以及排序的方向来完成。

// 设置分页参数,例如从第0条记录开始,取10条记录
searchSourceBuilder.from(0);
searchSourceBuilder.size(10);

// 设置排序规则,例如按照日期降序排序
searchSourceBuilder.sort("date", SortOrder.DESC);

在这个例子中, from 方法用于指定开始返回记录的偏移量,而 size 方法用于指定返回记录的数量。 sort 方法用于设置排序规则,其中第一个参数是排序字段,第二个参数是排序的方向。

5.2 高级查询操作

除了基本的查询操作,Elasticsearch 还提供了多种高级查询功能,可以帮助我们根据特定需求检索数据。Java API 也提供了对这些高级查询的支持。

5.2.1 全文搜索和过滤查询

全文搜索是 Elasticsearch 最强大的功能之一。当我们需要搜索文档中包含特定单词或短语时,可以使用 match 查询或 multi_match 查询。过滤查询通常不计算相关性分数,用于快速的 yes/no 决策,并且可以被缓存来加速后续的执行。

// 全文搜索查询
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title", "搜索技术");
searchSourceBuilder.query(matchQueryBuilder);

// 过滤查询
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.filter(QueryBuilders.termQuery("status", "published"));
searchSourceBuilder.query(boolQueryBuilder);

在上面的代码中, matchQuery 方法用于创建全文搜索查询,它接受字段名和要搜索的文本作为参数。 boolQuery 方法用于构建一个布尔查询, filter 方法内嵌了一个 term 查询来表示过滤条件。

5.2.2 聚合查询和建议器

聚合查询允许我们对数据进行汇总和分析,比如计算平均值、最大值或最小值等。建议器(Suggesters)用于为用户输入提供拼写错误更正或自动完成建议。

// 聚合查询示例
TermsAggregationBuilder aggregation = AggregationBuilders.terms("categories").field("category").size(10);
searchSourceBuilder.aggregation(aggregation);

// 建议器查询示例
CompletionSuggesterBuilder suggester = SuggestBuilders.completionSuggestion("suggest_field")
    .prefix("搜索")
    .size(10);
searchSourceBuilder.suggest(suggester);

在聚合查询的例子中,我们使用 terms 方法构建了一个聚合操作,它按照 "category" 字段进行分组,并返回前10个最常见的值。建议器查询通过 completionSuggestion 方法构建了一个建议查询,用于自动完成建议,并限制返回结果的数量为10。

通过这些高级查询操作,开发者能够根据不同的应用场景构建出复杂而强大的查询,以满足不同的业务需求。Elasticsearch 的 Java API 提供了灵活的方法来实现这些操作,同时保持代码的可读性和可维护性。在下一章节中,我们将探索如何使用 Java API 对 Elasticsearch 文档进行更新,继续深入理解和应用 Elasticsearch 的强大功能。

6. Java API对Elasticsearch文档进行更新

在Elasticsearch中,文档是可变的,并且可以通过Java API进行更新。这是通过索引一个新的文档版本来完成的,该版本将替换旧版本,而不是使用单独的更新命令。在这一章中,我们将探讨如何使用Java API更新Elasticsearch中的文档。

6.1 更新文档的基本方法

更新操作是一个简单的索引操作,它会替换掉具有相同ID的现有文档。我们从最基本的更新方法开始,然后深入探讨更高级的更新选项。

6.1.1 更新单个文档

更新单个文档通常涉及将新文档的完整内容发送到Elasticsearch。Elasticsearch在内部处理文档的版本,确保更新过程的一致性。

// 代码示例:更新单个文档
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;

public void updateSingleDocument(RestHighLevelClient client, String index, String id, String jsonString) throws IOException {
    UpdateRequest updateRequest = new UpdateRequest(index, id);
    updateRequest.doc(jsonString, XContentType.JSON);
    UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
    // 更新操作的响应可以在这里处理
}

此代码段通过创建 UpdateRequest 对象来发起更新,然后调用客户端的 update 方法来执行更新。 jsonString 参数是包含更新内容的JSON字符串。 XContentType.JSON 指定了内容类型。

6.1.2 更新多个文档

在需要根据某些条件更新多个文档时,可以使用脚本更新,这对于批量更新操作非常有用。但是,这种更新会比逐个文档更新产生更多的负载,应谨慎使用。

// 代码示例:使用脚本更新多个文档
import org.elasticsearch.action.update.UpdateByQueryRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.script.Script;
import org.elasticsearch.script.ScriptType;

public void updateMultipleDocuments(RestHighLevelClient client, String index, String scriptText, String scriptLang) throws IOException {
    UpdateByQueryRequest updateByQueryRequest = new UpdateByQueryRequest(index);
    updateByQueryRequest.setQuery(QueryBuilders.matchAllQuery()); // 设置查询条件
    updateByQueryRequest.setScript(new Script(scriptLang, ScriptType.INLINE, scriptText, Collections.emptyMap()));
    updateByQueryRequest.setConflicts("proceed"); // 处理冲突的策略
    client.updateByQuery(updateByQueryRequest, RequestOptions.DEFAULT);
}

在此代码段中,我们使用 UpdateByQueryRequest 来构建一个脚本更新的请求。 scriptText 是脚本内容, scriptLang 是脚本语言。 setConflicts 方法定义了如何处理版本冲突。

6.2 更新文档的高级方法

Elasticsearch提供了更高级的更新选项,例如条件更新和脚本更新,这些高级选项允许我们更精确地控制更新过程。

6.2.1 条件更新

条件更新允许我们在文档满足某些条件时才执行更新。这是通过使用Elasticsearch的查询DSL来实现的。条件更新可以减少不必要的更新操作,从而提高效率。

// 代码示例:条件更新文档
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;

public void updateDocumentIfConditional(RestHighLevelClient client, String index, String id, String jsonString, QueryBuilder queryBuilder) throws IOException {
    UpdateRequest updateRequest = new UpdateRequest(index, id);
    updateRequest.doc(jsonString, XContentType.JSON);
    updateRequest如果玩家(queryBuilder); // 添加条件
    UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
    // 更新操作的响应可以在这里处理
}

在此代码段中, 如果玩家 方法接收一个 QueryBuilder 实例,该实例定义了更新操作的条件。

6.2.2 脚本更新

Elasticsearch提供了脚本功能,可以用来编写更新操作逻辑。脚本可以使用Painless或MVEL等内置语言,也可以使用JVM脚本。

// 代码示例:使用脚本更新文档
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.script.Script;
import org.elasticsearch.script.ScriptType;

public void updateDocumentWithScript(RestHighLevelClient client, String index, String id, Script script) throws IOException {
    UpdateRequest updateRequest = new UpdateRequest(index, id);
    updateRequest.script(script);
    UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
    // 更新操作的响应可以在这里处理
}

在此代码段中,我们使用 script 方法添加了一个脚本对象,该对象指定了脚本语言和内容。

通过本章的介绍,我们已经了解了使用Java API进行文档更新的基本和高级方法。每种方法都有其适用场景,开发者应根据实际需求选择合适的方法。在下一章中,我们将探讨如何使用Java API删除Elasticsearch中的文档。

7. Java API删除Elasticsearch中的文档

在处理Elasticsearch中的数据时,删除不再需要的文档是一项常见的任务。Java API提供了多种删除文档的方法,以便于开发者根据不同的需求进行操作。以下将详细介绍使用Java API进行文档删除的基本方法和高级方法。

7.1 删除文档的基本方法

在Elasticsearch中,最基础的删除操作是通过文档ID来进行的。当拥有文档的ID时,可以直接删除该文档。此外,也可以通过设置查询条件来删除匹配的文档。

7.1.1 根据ID删除文档

首先,我们来看一个根据文档ID删除单个文档的例子:

import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;

public class DeleteDocumentById {
    public static void main(String[] args) throws IOException {
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http")));

        DeleteRequest deleteRequest = new DeleteRequest("index_name", "doc_id");
        DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
        client.close();

        System.out.println(deleteResponse.toString());
    }
}

在上述代码中,首先创建了一个 DeleteRequest 对象,指定了要删除的索引名和文档ID。然后执行删除操作,并关闭客户端连接。

7.1.2 根据查询条件删除文档

当需要根据特定条件删除一组文档时,可以通过设置查询条件来实现:

import org.elasticsearch.action.deletebyquery.DeleteByQueryRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;

public class DeleteDocumentsByQuery {
    public static void main(String[] args) throws IOException {
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http")));

        DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest("index_name");
        deleteByQueryRequest.setQuery(QueryBuilders.matchAllQuery());
        client.deleteByQuery(deleteByQueryRequest, RequestOptions.DEFAULT);
        client.close();
    }
}

在此示例中,我们使用了 DeleteByQueryRequest 类,并设置了 match_all_query ,这表示删除所有文档。该方法适用于批量删除操作。

7.2 删除文档的高级方法

除了基本的删除方法外,还有一些高级的删除方法可供使用,例如批量删除和删除索引。

7.2.1 批量删除

在某些情况下,我们可能需要一次性删除多个文档。这时,可以使用批量删除操作,它允许我们同时删除多个文档,提高效率。

import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;

import java.util.ArrayList;
import java.util.List;

public class BulkDeleteDocuments {
    public static void main(String[] args) throws IOException {
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http")));

        BulkRequest bulkRequest = new BulkRequest();
        List<String> ids = List.of("doc_id1", "doc_id2", "doc_id3");
        for (String id : ids) {
            bulkRequest.add(new DeleteRequest("index_name", id));
        }

        BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
        client.close();

        System.out.println(bulkResponse.hasFailures());
    }
}

上述代码中,通过创建 BulkRequest 对象并添加多个 DeleteRequest 来实现批量删除。这种批量操作比逐一删除要高效得多。

7.2.2 删除索引

有时候,索引中的数据已经不再需要,这时可以考虑删除整个索引,释放存储空间:

import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.DeleteIndexRequest;

public class DeleteIndex {
    public static void main(String[] args) throws IOException {
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http")));

        DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("index_name");
        AcknowledgedResponse deleteIndexResponse = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
        client.close();

        System.out.println(deleteIndexResponse.isAcknowledged());
    }
}

这段代码通过 DeleteIndexRequest 类来删除指定名称的索引,并检查删除操作是否成功执行。

以上介绍了使用Java API删除Elasticsearch中文档的基本方法与高级方法。通过这些操作,可以有效地管理Elasticsearch中的数据,提高数据处理的灵活性和效率。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:Elasticsearch是一个全文搜索引擎,广泛用于信息检索和数据分析。本教程详细介绍了如何使用Java API在Java环境中与Elasticsearch进行交互,包括数据的索引、查询、更新和删除操作。同时也涉及了如何通过Spring Boot框架整合Elasticsearch,并提供了实际操作的Demo。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值