Elasticsearch底子文档操作完全演示指南

打印 上一主题 下一主题

主题 851|帖子 851|积分 2553

目录
一、单条写入文档
二、批量写入文档
三、更新单条文档
update 操作
upsert 操作
四、更新批量文档
五、根据条件更新文档
六、删除单条文档
七、批量删除文档
八、根据条件删除文档
九、示例 Elasticsearch 操作工具类
十、总结

干货分享,感谢您的阅读!在 Elasticsearch 中实行文档写入和更新操作的基本内容总结。
随着大数据期间的到来,企业和开辟者面对着如何高效存储、检索和分析海量数据的挑战。Elasticsearch作为一个基于Lucene构建的分布式搜刮引擎,因其强大的搜刮能力和及时数据处置惩罚能力,成为了许多企业在构建搜刮应用和分析平台时的首选工具。本文将深入探讨Elasticsearch中关于文档的基本操作,包括单条和批量写入、更新和删除文档,以及根据特定条件进行更新和删除的高级操作。通过实例和代码演示,读者将可以或许快速把握如何在Elasticsearch中有效地管理文档,为构建高效的搜刮和分析系统打下坚实的底子。
一、单条写入文档

在 Elasticsearch 中,要进行单条写入文档操作,可以使用 index 操作。要单条写入文档,可以使用以下DSL语句:
  1. POST /your_index/_doc/1
  2. {
  3.   "field1": "value1",
  4.   "field2": "value2",
  5.   "field3": 123,
  6.   "field4": true
  7. }
复制代码


  • POST 请求用于创建文档。
  • /your_index 是您的索引名称。
  • /_doc/1 中的 1 是文档的唯一标识符,您可以选择性地提供,如果未提供,Elasticsearch 会为您天生一个唯一标识符。
  • JSON数据包含文档的字段和值。
分析阐明


  • POST 请求用于创建文档。如果指定的标识符(在上述示例中为 1)已经存在于索引中,它将更新现有文档。否则,它将创建一个新的文档。
  • 文档的字段和值在JSON数据中指定,您可以根据您的业务需求提供不同的字段和数据类型。
业务举例
假设您正在构建一个电子商务平台,并盼望将一件商品的信息写入 Elasticsearch 中,以便进行搜刮和分析。以下是一个示例,包括DSL和Java演示:
DSL语句示例
  1. POST /products/_doc/12345
  2. {
  3.   "product_name": "Laptop",
  4.   "description": "High-performance laptop with SSD storage.",
  5.   "price": 999.99,
  6.   "in_stock": true
  7. }
复制代码
Java演示
  1. import org.elasticsearch.action.index.IndexRequest;
  2. import org.elasticsearch.action.index.IndexResponse;
  3. import org.elasticsearch.client.RequestOptions;
  4. import org.elasticsearch.client.RestHighLevelClient;
  5. import org.elasticsearch.common.xcontent.XContentType;
  6. import org.elasticsearch.rest.RestStatus;
  7. public class SingleDocumentIndexingExample {
  8.     public static void main(String[] args) throws IOException {
  9.         RestHighLevelClient client = createElasticsearchClient();
  10.         // 构建索引请求
  11.         IndexRequest request = new IndexRequest("products");
  12.         request.id("12345"); // 文档标识符
  13.         String jsonString = "{" +
  14.                 ""product_name":"Laptop"," +
  15.                 ""description":"High-performance laptop with SSD storage."," +
  16.                 ""price":999.99," +
  17.                 ""in_stock":true" +
  18.                 "}";
  19.         request.source(jsonString, XContentType.JSON);
  20.         // 执行索引请求
  21.         IndexResponse response = client.index(request, RequestOptions.DEFAULT);
  22.         // 分析响应
  23.         if (response.status() == RestStatus.CREATED) {
  24.             System.out.println("文档已创建");
  25.         } else if (response.status() == RestStatus.OK) {
  26.             System.out.println("文档已更新");
  27.         } else {
  28.             System.err.println("无法创建/更新文档");
  29.         }
  30.         // 关闭客户端
  31.         client.close();
  32.     }
  33. }
复制代码
二、批量写入文档

在 Elasticsearch 中,批量写入文档通常使用批量索引(Bulk Indexing)API 来实现。答应一次性将多个文档索引到索引中,进步了性能和服从。要批量写入文档,可以使用 Bulk API 发送一批索引请求。
  1. POST /your_index/_bulk
  2. {"index":{"_id":"1"}}
  3. {"field1":"value1","field2":"value2"}
  4. {"index":{"_id":"2"}}
  5. {"field1":"value3","field2":"value4"}
  6. {"update":{"_id":"3"}}
  7. {"doc":{"field1":"new_value"}}
  8. {"delete":{"_id":"4"}}
