索引单个文档编辑

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

在下面的示例中,我们使用了一个 Product 域对象,它具有 skunameprice 属性。

有关索引请求的完整说明,请参阅 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 客户端测试 中找到。