索引单个文档
编辑索引单个文档
编辑Java API 客户端提供了几种索引数据的方法:您可以提供应用程序对象,这些对象将自动映射到 JSON,也可以提供原始 JSON 数据。使用应用程序对象更适合具有明确定义的域模型的应用程序,而原始 JSON 更适合具有半结构化数据的日志用例。
在下面的示例中,我们使用一个具有 sku
、name
和 price
属性的 Product
域对象。
有关索引请求的完整说明,请参阅 Elasticsearch API 文档。
使用流畅的 DSL
编辑构建请求最直接的方法是使用流畅的 DSL。在下面的示例中,我们在 products
索引中索引一个产品描述,使用产品的 SKU 作为索引中的文档标识符。 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 客户端测试 中找到。