复制代码


  • POST 请求用于批量操作。
  • /your_index 是您的索引名称。
  • 使用 {"index": {"_id": "1"}} 定义文档的元数据,包括文档标识符。
  • 每个文档的数据在之后的行中提供,以JSON格式表现。
分析阐明


  • Bulk API 答应一次性处置惩罚多个索引请求,包括索引、更新和删除操作。
  • 使用元数据(例如 {"index": {"_id": "1"}})可以指定每个文档的唯一标识符。
  • 除了索引操作,Bulk API 还支持更新和删除操作。
业务举例
假设您正在构建一个电子商务平台,必要批量索引多个产物的信息。以下是一个示例,包括DSL和Java演示:
DSL语句示例
  1. POST /products/_bulk
  2. {"index":{"_id":"1"}}
  3. {"product_name":"Laptop1","description":"High-performance laptop with SSD storage.","price":999.99,"in_stock":true}
  4. {"index":{"_id":"2"}}
  5. {"product_name":"Laptop2","description":"Affordable laptop for everyday use.","price":599.99,"in_stock":true}
  6. {"index":{"_id":"3"}}
  7. {"product_name":"Smartphone1","description":"Flagship smartphone with advanced features.","price":799.99,"in_stock":false}
复制代码
Java演示
  1. import org.elasticsearch.action.bulk.BulkRequest;
  2. import org.elasticsearch.action.bulk.BulkResponse;
  3. import org.elasticsearch.client.RequestOptions;
  4. import org.elasticsearch.client.RestHighLevelClient;
  5. import org.elasticsearch.common.unit.TimeValue;
  6. import java.io.IOException;
  7. import java.util.concurrent.TimeUnit;
  8. public class BulkIndexingExample {
  9.     public static void main(String[] args) throws IOException {
  10.         RestHighLevelClient client = createElasticsearchClient();
  11.         // 创建批量请求对象
  12.         BulkRequest request = new BulkRequest();
  13.         // 添加索引请求
  14.         request.add(new IndexRequest("products").id("1").source(/* JSON 数据 */));
  15.         request.add(new IndexRequest("products").id("2").source(/* JSON 数据 */));
  16.         request.add(new IndexRequest("products").id("3").source(/* JSON 数据 */));
  17.         // 设置超时时间
  18.         request.timeout(TimeValue.timeValueMinutes(2));
  19.         request.timeout("2m");
  20.         // 执行批量请求
  21.         BulkResponse bulkResponse = client.bulk(request, RequestOptions.DEFAULT);
  22.         // 分析响应
  23.         if (bulkResponse.hasFailures()) {
  24.             System.err.println("批量请求中存在失败的操作");
  25.         } else {
  26.             System.out.println("批量请求成功完成");
  27.         }
  28.         // 关闭客户端
  29.         client.close();
  30.     }
  31. }
复制代码
三、更新单条文档

update 操作

在 Elasticsearch 中,更新单条文档通常使用 update 操作。要更新单条文档,您可以使用 update 操作,示例如下:
  1. POST /your_index/_update/1
  2. {
  3.   "doc": {
  4.     "field1": "new_value1",
  5.     "field2": "new_value2"
  6.   }
  7. }
复制代码


  • POST 请求用于实行更新操作。
  • /your_index 是您的索引名称。
  • /_update/1 中的 1 是要更新的文档的唯一标识符。
  • 在 doc 字段中指定要更新的字段和新值。
分析阐明


  • update 操作答应您仅更新文档的特定字段,而不必重写整个文档。这是一种高效的方式来更新文档。
  • 更新操作是部门更新,只会修改指定字段的值,而不会影响其他字段。
业务举例
假设您正在构建一个博客平台,并盼望更新特定博客文章的内容。以下是一个示例,包括DSL和Java演示:
DSL语句示例
  1. POST /blog_posts/_update/123
  2. {
  3.   "doc": {
  4.     "title": "Updated Title",
  5.     "content": "This is the updated content of the blog post."
  6.   }
  7. }
