目录
一、单条写入文档
二、批量写入文档
三、更新单条文档
update 操作
upsert 操作
四、更新批量文档
五、根据条件更新文档
六、删除单条文档
七、批量删除文档
八、根据条件删除文档
九、示例 Elasticsearch 操作工具类
十、总结
干货分享,感谢您的阅读!在 Elasticsearch 中实行文档写入和更新操作的基本内容总结。
随着大数据期间的到来,企业和开辟者面对着如何高效存储、检索和分析海量数据的挑战。Elasticsearch作为一个基于Lucene构建的分布式搜刮引擎,因其强大的搜刮能力和及时数据处置惩罚能力,成为了许多企业在构建搜刮应用和分析平台时的首选工具。本文将深入探讨Elasticsearch中关于文档的基本操作,包括单条和批量写入、更新和删除文档,以及根据特定条件进行更新和删除的高级操作。通过实例和代码演示,读者将可以或许快速把握如何在Elasticsearch中有效地管理文档,为构建高效的搜刮和分析系统打下坚实的底子。
一、单条写入文档
在 Elasticsearch 中,要进行单条写入文档操作,可以使用 index 操作。要单条写入文档,可以使用以下DSL语句:
- POST /your_index/_doc/1
- {
- "field1": "value1",
- "field2": "value2",
- "field3": 123,
- "field4": true
- }
复制代码
- POST 请求用于创建文档。
- /your_index 是您的索引名称。
- /_doc/1 中的 1 是文档的唯一标识符,您可以选择性地提供,如果未提供,Elasticsearch 会为您天生一个唯一标识符。
- JSON数据包含文档的字段和值。
分析阐明:
- POST 请求用于创建文档。如果指定的标识符(在上述示例中为 1)已经存在于索引中,它将更新现有文档。否则,它将创建一个新的文档。
- 文档的字段和值在JSON数据中指定,您可以根据您的业务需求提供不同的字段和数据类型。
业务举例:
假设您正在构建一个电子商务平台,并盼望将一件商品的信息写入 Elasticsearch 中,以便进行搜刮和分析。以下是一个示例,包括DSL和Java演示:
DSL语句示例:
- POST /products/_doc/12345
- {
- "product_name": "Laptop",
- "description": "High-performance laptop with SSD storage.",
- "price": 999.99,
- "in_stock": true
- }
复制代码 Java演示:
- import org.elasticsearch.action.index.IndexRequest;
- import org.elasticsearch.action.index.IndexResponse;
- import org.elasticsearch.client.RequestOptions;
- import org.elasticsearch.client.RestHighLevelClient;
- import org.elasticsearch.common.xcontent.XContentType;
- import org.elasticsearch.rest.RestStatus;
- public class SingleDocumentIndexingExample {
- public static void main(String[] args) throws IOException {
- RestHighLevelClient client = createElasticsearchClient();
- // 构建索引请求
- IndexRequest request = new IndexRequest("products");
- request.id("12345"); // 文档标识符
- String jsonString = "{" +
- ""product_name":"Laptop"," +
- ""description":"High-performance laptop with SSD storage."," +
- ""price":999.99," +
- ""in_stock":true" +
- "}";
- request.source(jsonString, XContentType.JSON);
- // 执行索引请求
- IndexResponse response = client.index(request, RequestOptions.DEFAULT);
- // 分析响应
- if (response.status() == RestStatus.CREATED) {
- System.out.println("文档已创建");
- } else if (response.status() == RestStatus.OK) {
- System.out.println("文档已更新");
- } else {
- System.err.println("无法创建/更新文档");
- }
- // 关闭客户端
- client.close();
- }
- }
复制代码 二、批量写入文档
在 Elasticsearch 中,批量写入文档通常使用批量索引(Bulk Indexing)API 来实现。答应一次性将多个文档索引到索引中,进步了性能和服从。要批量写入文档,可以使用 Bulk API 发送一批索引请求。
- POST /your_index/_bulk
- {"index":{"_id":"1"}}
- {"field1":"value1","field2":"value2"}
- {"index":{"_id":"2"}}
- {"field1":"value3","field2":"value4"}
- {"update":{"_id":"3"}}
- {"doc":{"field1":"new_value"}}
- {"delete":{"_id":"4"}}
复制代码
- POST 请求用于批量操作。
- /your_index 是您的索引名称。
- 使用 {"index": {"_id": "1"}} 定义文档的元数据,包括文档标识符。
- 每个文档的数据在之后的行中提供,以JSON格式表现。
分析阐明:
- Bulk API 答应一次性处置惩罚多个索引请求,包括索引、更新和删除操作。
- 使用元数据(例如 {"index": {"_id": "1"}})可以指定每个文档的唯一标识符。
- 除了索引操作,Bulk API 还支持更新和删除操作。
业务举例:
假设您正在构建一个电子商务平台,必要批量索引多个产物的信息。以下是一个示例,包括DSL和Java演示:
DSL语句示例:
- POST /products/_bulk
- {"index":{"_id":"1"}}
- {"product_name":"Laptop1","description":"High-performance laptop with SSD storage.","price":999.99,"in_stock":true}
- {"index":{"_id":"2"}}
- {"product_name":"Laptop2","description":"Affordable laptop for everyday use.","price":599.99,"in_stock":true}
- {"index":{"_id":"3"}}
- {"product_name":"Smartphone1","description":"Flagship smartphone with advanced features.","price":799.99,"in_stock":false}
复制代码 Java演示:
- import org.elasticsearch.action.bulk.BulkRequest;
- import org.elasticsearch.action.bulk.BulkResponse;
- import org.elasticsearch.client.RequestOptions;
- import org.elasticsearch.client.RestHighLevelClient;
- import org.elasticsearch.common.unit.TimeValue;
- import java.io.IOException;
- import java.util.concurrent.TimeUnit;
- public class BulkIndexingExample {
- public static void main(String[] args) throws IOException {
- RestHighLevelClient client = createElasticsearchClient();
- // 创建批量请求对象
- BulkRequest request = new BulkRequest();
- // 添加索引请求
- request.add(new IndexRequest("products").id("1").source(/* JSON 数据 */));
- request.add(new IndexRequest("products").id("2").source(/* JSON 数据 */));
- request.add(new IndexRequest("products").id("3").source(/* JSON 数据 */));
- // 设置超时时间
- request.timeout(TimeValue.timeValueMinutes(2));
- request.timeout("2m");
- // 执行批量请求
- BulkResponse bulkResponse = client.bulk(request, RequestOptions.DEFAULT);
- // 分析响应
- if (bulkResponse.hasFailures()) {
- System.err.println("批量请求中存在失败的操作");
- } else {
- System.out.println("批量请求成功完成");
- }
- // 关闭客户端
- client.close();
- }
- }
复制代码 三、更新单条文档
update 操作
在 Elasticsearch 中,更新单条文档通常使用 update 操作。要更新单条文档,您可以使用 update 操作,示例如下:
- POST /your_index/_update/1
- {
- "doc": {
- "field1": "new_value1",
- "field2": "new_value2"
- }
- }
复制代码
- POST 请求用于实行更新操作。
- /your_index 是您的索引名称。
- /_update/1 中的 1 是要更新的文档的唯一标识符。
- 在 doc 字段中指定要更新的字段和新值。
分析阐明:
- update 操作答应您仅更新文档的特定字段,而不必重写整个文档。这是一种高效的方式来更新文档。
- 更新操作是部门更新,只会修改指定字段的值,而不会影响其他字段。
业务举例:
假设您正在构建一个博客平台,并盼望更新特定博客文章的内容。以下是一个示例,包括DSL和Java演示:
DSL语句示例:
- POST /blog_posts/_update/123
- {
- "doc": {
- "title": "Updated Title",
- "content": "This is the updated content of the blog post."
- }
- }
复制代码 Java演示:
- import org.elasticsearch.action.update.UpdateRequest;
- import org.elasticsearch.action.update.UpdateResponse;
- import org.elasticsearch.client.RequestOptions;
- import org.elasticsearch.client.RestHighLevelClient;
- import org.elasticsearch.common.xcontent.XContentType;
- import org.elasticsearch.rest.RestStatus;
- import java.io.IOException;
- import java.util.Map;
- public class UpdateSingleDocumentExample {
- public static void main(String[] args) throws IOException {
- RestHighLevelClient client = createElasticsearchClient();
- // 创建更新请求
- UpdateRequest request = new UpdateRequest("blog_posts", "123");
- String jsonString = "{" +
- ""doc": {" +
- ""title": "Updated Title"," +
- ""content": "This is the updated content of the blog post."" +
- "}" +
- "}";
- request.doc(jsonString, XContentType.JSON);
- // 执行更新请求
- UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
- // 分析响应
- if (response.status() == RestStatus.OK) {
- System.out.println("文档已成功更新");
- } else {
- System.err.println("无法更新文档");
- }
- // 关闭客户端
- client.close();
- }
- }
复制代码 upsert 操作
upsert 是 Elasticsearch 更新操作中的一个重要概念,它答应在更新文档时,如果文档不存在,则将其插入(新增)。这在盼望更新文档的同时,如果文档尚不存在,就创建一个新文档的情况下非常有用。要实行 upsert 操作,可以在 update 操作中使用 doc_as_upsert 参数,示例如下:
- POST /your_index/_update/1
- {
- "doc": {
- "field1": "new_value1",
- "field2": "new_value2"
- },
- "doc_as_upsert": true
- }
复制代码
- doc 中指定要更新的字段和新值。
- doc_as_upsert 设置为 true,表现如果文档不存在,则将 doc 中的内容插入(新增)为新文档。
分析阐明:
- 当文档存在时,upsert 操作与普通更新操作相同,更新指定的字段。
- 当文档不存在时,upsert 操作会将 doc 中的内容插入为新文档。
业务举例:
假设您正在构建一个在线市肆,想要更新产物的信息,同时如果产物不存在,则添加新产物。以下是一个示例,包括DSL和Java演示:
DSL语句示例:
- POST /products/_update/123
- {
- "doc": {
- "product_name": "Updated Product",
- "price": 29.99
- },
- "doc_as_upsert": true
- }
复制代码 Java演示:
- import org.elasticsearch.action.update.UpdateRequest;
- import org.elasticsearch.action.update.UpdateResponse;
- import org.elasticsearch.client.RequestOptions;
- import org.elasticsearch.client.RestHighLevelClient;
- import org.elasticsearch.common.xcontent.XContentType;
- import org.elasticsearch.rest.RestStatus;
- import java.io.IOException;
- public class UpsertExample {
- public static void main(String[] args) throws IOException {
- RestHighLevelClient client = createElasticsearchClient();
- // 创建更新请求,指定索引名称和文档标识符
- UpdateRequest request = new UpdateRequest("products", "123");
- // 设置要更新的字段和新值
- String jsonString = "{" +
- ""product_name": "Updated Product"," +
- ""price": 29.99" +
- "}";
- request.doc(jsonString, XContentType.JSON);
- // 设置doc_as_upsert为true,以支持upsert
- request.docAsUpsert(true);
- // 执行更新请求
- UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
- // 分析响应
- if (response.status() == RestStatus.CREATED) {
- System.out.println("文档已创建(upsert)");
- } else if (response.status() == RestStatus.OK) {
- System.out.println("文档已成功更新");
- } else {
- System.err.println("无法更新文档");
- }
- // 关闭客户端
- client.close();
- }
- }
复制代码 四、更新批量文档
如果只有文档的ID列表而没有其他条件来更新文档,可以使用 Elasticsearch 的 Bulk API 来批量更新这些文档。Bulk API 不必要DSL语句,而是必要一个包含每个文档更新操作的请求列表。每个更新操作通常包括三个部门:操作类型(update)、索引名称、文档ID和更新数据。
- POST /_bulk
- {"update":{"_index":"your_index","_id":"doc1"}}
- {"doc":{"field1":"new_value1"}}
- {"update":{"_index":"your_index","_id":"doc2"}}
- {"doc":{"field2":"new_value2"}}
复制代码
- POST 请求用于实行批量更新操作。
- _bulk 是Bulk API的端点。
- 对于每个文档,首先定义了一个update操作,然后指定了索引名称(_index)和文档ID(_id),最后提供了要更新的数据。
分析阐明:
- 使用Bulk API,可以在一个请求中批量实行多个文档更新操作。
- 更新操作包括了要更新的文档的索引名称、文档ID以及要更新的数据。
Java演示:
- import org.elasticsearch.action.bulk.BulkRequest;
- import org.elasticsearch.action.bulk.BulkResponse;
- import org.elasticsearch.client.RequestOptions;
- import org.elasticsearch.client.RestHighLevelClient;
- import org.elasticsearch.common.xcontent.XContentType;
- import org.elasticsearch.rest.RestStatus;
- import java.io.IOException;
- import java.util.List;
- public class ElasticsearchBulkUpdater {
- private RestHighLevelClient client;
- public ElasticsearchBulkUpdater(RestHighLevelClient client) {
- this.client = client;
- }
- public void bulkUpdateByIdList(String indexName, List<String> docIdList, List<Map<String, Object>> updatedDataList) {
- try {
- BulkRequest request = new BulkRequest();
- for (int i = 0; i < docIdList.size(); i++) {
- String docId = docIdList.get(i);
- String jsonString = "{" +
- ""doc":" + getJsonString(updatedDataList.get(i)) +
- "}";
- request.add(client.updateRequest(indexName, docId)
- .doc(jsonString, XContentType.JSON)
- .docAsUpsert(true));
- }
- BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);
- if (response.status() == RestStatus.OK) {
- System.out.println("批量更新成功");
- } else {
- System.err.println("批量更新失败");
- }
- } catch (IOException e) {
- System.err.println("执行批量更新时出现IO异常: " + e.getMessage());
- // 在此处处理异常情况
- }
- }
- private String getJsonString(Map<String, Object> updatedData) {
- // 创建更新文档的JSON字符串
- // 省略实现细节
- return jsonString;
- }
- // 其他方法和资源清理
- }
复制代码 五、根据条件更新文档
要根据条件更新文档,可以使用 Elasticsearch 的 Update By Query API。使用 Update By Query API 来根据条件更新文档。示例如下:
- POST /your_index/_update_by_query
- {
- "script": {
- "source": "ctx._source.field1 = 'new_value1'; ctx._source.field2 = 'new_value2';"
- },
- "query": {
- "bool": {
- "must": [
- {
- "term": {
- "field3": "value_to_match"
- }
- },
- {
- "range": {
- "field4": {
- "gte": 10,
- "lt": 20
- }
- }
- }
- ]
- }
- }
- }
复制代码
- POST 请求用于实行更新操作。
- /your_index 是您的索引名称。
- _update_by_query 表现根据查询条件更新文档。
- 在 script 中指定要更新的字段和新值的逻辑。
- 在 query 中定义筛选条件,以确定要更新哪些文档。在此示例中,我们使用了布尔查询(bool),并设置了两个条件:一个是 field3 必须匹配特定值,另一个是 field4 的值必须在10到20之间。
分析阐明:
- 使用 Update By Query API,您可以根据自定义查询条件更新文档。
- 在 script 部门,您可以编写更新逻辑,将必要更新的字段设置为新值。在这个示例中,我们使用 ctx._source.field1 和 ctx._source.field2 来更新字段。
业务举例:
假设您正在管理一个电子商务网站的产物目录,并必要根据条件更新产物信息。以下是一个示例,包括DSL和Java演示:
DSL语句示例:
- POST /products/_update_by_query
- {
- "script": {
- "source": "ctx._source.price = ctx._source.price * 1.1;"
- },
- "query": {
- "bool": {
- "must": [
- {
- "term": {
- "category": "electronics"
- }
- },
- {
- "range": {
- "price": {
- "lt": 100
- }
- }
- }
- ]
- }
- }
- }
复制代码 Java演示:
- import org.elasticsearch.action.updatebyquery.UpdateByQueryRequest;
- import org.elasticsearch.action.updatebyquery.UpdateByQueryResponse;
- import org.elasticsearch.client.RequestOptions;
- import org.elasticsearch.client.RestHighLevelClient;
- import org.elasticsearch.rest.RestStatus;
- import java.io.IOException;
- public class UpdateByQueryExample {
- public static void main(String[] args) throws IOException {
- RestHighLevelClient client = createElasticsearchClient();
- // 创建 Update By Query 请求
- UpdateByQueryRequest request = new UpdateByQueryRequest("products");
- // 在脚本中指定更新逻辑
- request.setScript("ctx._source.price = ctx._source.price * 1.1");
- // 设置查询条件,只更新电子产品且价格低于100的产品
- BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
- .must(QueryBuilders.termQuery("category", "electronics"))
- .must(QueryBuilders.rangeQuery("price").lt(100));
- request.setQuery(boolQuery);
- // 执行 Update By Query 请求
- UpdateByQueryResponse response = client.updateByQuery(request, RequestOptions.DEFAULT);
- // 分析响应
- if (response.status() == RestStatus.OK) {
- System.out.println("文档更新成功");
- } else {
- System.err.println("文档更新失败");
- }
- // 关闭客户端
- client.close();
- }
- }
复制代码 六、删除单条文档
要删除单条文档,可以使用 Elasticsearch 的 Delete API。使用 Delete API 来删除单条文档。示例如下:
- DELETE /your_index/_doc/your_document_id
复制代码
- DELETE 请求用于实行删除操作。
- /your_index 是您的索引名称。
- /_doc 表现文档类型,根据Elasticsearch的最新版本,文档类型通常为_doc。
- your_document_id 是要删除的文档的唯一标识符。
分析阐明:
- 使用 Delete API,您可以根据文档的唯一标识符删除单条文档。
- 您必要指定索引名称和文档的唯一标识符来实行删除操作。
业务举例:
假设正在管理一个博客平台的文章索引,以下是一个示例,包括DSL和Java演示,用于删除单篇文章:
DSL语句示例:
- DELETE /blog_posts/_doc/12345
复制代码 Java演示:
- 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.rest.RestStatus;
- import java.io.IOException;
- public class DeleteSingleDocumentExample {
- public static void main(String[] args) throws IOException {
- RestHighLevelClient client = createElasticsearchClient();
- // 创建删除请求
- DeleteRequest request = new DeleteRequest("blog_posts", "12345"); // 指定索引名称和文档ID
- // 执行删除请求
- DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
- // 分析响应
- if (response.status() == RestStatus.OK) {
- System.out.println("文档已成功删除");
- } else if (response.status() == RestStatus.NOT_FOUND) {
- System.err.println("文档未找到,无法删除");
- } else {
- System.err.println("无法删除文档");
- }
- // 关闭客户端
- client.close();
- }
- }
复制代码 七、批量删除文档
要批量删除文档,可以使用 Elasticsearch 的 Bulk API。使用 Bulk API 来批量删除文档。示例如下:
- POST /your_index/_bulk
- {"delete":{"_index":"your_index","_id":"doc1"}}
- {"delete":{"_index":"your_index","_id":"doc2"}}
复制代码
- POST 请求用于实行批量操作。
- /your_index 是您的索引名称。
- _bulk 是Bulk API的端点。
- 对于每个文档,首先定义了一个delete操作,然后指定了索引名称(_index)和文档ID(_id)。
分析阐明:
- 使用 Bulk API,可以在一个请求中批量实行多个文档的删除操作。
- 每个删除操作包括要删除的文档的索引名称和文档ID。
业务举例:
假设正在管理一个电子商务网站的订单汗青记载,并必要批量删除特定日期之前的订单记载。以下是一个示例,包括DSL和Java演示:
DSL语句示例:
- POST /order_history/_bulk
- {"delete":{"_index":"order_history","_id":"order1"}}
- {"delete":{"_index":"order_history","_id":"order2"}}
复制代码 Java演示:
- import org.elasticsearch.action.bulk.BulkRequest;
- import org.elasticsearch.action.bulk.BulkResponse;
- import org.elasticsearch.client.RequestOptions;
- import org.elasticsearch.client.RestHighLevelClient;
- import org.elasticsearch.rest.RestStatus;
- import java.io.IOException;
- import java.util.List;
- public class ElasticsearchBulkDeleter {
- private RestHighLevelClient client;
- public ElasticsearchBulkDeleter(RestHighLevelClient client) {
- this.client = client;
- }
- public void bulkDeleteByIdList(String indexName, List<String> docIdList) {
- try {
- BulkRequest request = new BulkRequest();
- for (String docId : docIdList) {
- request.add(client.deleteRequest(indexName, docId));
- }
- BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);
- if (response.status() == RestStatus.OK) {
- System.out.println("批量删除成功");
- } else {
- System.err.println("批量删除失败");
- }
- } catch (IOException e) {
- System.err.println("执行批量删除时出现IO异常: " + e.getMessage());
- // 在此处处理异常情况
- }
- }
- // 其他方法和资源清理
- }
复制代码 八、根据条件删除文档
要根据条件删除文档,可以使用 Elasticsearch 的 Delete By Query API。使用 Delete By Query API 来根据条件删除文档。示例如下:
- POST /your_index/_delete_by_query
- {
- "query": {
- "bool": {
- "must": [
- {
- "term": {
- "field1": "value_to_match"
- }
- },
- {
- "range": {
- "field2": {
- "lte": 10
- }
- }
- }
- ]
- }
- }
- }
复制代码
- POST 请求用于实行删除操作。
- /your_index 是您的索引名称。
- /_delete_by_query 表现根据查询条件删除文档。
- 在 query 中定义筛选条件,以确定要删除哪些文档。在此示例中,我们使用了布尔查询(bool),并设置了两个条件:一个是 field1 必须匹配特定值,另一个是 field2 的值必须小于或等于10。
分析阐明:
- 使用 Delete By Query API,可以根据自定义查询条件删除文档。
- 在 query 部门,您可以定义要删除的文档的筛选条件。
业务举例:
假设正在管理一个文档存储系统,必要根据条件删除文档。以下是一个示例,包括DSL和Java演示:
DSL语句示例:
- POST /documents/_delete_by_query
- {
- "query": {
- "bool": {
- "must": [
- {
- "term": {
- "category": "archived"
- }
- },
- {
- "range": {
- "last_modified_date": {
- "lte": "2022-01-01"
- }
- }
- }
- ]
- }
- }
- }
复制代码 Java演示:
- import org.elasticsearch.action.deletebyquery.DeleteByQueryRequest;
- import org.elasticsearch.action.deletebyquery.DeleteByQueryResponse;
- import org.elasticsearch.client.RequestOptions;
- import org.elasticsearch.client.RestHighLevelClient;
- import org.elasticsearch.rest.RestStatus;
- import java.io.IOException;
- public class DeleteByQueryExample {
- public static void main(String[] args) throws IOException {
- RestHighLevelClient client = createElasticsearchClient();
- // 创建 Delete By Query 请求
- DeleteByQueryRequest request = new DeleteByQueryRequest("documents");
- // 设置查询条件,只删除属于 "archived" 类别且最后修改日期早于等于 "2022-01-01" 的文档
- BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
- .must(QueryBuilders.termQuery("category", "archived"))
- .must(QueryBuilders.rangeQuery("last_modified_date").lte("2022-01-01"));
- request.setQuery(boolQuery);
- // 执行 Delete By Query 请求
- DeleteByQueryResponse response = client.deleteByQuery(request, RequestOptions.DEFAULT);
- // 分析响应
- if (response.status() == RestStatus.OK) {
- System.out.println("文档删除成功");
- } else {
- System.err.println("文档删除失败");
- }
- // 关闭客户端
- client.close();
- }
- }
复制代码 九、示例 Elasticsearch 操作工具类
- package org.zyf.javabasic.es;
- import org.elasticsearch.action.bulk.BulkRequest;
- import org.elasticsearch.action.bulk.BulkResponse;
- import org.elasticsearch.action.delete.DeleteRequest;
- import org.elasticsearch.action.delete.DeleteResponse;
- import org.elasticsearch.action.update.UpdateRequest;
- import org.elasticsearch.action.update.UpdateResponse;
- import org.elasticsearch.client.RequestOptions;
- import org.elasticsearch.client.RestHighLevelClient;
- import org.elasticsearch.common.xcontent.XContentType;
- import org.elasticsearch.index.query.QueryBuilders;
- import org.elasticsearch.rest.RestStatus;
- import java.io.IOException;
- import java.util.List;
- import java.util.Map;
- /**
- * @program: zyfboot-javabasic
- * @description: Elasticsearch 操作工具类的简化示例
- * @author: zhangyanfeng
- * @create: 2023-10-06 22:29
- **/
- public class ElasticsearchOperations {
- private RestHighLevelClient client;
- public ElasticsearchOperations(RestHighLevelClient client) {
- this.client = client;
- }
- public void singleIndexDoc(String indexName, String indexId, Map<String, Object> dataMap) {
- // 实现单条写入文档的逻辑,类似于之前示例中的单条写入代码
- try {
- IndexRequest request = new IndexRequest(indexName)
- .id(indexId)
- .source(dataMap, XContentType.JSON);
- IndexResponse response = client.index(request, RequestOptions.DEFAULT);
- if (response.status() == RestStatus.CREATED) {
- System.out.println("文档已创建");
- } else {
- System.err.println("无法创建文档");
- }
- } catch (IOException e) {
- System.err.println("执行单条写入文档时出现IO异常: " + e.getMessage());
- // 在此处处理异常情况
- }
- }
- public void bulkIndexDoc(String indexName, String docIdKey, List<Map<String, Object>> recordMapList) {
- // 实现批量写入文档的逻辑,类似于之前示例中的批量写入代码
- try {
- BulkRequest request = new BulkRequest();
- for (Map<String, Object> recordMap : recordMapList) {
- String docId = recordMap.get(docIdKey).toString();
- request.add(new IndexRequest(indexName)
- .id(docId)
- .source(recordMap, XContentType.JSON));
- }
- BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);
- if (response.status() == RestStatus.OK) {
- System.out.println("批量写入成功");
- } else {
- System.err.println("批量写入失败");
- }
- } catch (IOException e) {
- System.err.println("执行批量写入文档时出现IO异常: " + e.getMessage());
- // 在此处处理异常情况
- }
- }
- public void singleUpdate(String indexName, String docIdKey, Map<String, Object> recordMap) {
- // 实现单条更新文档的逻辑,类似于之前示例中的单条更新代码
- try {
- String docId = recordMap.get(docIdKey).toString();
- UpdateRequest request = new UpdateRequest(indexName, docId)
- .doc(recordMap, XContentType.JSON);
- UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
- if (response.status() == RestStatus.OK) {
- System.out.println("文档已成功更新");
- } else {
- System.err.println("无法更新文档");
- }
- } catch (IOException e) {
- System.err.println("执行单条更新文档时出现IO异常: " + e.getMessage());
- // 在此处处理异常情况
- }
- }
- public void bulkUpdate(String indexName, String docIdKey, List<Map<String, Object>> recordMapList) {
- // 实现批量更新文档的逻辑,类似于之前示例中的批量更新代码
- try {
- BulkRequest request = new BulkRequest();
- for (Map<String, Object> recordMap : recordMapList) {
- String docId = recordMap.get(docIdKey).toString();
- request.add(new UpdateRequest(indexName, docId)
- .doc(recordMap, XContentType.JSON));
- }
- BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);
- if (response.status() == RestStatus.OK) {
- System.out.println("批量更新成功");
- } else {
- System.err.println("批量更新失败");
- }
- } catch (IOException e) {
- System.err.println("执行批量更新文档时出现IO异常: " + e.getMessage());
- // 在此处处理异常情况
- }
- }
- public void singleDelete(String indexName, String docId) {
- // 实现单条删除文档的逻辑,类似于之前示例中的单条删除代码
- try {
- DeleteRequest request = new DeleteRequest(indexName, docId);
- DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
- if (response.status() == RestStatus.OK) {
- System.out.println("文档已成功删除");
- } else {
- System.err.println("无法删除文档");
- }
- } catch (IOException e) {
- System.err.println("执行单条删除文档时出现IO异常: " + e.getMessage());
- // 在此处处理异常情况
- }
- }
- public void bulkDelete(String indexName, List<String> docIdList) {
- // 实现批量删除文档的逻辑,类似于之前示例中的批量删除代码
- try {
- BulkRequest request = new BulkRequest();
- for (String docId : docIdList) {
- request.add(new DeleteRequest(indexName, docId));
- }
- BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);
- if (response.status() == RestStatus.OK) {
- System.out.println("批量删除成功");
- } else {
- System.err.println("批量删除失败");
- }
- } catch (IOException e) {
- System.err.println("执行批量删除文档时出现IO异常: " + e.getMessage());
- // 在此处处理异常情况
- }
- }
- public void deleteByQuery(String indexName, Map<String, Object> query) {
- // 实现根据条件删除文档的逻辑,类似于之前示例中的 Delete By Query 代码
- try {
- // 创建 Delete By Query 请求
- DeleteByQueryRequest request = new DeleteByQueryRequest(indexName);
- // 设置查询条件
- BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
- for (Map.Entry<String, Object> entry : query.entrySet()) {
- boolQuery.must(QueryBuilders.matchQuery(entry.getKey(), entry.getValue()));
- }
- request.setQuery(boolQuery);
- // 执行 Delete By Query 请求
- DeleteByQueryResponse response = client.deleteByQuery(request, RequestOptions.DEFAULT);
- if (response.status() == RestStatus.OK) {
- System.out.println("文档删除成功");
- } else {
- System.err.println("文档删除失败");
- }
- } catch (IOException e) {
- System.err.println("执行根据条件删除文档时出现IO异常: " + e.getMessage());
- // 在此处处理异常情况
- }
- }
- // 可以添加其他操作方法,根据实际需求扩展
- public void closeClient() {
- try {
- client.close();
- } catch (IOException e) {
- System.err.println("关闭 Elasticsearch 客户端时出现异常: " + e.getMessage());
- }
- }
- }
复制代码 十、总结
在本文中,我们探讨了Elasticsearch文档操作的基本和高级功能,包括单条文档的插入、更新和删除,以及批量操作的应用。这些操作不仅使数据管理变得更加高效,还可以或许通过特定条件对文档进行精确控制,从而满足复杂业务需求。
我们通过现实的代码示例展示了如何使用Elasticsearch的REST API进行文档操作,夸大了在进行批量写入时注意的事项,以及在更新和删除过程中如何制止数据丢失和辩论。这些知识对开辟人员在处置惩罚大规模数据时尤其重要,可以资助他们计划更为高效和可靠的系统。
随着数据量的不断增长,把握Elasticsearch文档操作的技巧将使您在搜刮和分析范畴拥有更大的竞争上风。盼望通过本文的介绍,您可以或许更深入地理解Elasticsearch的文档管理机制,为未来的项目奠定坚实的底子。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |