推出 Elasticsearch 查询语言 (ES|QL)

作者:Costin Leau

我很高兴地宣布,经过大约一年的开发,Elasticsearch 查询语言 (ES|QL) 已准备好与世界共享,并已登陆 Elasticsearch 存储库。 ES|QL 是 Elasticsearch® 原生的强大声明性语言,专为可组合性、表现力和速度而设计。

为什么要另一种语言?

Elasticsearch 支持多种语言,从古老的 queryDSLEQLKQLSQLPainlessCanvas/Timelion 等,随着其采用率的增加,受众及其需求也在增加。 它不再只是 “全文搜索”。 它涉及很多事情,例如日志探索、威胁搜寻、报告、警报和自定义处理。

作为我们自己产品的消费者,我们想要一种与 Elasticsearch 交互的单一、整合的方式,这种方式可以使全面的计算功能接近数据,并且无需昂贵地传输到外部系统进行自定义处理。

以下是使用 MySQL 演示 employees 数据集(进行了大量修改)从测试套件中获取的 ES|QL 查询:

1. FROM employees
2. | EVAL hired_year = TO_INTEGER(DATE_FORMAT(hire_date, "YYYY"))
3. | WHERE hired_year > 1984
4. | STATS avg_salary = AVG(salary) BY languages
5. | EVAL avg_salary = ROUND(avg_salary)
6. | EVAL lang_code = TO_STRING(languages)
7. | ENRICH languages_policy ON lang_code WITH lang = language_name
8. | WHERE NOT IS_NULL(lang)
9. | KEEP avg_salary, lang
10. | SORT avg_salary ASC
11. | LIMIT 3
 1.    FROM employees
2.  | EVAL hired_year = TO_INTEGER(DATE_FORMAT(hire_date, "YYYY"))
3.  | WHERE hired_year > 1984
4.  | STATS avg_salary = AVG(salary) BY languages
5.  | EVAL avg_salary = ROUND(avg_salary)
6.  | EVAL lang_code = TO_STRING(languages)
7.  | ENRICH languages_policy ON lang_code WITH lang = language_name
8.  | WHERE NOT IS_NULL(lang)
9.  | KEEP avg_salary, lang
10.  | SORT avg_salary ASC
11.  | LIMIT 3
1. FROM employees 2. | EVAL hired_year = TO_INTEGER(DATE_FORMAT(hire_date, "YYYY")) 3. | WHERE hired_year > 1984 4. | STATS avg_salary = AVG(salary) BY languages 5. | EVAL avg_salary = ROUND(avg_salary) 6. | EVAL lang_code = TO_STRING(languages) 7. | ENRICH languages_policy ON lang_code WITH lang = language_name 8. | WHERE NOT IS_NULL(lang) 9. | KEEP avg_salary, lang 10. | SORT avg_salary ASC 11. | LIMIT 3

返回类似于以下内容的响应:

1. {
2. "columns": [3. {"name": "avg_salary", "type": "double"},4. {"name": "lang", "type": "keyword"}5. ],
6. "rows": [7. ["43760.0", "Spanish"],
8. ["48644.0", "French"],
9. ["48832.0", "German"]
10. ]
11. }
1.  {
2.    "columns": [3.      {"name": "avg_salary", "type": "double"},4.      {"name": "lang",       "type": "keyword"}5.    ],
6.    "rows": [7.      ["43760.0", "Spanish"],
8.      ["48644.0", "French"],
9.      ["48832.0", "German"]
10.    ]
11.  }
1. { 2. "columns": [3. {"name": "avg_salary", "type": "double"},4. {"name": "lang", "type": "keyword"}5. ], 6. "rows": [7. ["43760.0", "Spanish"], 8. ["48644.0", "French"], 9. ["48832.0", "German"] 10. ] 11. }

单个 ES|QL 查询执行过滤、处理、分组、重命名、排序、查找和列修剪。

查询从上到下流动,就像数据一样。 人们可以根据需要链接任意数量的命令,对它们重新排序,并使用内置函数或其自身的评估。 ES|QL 提供了统一的查询体验,比现有的查询界面更简单、更强大,并且将继续可用。

专用查询引擎

ES|QL 不仅仅是一种语言,还是 Elasticsearch 的成熟、专业的查询和计算引擎。 没有对 QueryDSL 的翻译或转译:所有 ES|QL 查询都经过词法分析和解析、解析和语义分析、验证和优化,然后是针对集群中的数据进行分布式执行的规划阶​​段。 指定的目标节点负责本地执行,并通过使用 ES|QL 基础设施执行自己的本地重新规划来利用本地数据特征。

ES|QL 带来了一种在设计时考虑到性能的新执行引擎,该引擎一次对块而不是对每行进行操作,以矢量化和缓存局部性为目标,并支持专业化和多线程。 它是一个独立于现有 Elasticsearch 聚合框架的组件,具有不同的性能特征。 在我们当前的基准测试中,几个聚合有了显着的改进(下图中的值越小越好)。

目标是提供不同的功能,例如执行多个链式分组:

1. POST /_query?format=txt
2. {
3. "query" : """
4. FROM employees
5. | STATS c = COUNT(emp_no) BY languages
6. | STATS most_speakers_of_a_lang = MAX(c)
7. """
8. }
1.  POST /_query?format=txt
2.  {
3.   "query" : """
4.    FROM employees
5.  | STATS c = COUNT(emp_no) BY languages
6.  | STATS most_speakers_of_a_lang = MAX(c)
7.   """
8.  }
1. POST /_query?format=txt 2. { 3. "query" : """ 4. FROM employees 5. | STATS c = COUNT(emp_no) BY languages 6. | STATS most_speakers_of_a_lang = MAX(c) 7. """ 8. }

上面查询显示的结果为:

1. most_speakers_of_a_lang
2. -----------------------
3. 21
1.  most_speakers_of_a_lang
2.  -----------------------
3.  21
1. most_speakers_of_a_lang 2. ----------------------- 3. 21

请留意未来的博文,我们将探讨 ES|QL 的功能、设计决策和架构。

我在哪里可以得到它?

ES|QL 代码目前在功能分支上可用,并将作为 Elasticsearch 中的技术预览版发布。 这是一项免费功能,可供所有人使用。 每天快照很快就会可供下载,因此请随时查看代码并自行构建。 尝试一下 ES|QL 并开始探索本地数据 – 请阅读此处的文档

因为我们正处于 ES|QL 的早期阶段,可能存在一些未解决的问题、障碍,甚至是错误,请提出问题。 我们迫不及待地想与 Elasticsearch 社区分享 ES|QL!

我们代表 ES|QL 团队期待您的反馈!

本文中描述的任何特性或功能的发布和时间安排均由 Elastic 自行决定。 当前不可用的任何特性或功能可能无法按时交付或根本无法交付。

原文:www.elastic.co/blog/elasti…

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYlNhyPb' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片