索引单个文档

编辑

Java API 客户端提供了几种索引数据的方法:您可以提供应用程序对象,这些对象将自动映射到 JSON,也可以提供原始 JSON 数据。使用应用程序对象更适合具有明确定义的域模型的应用程序,而原始 JSON 更适合具有半结构化数据的日志用例。

在下面的示例中,我们使用一个具有 skunameprice 属性的 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 客户端测试 中找到。