复制代码
Java演示
  1. import org.elasticsearch.action.update.UpdateRequest;
  2. import org.elasticsearch.action.update.UpdateResponse;
  3. import org.elasticsearch.client.RequestOptions;
  4. import org.elasticsearch.client.RestHighLevelClient;
  5. import org.elasticsearch.common.xcontent.XContentType;
  6. import org.elasticsearch.rest.RestStatus;
  7. import java.io.IOException;
  8. import java.util.Map;
  9. public class UpdateSingleDocumentExample {
  10.     public static void main(String[] args) throws IOException {
  11.         RestHighLevelClient client = createElasticsearchClient();
  12.         // 创建更新请求
  13.         UpdateRequest request = new UpdateRequest("blog_posts", "123");
  14.         String jsonString = "{" +
  15.                 ""doc": {" +
  16.                 ""title": "Updated Title"," +
  17.                 ""content": "This is the updated content of the blog post."" +
  18.                 "}" +
  19.                 "}";
  20.         request.doc(jsonString, XContentType.JSON);
  21.         // 执行更新请求
  22.         UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
  23.         // 分析响应
  24.         if (response.status() == RestStatus.OK) {
  25.             System.out.println("文档已成功更新");
  26.         } else {
  27.             System.err.println("无法更新文档");
  28.         }
  29.         // 关闭客户端
  30.         client.close();
  31.     }
  32. }
复制代码
upsert 操作

upsert 是 Elasticsearch 更新操作中的一个重要概念,它答应在更新文档时,如果文档不存在,则将其插入(新增)。这在盼望更新文档的同时,如果文档尚不存在,就创建一个新文档的情况下非常有用。要实行 upsert 操作,可以在 update 操作中使用 doc_as_upsert 参数,示例如下:
  1. POST /your_index/_update/1
  2. {
  3.   "doc": {
  4.     "field1": "new_value1",
  5.     "field2": "new_value2"
  6.   },
  7.   "doc_as_upsert": true
  8. }
复制代码


  • doc 中指定要更新的字段和新值。
  • doc_as_upsert 设置为 true,表现如果文档不存在,则将 doc 中的内容插入(新增)为新文档。
分析阐明


  • 当文档存在时,upsert 操作与普通更新操作相同,更新指定的字段。
  • 当文档不存在时,upsert 操作会将 doc 中的内容插入为新文档。
业务举例
假设您正在构建一个在线市肆,想要更新产物的信息,同时如果产物不存在,则添加新产物。以下是一个示例,包括DSL和Java演示:
DSL语句示例
  1. POST /products/_update/123
  2. {
  3.   "doc": {
  4.     "product_name": "Updated Product",
  5.     "price": 29.99
  6.   },
  7.   "doc_as_upsert": true
  8. }
复制代码
Java演示
  1. import org.elasticsearch.action.update.UpdateRequest;
  2. import org.elasticsearch.action.update.UpdateResponse;
  3. import org.elasticsearch.client.RequestOptions;
  4. import org.elasticsearch.client.RestHighLevelClient;
  5. import org.elasticsearch.common.xcontent.XContentType;
  6. import org.elasticsearch.rest.RestStatus;
  7. import java.io.IOException;
  8. public class UpsertExample {
  9.     public static void main(String[] args) throws IOException {
  10.         RestHighLevelClient client = createElasticsearchClient();
  11.         // 创建更新请求,指定索引名称和文档标识符
  12.         UpdateRequest request = new UpdateRequest("products", "123");
  13.         // 设置要更新的字段和新值
  14.         String jsonString = "{" +
  15.                 ""product_name": "Updated Product"," +
  16.                 ""price": 29.99" +
  17.                 "}";
  18.         request.doc(jsonString, XContentType.JSON);
  19.         // 设置doc_as_upsert为true,以支持upsert
  20.         request.docAsUpsert(true);
  21.         // 执行更新请求
  22.         UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
  23.         // 分析响应
  24.         if (response.status() == RestStatus.CREATED) {
  25.             System.out.println("文档已创建(upsert)");
  26.         } else if (response.status() == RestStatus.OK) {
  27.             System.out.println("文档已成功更新");
  28.         } else {
  29.             System.err.println("无法更新文档");
  30.         }
  31.         // 关闭客户端
  32.         client.close();
  33.     }
  34. }
复制代码
四、更新批量文档

