作者:来自 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 应用程序!