索引单个文档
编辑索引单个文档
编辑Java API 客户端提供了多种索引数据的方式:您可以提供应用程序对象,这些对象将自动映射到 JSON,或者您可以提供原始 JSON 数据。使用应用程序对象更适合具有明确定义的领域模型的应用程序,而原始 JSON 更适合具有半结构化数据的日志记录用例。
在下面的示例中,我们使用了一个 Product
领域对象,它具有 sku
、name
和 price
属性。
有关索引请求的完整说明,请参阅 Elasticsearch API 文档。
使用流畅 DSL
编辑构建请求最直接的方法是使用流畅 DSL。在下面的示例中,我们使用产品的 SKU 作为索引中的文档标识符,在 products
索引中索引产品描述。 product
对象将使用 Elasticsearch 客户端上配置的对象映射器映射到 JSON。
Product product = new Product("bk-1", "City bike", 123.0); IndexResponse response = esClient.index(i -> i .index("products") .id(product.getSku()) .document(product) ); logger.info("Indexed with version " + response.version());
您还可以将使用 DSL 创建的对象分配给变量。Java API 客户端类具有一个静态 of()
方法,用于创建具有 DSL 语法的对象。
Product product = new Product("bk-1", "City bike", 123.0); IndexRequest<Product> request = IndexRequest.of(i -> i .index("products") .id(product.getSku()) .document(product) ); IndexResponse response = esClient.index(request); logger.info("Indexed with version " + response.version());
使用经典构建器
编辑如果您更习惯于经典的构建器模式,它也可用。流畅 DSL 语法在幕后使用构建器对象。
Product product = new Product("bk-1", "City bike", 123.0); IndexRequest.Builder<Product> indexReqBuilder = new IndexRequest.Builder<>(); indexReqBuilder.index("product"); indexReqBuilder.id(product.getSku()); indexReqBuilder.document(product); IndexResponse response = esClient.index(indexReqBuilder.build()); logger.info("Indexed with version " + response.version());
使用异步客户端
编辑以上示例使用了同步 Elasticsearch 客户端。所有 Elasticsearch API 也都可以在异步客户端中使用,使用相同的请求和响应类型。有关更多详细信息,另请参阅 阻塞和异步客户端。
ElasticsearchAsyncClient esAsyncClient = new ElasticsearchAsyncClient(transport); Product product = new Product("bk-1", "City bike", 123.0); esAsyncClient.index(i -> i .index("products") .id(product.getSku()) .document(product) ).whenComplete((response, exception) -> { if (exception != null) { logger.error("Failed to index", exception); } else { logger.info("Indexed with version " + response.version()); } });
使用原始 JSON 数据
编辑当您要索引的数据来自外部来源时,使用半结构化数据创建领域对象可能会很麻烦,或者根本不可能。
您可以使用 withJson()
索引来自任意来源的数据。使用此方法将读取源并将其用于索引请求的 document
属性。有关更多详细信息,请参阅 从 JSON 数据创建 API 对象。
Reader input = new StringReader( "{'@timestamp': '2022-04-08T13:55:32Z', 'level': 'warn', 'message': 'Some log message'}" .replace('\'', '"')); IndexRequest<JsonData> request = IndexRequest.of(i -> i .index("logs") .withJson(input) ); IndexResponse response = esClient.index(request); logger.info("Indexed with version " + response.version());
以上示例的源代码可以在 Java API 客户端测试 中找到。