如果只有文档的ID列表而没有其他条件来更新文档,可以使用 Elasticsearch 的 Bulk API 来批量更新这些文档。Bulk API 不必要DSL语句,而是必要一个包含每个文档更新操作的请求列表。每个更新操作通常包括三个部门:操作类型(update)、索引名称、文档ID和更新数据。
  1. POST /_bulk
  2. {"update":{"_index":"your_index","_id":"doc1"}}
  3. {"doc":{"field1":"new_value1"}}
  4. {"update":{"_index":"your_index","_id":"doc2"}}
  5. {"doc":{"field2":"new_value2"}}
复制代码


  • POST 请求用于实行批量更新操作。
  • _bulk 是Bulk API的端点。
  • 对于每个文档,首先定义了一个update操作,然后指定了索引名称(_index)和文档ID(_id),最后提供了要更新的数据。
分析阐明


  • 使用Bulk API,可以在一个请求中批量实行多个文档更新操作。
  • 更新操作包括了要更新的文档的索引名称、文档ID以及要更新的数据。
Java演示
  1. import org.elasticsearch.action.bulk.BulkRequest;
  2. import org.elasticsearch.action.bulk.BulkResponse;
  3. import org.elasticsearch.client.RequestOptions;
  4. import org.elasticsearch.client.RestHighLevelClient;
  5. import org.elasticsearch.common.xcontent.XContentType;
  6. import org.elasticsearch.rest.RestStatus;
  7. import java.io.IOException;
  8. import java.util.List;
  9. public class ElasticsearchBulkUpdater {
  10.     private RestHighLevelClient client;
  11.     public ElasticsearchBulkUpdater(RestHighLevelClient client) {
  12.         this.client = client;
  13.     }
  14.     public void bulkUpdateByIdList(String indexName, List<String> docIdList, List<Map<String, Object>> updatedDataList) {
  15.         try {
  16.             BulkRequest request = new BulkRequest();
  17.             for (int i = 0; i < docIdList.size(); i++) {
  18.                 String docId = docIdList.get(i);
  19.                 String jsonString = "{" +
  20.                         ""doc":" + getJsonString(updatedDataList.get(i)) +
  21.                         "}";
  22.                 request.add(client.updateRequest(indexName, docId)
  23.                         .doc(jsonString, XContentType.JSON)
  24.                         .docAsUpsert(true));
  25.             }
  26.             BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);
  27.             if (response.status() == RestStatus.OK) {
  28.                 System.out.println("批量更新成功");
  29.             } else {
  30.                 System.err.println("批量更新失败");
  31.             }
  32.         } catch (IOException e) {
  33.             System.err.println("执行批量更新时出现IO异常: " + e.getMessage());
  34.             // 在此处处理异常情况
  35.         }
  36.     }
  37.     private String getJsonString(Map<String, Object> updatedData) {
  38.         // 创建更新文档的JSON字符串
  39.         // 省略实现细节
  40.         return jsonString;
  41.     }
  42.     // 其他方法和资源清理
  43. }
复制代码
五、根据条件更新文档

要根据条件更新文档,可以使用 Elasticsearch 的 Update By Query API。使用 Update By Query API 来根据条件更新文档。示例如下:
  1. POST /your_index/_update_by_query
  2. {
  3.   "script": {
  4.     "source": "ctx._source.field1 = 'new_value1'; ctx._source.field2 = 'new_value2';"
  5.   },
  6.   "query": {
  7.     "bool": {
  8.       "must": [
  9.         {
  10.           "term": {
  11.             "field3": "value_to_match"
  12.           }
  13.         },
  14.         {
  15.           "range": {
  16.             "field4": {
  17.               "gte": 10,
  18.               "lt": 20
  19.             }
  20.           }
  21.         }
  22.       ]
  23.     }
  24.   }
  25. }
复制代码


  • 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语句示例
  1. POST /products/_update_by_query
  2. {
  3.   "script": {
  4.     "source": "ctx._source.price = ctx._source.price * 1.1;"
  5.   },
  6.   "query": {
  7.     "bool": {
  8.       "must": [
  9.         {
  10.           "term": {
  11.             "category": "electronics"
  12.           }
  13.         },
  14.         {
  15.           "range": {
  16.             "price": {
  17.               "lt": 100
  18.             }
  19.           }
  20.         }
  21.       ]
  22.     }
  23.   }
  24. }
