Elasticsearch:ES|QL 查询 TypeScript 类型

162 阅读3分钟

作者:来自 Elastic Josh Mock

在最近的一篇文章中,Laura 重点介绍了如何使用 Java Elasticsearch 客户端来制作 ES|QL 查询并将其结果解析为原生 Java 对象。即将发布的 8.14.0 版 JavaScript 客户端将提供类似的功能(支持 TypeScript)。让我们来看看如何使用它:

首先,让我们使用批量助手来索引一些数据:



1.  const client = new Client({
2.    node: "http://localhost:9200",
3.   const client = new Client({
4.    node: elasticsearchEndpoint,
5.    auth: {
6.      apiKey: elasticsearchApiKey
7.    }
8.  });
9.  })

11.  await client.helpers.bulk({
12.    datasource: [
13.      { name: "Revelation Space", author: "Alastair Reynolds", release_date: "2000-03-15", page_count: 585 },
14.      { name: "1984", author: "George Orwell", release_date: "1985-06-01", page_count: 328 },
15.      { name: "Fahrenheit 451", author: "Ray Bradbury", release_date: "1953-10-15", page_count: 227 },
16.      { name: "Brave New World", author: "Aldous Huxley", release_date: "1932-06-01", page_count: 268 },
17.    ],
18.    onDocument(_doc) {
19.      return { index: { _index: "books" } }
20.    },
21.  })


现在,让我们使用一个非常基本的 ES|QL 查询来查看这些新索引的文档:



1.  const response = await client.esql.query({ query: 'FROM books' })
2.  /*
3.  Returns:
4.  {
5.    columns: {
6.      { name: "name", type: "keyword" },
7.      { name: "author", type: "keyword" },
8.      { name: "release_date", type: "date" },
9.      { name: "page_count", type: "integer" },
10.    },
11.    values: [
12.      [ "Revelation Space", "Alastair Reynolds", "2000-03-15", 585 ],
13.      [ "1984", "George Orwell", "1985-06-01", 328 ],
14.      [ "Fahrenheit 451", "Ray Bradbury", "1953-10-15", 227 ],
15.      [ "Brave New World", "Aldous Huxley", "1932-06-01", 268 ],
16.    ],
17.  }
18.  */


将每行返回为值数组是一个简单的默认设置,在许多情况下很有用。不过,如果你想要一个记录数组(JavaScript 应用程序中的标准结构),则需要额外的努力来转换数据。

幸运的是,在 8.14.0 中,JavaScript 客户端将包含一个新的 ES|QL 助手来为你执行此操作:



1.  const { records } = await client.helpers.esql({ query: 'FROM books' }).toRecords()
2.  /*
3.  Returns:
4.  [
5.    { name: "Revelation Space", author: "Alastair Reynolds", release_date: "2000-03-15", page_count: 585 },
6.    { name: "1984", author: "George Orwell", release_date: "1985-06-01", page_count: 328 },
7.    { name: "Fahrenheit 451", author: "Ray Bradbury", release_date: "1953-10-15", page_count: 227 },
8.    { name: "Brave New World", author: "Aldous Huxley", release_date: "1932-06-01", page_count: 268 },
9.  ]
10.  */


如果你使用 TypeScript,则可以内联声明结果的类型:



1.  type Book = {
2.    name: string,
3.    author: string,
4.    release_date: string,
5.    page_count: number,
6.  }
7.  // Returns `records` as `Book[]`
8.  const { records } = await client.helpers.esql({ query: 'FROM books' }).toRecords<Book>()


在另一种情况下,你可能需要声明与查询结果不完全匹配的类型。也许键和列的名称不同,或者返回的文档包含你类型中不存在的列。在这种情况下,我们可以使用 ES|QL RENAME 和 KEEP 处理命令来修改结果以更好地适合你的类型:



1.  type Book = {
2.    name: string,
3.    author: string,
4.    released: string,
5.  }
6.  const query = `FROM books | DROP page_count | RENAME release_date AS released`
7.  const { records } = await client.helpers.esql({ query }).toRecords<Book>()


这些是相对简单的例子,重点介绍了如何在 JavaScript 客户端中使用新的 ES|QL 帮助程序,因此请查看文档以获取完整详细信息。JavaScript 客户端的未来版本可能会包含更多 ES|QL 帮助程序,例如使用生成器对大型结果集进行分页,以及对 Apache Arrow 的支持。

我们所有的官方客户端都计划包含类似的帮助程序和工具,以使使用 ES|QL 查询尽可能简单。在未来几周和几个月内查看你首选客户端的更新日志!

准备好自己尝试一下了吗?开始免费试用
Elasticsearch 集成了 LangChain、Cohere 等工具。加入我们的高级语义搜索网络研讨会,构建你的下一个 GenAI 应用程序!

原文:ES|QL queries to TypeScript types — Elastic Search Labs