索引单个文档

编辑

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

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

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