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