当前位置:   article > 正文

Elasticsearch:ES|QL 查询 TypeScript 类型(一)

Elasticsearch:ES|QL 查询 TypeScript 类型(一)

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

现在,让我们使用一个非常基本的 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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/682877
推荐阅读
相关标签
  

闽ICP备14008679号