复制代码
Java演示
  1. import org.elasticsearch.action.updatebyquery.UpdateByQueryRequest;
  2. import org.elasticsearch.action.updatebyquery.UpdateByQueryResponse;
  3. import org.elasticsearch.client.RequestOptions;
  4. import org.elasticsearch.client.RestHighLevelClient;
  5. import org.elasticsearch.rest.RestStatus;
  6. import java.io.IOException;
  7. public class UpdateByQueryExample {
  8.     public static void main(String[] args) throws IOException {
  9.         RestHighLevelClient client = createElasticsearchClient();
  10.         // 创建 Update By Query 请求
  11.         UpdateByQueryRequest request = new UpdateByQueryRequest("products");
  12.         // 在脚本中指定更新逻辑
  13.         request.setScript("ctx._source.price = ctx._source.price * 1.1");
  14.         // 设置查询条件,只更新电子产品且价格低于100的产品
  15.         BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
  16.                 .must(QueryBuilders.termQuery("category", "electronics"))
  17.                 .must(QueryBuilders.rangeQuery("price").lt(100));
  18.         request.setQuery(boolQuery);
  19.         // 执行 Update By Query 请求
  20.         UpdateByQueryResponse response = client.updateByQuery(request, RequestOptions.DEFAULT);
  21.         // 分析响应
  22.         if (response.status() == RestStatus.OK) {
  23.             System.out.println("文档更新成功");
  24.         } else {
  25.             System.err.println("文档更新失败");
  26.         }
  27.         // 关闭客户端
  28.         client.close();
  29.     }
  30. }
复制代码
六、删除单条文档

要删除单条文档,可以使用 Elasticsearch 的 Delete API。使用 Delete API 来删除单条文档。示例如下:
  1. DELETE /your_index/_doc/your_document_id
复制代码


  • DELETE 请求用于实行删除操作。
  • /your_index 是您的索引名称。
  • /_doc 表现文档类型,根据Elasticsearch的最新版本,文档类型通常为_doc。
  • your_document_id 是要删除的文档的唯一标识符。
分析阐明


  • 使用 Delete API,您可以根据文档的唯一标识符删除单条文档。
  • 您必要指定索引名称和文档的唯一标识符来实行删除操作。
业务举例
假设正在管理一个博客平台的文章索引,以下是一个示例,包括DSL和Java演示,用于删除单篇文章:
DSL语句示例
  1. DELETE /blog_posts/_doc/12345
复制代码
Java演示
  1. import org.elasticsearch.action.delete.DeleteRequest;
  2. import org.elasticsearch.action.delete.DeleteResponse;
  3. import org.elasticsearch.client.RequestOptions;
  4. import org.elasticsearch.client.RestHighLevelClient;
  5. import org.elasticsearch.rest.RestStatus;
  6. import java.io.IOException;
  7. public class DeleteSingleDocumentExample {
  8.     public static void main(String[] args) throws IOException {
  9.         RestHighLevelClient client = createElasticsearchClient();
  10.         // 创建删除请求
  11.         DeleteRequest request = new DeleteRequest("blog_posts", "12345"); // 指定索引名称和文档ID
  12.         // 执行删除请求
  13.         DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
  14.         // 分析响应
  15.         if (response.status() == RestStatus.OK) {
  16.             System.out.println("文档已成功删除");
  17.         } else if (response.status() == RestStatus.NOT_FOUND) {
  18.             System.err.println("文档未找到,无法删除");
  19.         } else {
  20.             System.err.println("无法删除文档");
  21.         }
  22.         // 关闭客户端
  23.         client.close();
  24.     }
  25. }
复制代码
七、批量删除文档

要批量删除文档,可以使用 Elasticsearch 的 Bulk API。使用 Bulk API 来批量删除文档。示例如下:
  1. POST /your_index/_bulk
  2. {"delete":{"_index":"your_index","_id":"doc1"}}
  3. {"delete":{"_index":"your_index","_id":"doc2"}}
复制代码


  • POST 请求用于实行批量操作。
  • /your_index 是您的索引名称。
  • _bulk 是Bulk API的端点。
  • 对于每个文档,首先定义了一个delete操作,然后指定了索引名称(_index)和文档ID(_id)。
分析阐明


  • 使用 Bulk API,可以在一个请求中批量实行多个文档的删除操作。
  • 每个删除操作包括要删除的文档的索引名称和文档ID。
业务举例
假设正在管理一个电子商务网站的订单汗青记载,并必要批量删除特定日期之前的订单记载。以下是一个示例,包括DSL和Java演示:
DSL语句示例
  1. POST /order_history/_bulk
  2. {"delete":{"_index":"order_history","_id":"order1"}}
  3. {"delete":{"_index":"order_history","_id":"order2"}}
