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"));
    }
}