Java 客户端中的 ES|QL

编辑

此页面帮助您了解和使用 Java 客户端中的 ES|QL

有两种方法可以在 Java API 客户端中使用 ES|QL

  • 直接使用 Elasticsearch ES|QL API:这是最灵活的方法,但也是最复杂的方法,因为您必须以原始形式处理结果。您可以选择结果的精确格式,例如 JSON、CSV 或文本。
  • 使用 ES|QL 映射助手:这些映射器负责将原始响应解析为应用程序可以直接使用的内容。有几个映射器可用于不同的用例,例如对象映射、结果的光标遍历和数据帧。您还可以为特定用例定义自己的映射器。

如何使用 ES|QL API

编辑

ES|QL 查询 API 允许您指定结果的返回方式。您可以选择 响应格式,例如 CSV、文本或 JSON,然后使用列分隔符和区域设置等参数对其进行微调。

由于响应根据格式而有很大差异,因此 Java API 客户端有一个 BinaryData 对象,您可以根据请求中指定的格式使用它。

以下示例获取 ES|QL 结果作为 CSV 并对其进行解析

String queryAuthor =
    """
        from books
        | where author == "Isaac Asimov"
        | sort year desc
        | limit 10
    """;

BinaryResponse response = client.esql().query(q -> q
    .format("csv")
    .delimiter(",")
    .query(queryAuthor));

String result = new BufferedReader(new InputStreamReader(response.content()))
    .lines().collect(Collectors.joining("\n"));

使用 ES|QL 结果

编辑

前面的示例表明,尽管原始 ES|QL API 提供了最大的灵活性,但为了利用结果数据,还需要进行额外的工作。

为了简化操作,尝试使用 ES|QL 结果的这三种主要表示形式(每个都有自己的映射助手)

  • 对象,其中结果中的每一行都映射到应用程序域中的一个对象。这类似于 ORM(对象关系映射器)通常执行的操作。

    List<Book> queryRes = (List<Book>) client.esql().query(ObjectsEsqlAdapter.of(Book.class), queryAuthor);
  • 光标,您可以在其中逐行扫描结果并使用列名访问数据。这类似于数据库访问库。

    ResultSet resultSet = client.esql().query(ResultSetEsqlAdapter.INSTANCE, queryAuthor);

定义自己的映射

编辑

尽管 Java API 客户端提供的映射器涵盖了许多用例,但您的应用程序可能需要自定义映射。您可以编写自己的映射器并以类似于内置映射器的方式使用它。

请注意,映射器旨在提供 ES|QL 结果的更易于使用的表示形式,而不是处理结果数据。数据处理应基于结果映射器的输出。

这是一个返回数据的简单列导向表示的示例映射器

public class CustomStringAdapter extends EsqlAdapterBase<String> {

    public static final CustomStringAdapter INSTANCE = new CustomStringAdapter();

    @Override
    public String format() {
        return "json";
    }

    @Override
    public boolean columnar() {
        return true;
    }

    @Override
    public String deserialize(ApiClient<ElasticsearchTransport, ?> client, QueryRequest request,
                              BinaryResponse response)
        throws IOException {
        return new BufferedReader(new InputStreamReader(response.content()))
            .lines().collect(Collectors.joining("\n"));
    }
}