复制代码
Java演示
  1. import org.elasticsearch.action.bulk.BulkRequest;
  2. import org.elasticsearch.action.bulk.BulkResponse;
  3. import org.elasticsearch.client.RequestOptions;
  4. import org.elasticsearch.client.RestHighLevelClient;
  5. import org.elasticsearch.rest.RestStatus;
  6. import java.io.IOException;
  7. import java.util.List;
  8. public class ElasticsearchBulkDeleter {
  9.     private RestHighLevelClient client;
  10.     public ElasticsearchBulkDeleter(RestHighLevelClient client) {
  11.         this.client = client;
  12.     }
  13.     public void bulkDeleteByIdList(String indexName, List<String> docIdList) {
  14.         try {
  15.             BulkRequest request = new BulkRequest();
  16.             for (String docId : docIdList) {
  17.                 request.add(client.deleteRequest(indexName, docId));
  18.             }
  19.             BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);
  20.             if (response.status() == RestStatus.OK) {
  21.                 System.out.println("批量删除成功");
  22.             } else {
  23.                 System.err.println("批量删除失败");
  24.             }
  25.         } catch (IOException e) {
  26.             System.err.println("执行批量删除时出现IO异常: " + e.getMessage());
  27.             // 在此处处理异常情况
  28.         }
  29.     }
  30.     // 其他方法和资源清理
  31. }
复制代码
八、根据条件删除文档

要根据条件删除文档,可以使用 Elasticsearch 的 Delete By Query API。使用 Delete By Query API 来根据条件删除文档。示例如下:
  1. POST /your_index/_delete_by_query
  2. {
  3.   "query": {
  4.     "bool": {
  5.       "must": [
  6.         {
  7.           "term": {
  8.             "field1": "value_to_match"
  9.           }
  10.         },
  11.         {
  12.           "range": {
  13.             "field2": {
  14.               "lte": 10
  15.             }
  16.           }
  17.         }
  18.       ]
  19.     }
  20.   }
  21. }
复制代码


  • POST 请求用于实行删除操作。
  • /your_index 是您的索引名称。
  • /_delete_by_query 表现根据查询条件删除文档。
  • 在 query 中定义筛选条件,以确定要删除哪些文档。在此示例中,我们使用了布尔查询(bool),并设置了两个条件:一个是 field1 必须匹配特定值,另一个是 field2 的值必须小于或等于10。
分析阐明


  • 使用 Delete By Query API,可以根据自定义查询条件删除文档。
  • 在 query 部门,您可以定义要删除的文档的筛选条件。
业务举例
假设正在管理一个文档存储系统,必要根据条件删除文档。以下是一个示例,包括DSL和Java演示:
DSL语句示例
  1. POST /documents/_delete_by_query
  2. {
  3.   "query": {
  4.     "bool": {
  5.       "must": [
  6.         {
  7.           "term": {
  8.             "category": "archived"
  9.           }
  10.         },
  11.         {
  12.           "range": {
  13.             "last_modified_date": {
  14.               "lte": "2022-01-01"
  15.             }
  16.           }
  17.         }
  18.       ]
  19.     }
  20.   }
  21. }
复制代码
Java演示
  1. import org.elasticsearch.action.deletebyquery.DeleteByQueryRequest;
  2. import org.elasticsearch.action.deletebyquery.DeleteByQueryResponse;
  3. import org.elasticsearch.client.RequestOptions;
  4. import org.elasticsearch.client.RestHighLevelClient;
  5. import org.elasticsearch.rest.RestStatus;
  6. import java.io.IOException;
  7. public class DeleteByQueryExample {
  8.     public static void main(String[] args) throws IOException {
  9.         RestHighLevelClient client = createElasticsearchClient();
  10.         // 创建 Delete By Query 请求
  11.         DeleteByQueryRequest request = new DeleteByQueryRequest("documents");
  12.         // 设置查询条件,只删除属于 "archived" 类别且最后修改日期早于等于 "2022-01-01" 的文档
  13.         BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
  14.                 .must(QueryBuilders.termQuery("category", "archived"))
  15.                 .must(QueryBuilders.rangeQuery("last_modified_date").lte("2022-01-01"));
  16.         request.setQuery(boolQuery);
  17.         // 执行 Delete By Query 请求
  18.         DeleteByQueryResponse response = client.deleteByQuery(request, RequestOptions.DEFAULT);
  19.         // 分析响应
  20.         if (response.status() == RestStatus.OK) {
  21.             System.out.println("文档删除成功");
  22.         } else {
  23.             System.err.println("文档删除失败");
  24.         }
  25.         // 关闭客户端
  26.         client.close();
  27.     }
  28. }
复制代码
九、示例 Elasticsearch 操作工具类

  1. package org.zyf.javabasic.es;
  2. import org.elasticsearch.action.bulk.BulkRequest;
  3. import org.elasticsearch.action.bulk.BulkResponse;
  4. import org.elasticsearch.action.delete.DeleteRequest;
  5. import org.elasticsearch.action.delete.DeleteResponse;
  6. import org.elasticsearch.action.update.UpdateRequest;
  7. import org.elasticsearch.action.update.UpdateResponse;
  8. import org.elasticsearch.client.RequestOptions;
  9. import org.elasticsearch.client.RestHighLevelClient;
  10. import org.elasticsearch.common.xcontent.XContentType;
  11. import org.elasticsearch.index.query.QueryBuilders;
  12. import org.elasticsearch.rest.RestStatus;
  13. import java.io.IOException;
  14. import java.util.List;
  15. import java.util.Map;
  16. /**
  17. * @program: zyfboot-javabasic
  18. * @description: Elasticsearch 操作工具类的简化示例
  19. * @author: zhangyanfeng
  20. * @create: 2023-10-06 22:29
  21. **/
  22. public class ElasticsearchOperations {
  23.     private RestHighLevelClient client;
  24.     public ElasticsearchOperations(RestHighLevelClient client) {
  25.         this.client = client;
  26.     }
  27.     public void singleIndexDoc(String indexName, String indexId, Map<String, Object> dataMap) {
  28.         // 实现单条写入文档的逻辑,类似于之前示例中的单条写入代码
  29.         try {
  30.             IndexRequest request = new IndexRequest(indexName)
  31.                     .id(indexId)
  32.                     .source(dataMap, XContentType.JSON);
  33.             IndexResponse response = client.index(request, RequestOptions.DEFAULT);
  34.             if (response.status() == RestStatus.CREATED) {
  35.                 System.out.println("文档已创建");
  36.             } else {
  37.                 System.err.println("无法创建文档");
  38.             }
  39.         } catch (IOException e) {
  40.             System.err.println("执行单条写入文档时出现IO异常: " + e.getMessage());
  41.             // 在此处处理异常情况
  42.         }
  43.     }
  44.     public void bulkIndexDoc(String indexName, String docIdKey, List<Map<String, Object>> recordMapList) {
  45.         // 实现批量写入文档的逻辑,类似于之前示例中的批量写入代码
  46.         try {
  47.             BulkRequest request = new BulkRequest();
  48.             for (Map<String, Object> recordMap : recordMapList) {
  49.                 String docId = recordMap.get(docIdKey).toString();
  50.                 request.add(new IndexRequest(indexName)
  51.                         .id(docId)
  52.                         .source(recordMap, XContentType.JSON));
  53.             }
  54.             BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);
  55.             if (response.status() == RestStatus.OK) {
  56.                 System.out.println("批量写入成功");
  57.             } else {
  58.                 System.err.println("批量写入失败");
  59.             }
  60.         } catch (IOException e) {
  61.             System.err.println("执行批量写入文档时出现IO异常: " + e.getMessage());
  62.             // 在此处处理异常情况
  63.         }
  64.     }
  65.     public void singleUpdate(String indexName, String docIdKey, Map<String, Object> recordMap) {
  66.         // 实现单条更新文档的逻辑,类似于之前示例中的单条更新代码
  67.         try {
  68.             String docId = recordMap.get(docIdKey).toString();
  69.             UpdateRequest request = new UpdateRequest(indexName, docId)
  70.                     .doc(recordMap, XContentType.JSON);
  71.             UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
  72.             if (response.status() == RestStatus.OK) {
  73.                 System.out.println("文档已成功更新");
  74.             } else {
  75.                 System.err.println("无法更新文档");
  76.             }
  77.         } catch (IOException e) {
  78.             System.err.println("执行单条更新文档时出现IO异常: " + e.getMessage());
  79.             // 在此处处理异常情况
  80.         }
  81.     }
  82.     public void bulkUpdate(String indexName, String docIdKey, List<Map<String, Object>> recordMapList) {
  83.         // 实现批量更新文档的逻辑,类似于之前示例中的批量更新代码
  84.         try {
  85.             BulkRequest request = new BulkRequest();
  86.             for (Map<String, Object> recordMap : recordMapList) {
  87.                 String docId = recordMap.get(docIdKey).toString();
  88.                 request.add(new UpdateRequest(indexName, docId)
  89.                         .doc(recordMap, XContentType.JSON));
  90.             }
  91.             BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);
  92.             if (response.status() == RestStatus.OK) {
  93.                 System.out.println("批量更新成功");
  94.             } else {
  95.                 System.err.println("批量更新失败");
  96.             }
  97.         } catch (IOException e) {
  98.             System.err.println("执行批量更新文档时出现IO异常: " + e.getMessage());
  99.             // 在此处处理异常情况
  100.         }
  101.     }
  102.     public void singleDelete(String indexName, String docId) {
  103.         // 实现单条删除文档的逻辑,类似于之前示例中的单条删除代码
  104.         try {
  105.             DeleteRequest request = new DeleteRequest(indexName, docId);
  106.             DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
  107.             if (response.status() == RestStatus.OK) {
  108.                 System.out.println("文档已成功删除");
  109.             } else {
  110.                 System.err.println("无法删除文档");
  111.             }
  112.         } catch (IOException e) {
  113.             System.err.println("执行单条删除文档时出现IO异常: " + e.getMessage());
  114.             // 在此处处理异常情况
  115.         }
  116.     }
  117.     public void bulkDelete(String indexName, List<String> docIdList) {
  118.         // 实现批量删除文档的逻辑,类似于之前示例中的批量删除代码
  119.         try {
  120.             BulkRequest request = new BulkRequest();
  121.             for (String docId : docIdList) {
  122.                 request.add(new DeleteRequest(indexName, docId));
  123.             }
  124.             BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);
  125.             if (response.status() == RestStatus.OK) {
  126.                 System.out.println("批量删除成功");
  127.             } else {
  128.                 System.err.println("批量删除失败");
  129.             }
  130.         } catch (IOException e) {
  131.             System.err.println("执行批量删除文档时出现IO异常: " + e.getMessage());
  132.             // 在此处处理异常情况
  133.         }
  134.     }
  135.     public void deleteByQuery(String indexName, Map<String, Object> query) {
  136.         // 实现根据条件删除文档的逻辑,类似于之前示例中的 Delete By Query 代码
  137.         try {
  138.             // 创建 Delete By Query 请求
  139.             DeleteByQueryRequest request = new DeleteByQueryRequest(indexName);
  140.             // 设置查询条件
  141.             BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
  142.             for (Map.Entry<String, Object> entry : query.entrySet()) {
  143.                 boolQuery.must(QueryBuilders.matchQuery(entry.getKey(), entry.getValue()));
  144.             }
  145.             request.setQuery(boolQuery);
  146.             // 执行 Delete By Query 请求
  147.             DeleteByQueryResponse response = client.deleteByQuery(request, RequestOptions.DEFAULT);
  148.             if (response.status() == RestStatus.OK) {
  149.                 System.out.println("文档删除成功");
  150.             } else {
  151.                 System.err.println("文档删除失败");
  152.             }
  153.         } catch (IOException e) {
  154.             System.err.println("执行根据条件删除文档时出现IO异常: " + e.getMessage());
  155.             // 在此处处理异常情况
  156.         }
  157.     }
  158.     // 可以添加其他操作方法,根据实际需求扩展
  159.     public void closeClient() {
  160.         try {
  161.             client.close();
  162.         } catch (IOException e) {
  163.             System.err.println("关闭 Elasticsearch 客户端时出现异常: " + e.getMessage());
  164.         }
  165.     }
  166. }
复制代码
十、总结

在本文中,我们探讨了Elasticsearch文档操作的基本和高级功能,包括单条文档的插入、更新和删除,以及批量操作的应用。这些操作不仅使数据管理变得更加高效,还可以或许通过特定条件对文档进行精确控制,从而满足复杂业务需求。
我们通过现实的代码示例展示了如何使用Elasticsearch的REST API进行文档操作,夸大了在进行批量写入时注意的事项,以及在更新和删除过程中如何制止数据丢失和辩论。这些知识对开辟人员在处置惩罚大规模数据时尤其重要,可以资助他们计划更为高效和可靠的系统。
随着数据量的不断增长,把握Elasticsearch文档操作的技巧将使您在搜刮和分析范畴拥有更大的竞争上风。盼望通过本文的介绍,您可以或许更深入地理解Elasticsearch的文档管理机制,为未来的项目奠定坚实的底子。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊落一身雪

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表