作者:Costin Leau
我很高興地宣布,經過大約一年的開發,Elasticsearch 查詢語言 (ES|QL) 已準備好與世界共享,并已登陸 Elasticsearch 存儲庫。 ES|QL 是 Elasticsearch? 原生的強大聲明性語言,專為可組合性、表現力和速度而設計。
為什么要另一種語言?
Elasticsearch 支持多種語言,從古老的 queryDSL 到 EQL、KQL、SQL、Painless、Canvas/Timelion 等,隨著其采用率的增加,受眾及其需求也在增加。 它不再只是 “全文搜索”。 它涉及很多事情,例如日志探索、威脅搜尋、報告、警報和自定義處理。
作為我們自己產品的消費者,我們想要一種與 Elasticsearch 交互的單一、整合的方式,這種方式可以使全面的計算功能接近數據,并且無需昂貴地傳輸到外部系統進行自定義處理。
以下是使用 MySQL 演示 employees 數據集(進行了大量修改)從測試套件中獲取的 ES|QL 查詢:
FROM employees
| EVAL hired_year = TO_INTEGER(DATE_FORMAT(hire_date, "YYYY"))
| WHERE hired_year > 1984
| STATS avg_salary = AVG(salary) BY languages
| EVAL avg_salary = ROUND(avg_salary)
| EVAL lang_code = TO_STRING(languages)
| ENRICH languages_policy ON lang_code WITH lang = language_name
| WHERE NOT IS_NULL(lang)
| KEEP avg_salary, lang
| SORT avg_salary ASC
| LIMIT 3
返回類似于以下內容的響應:
{"columns": [{"name": "avg_salary", "type": "double"},{"name": "lang", "type": "keyword"}],"rows": [["43760.0", "Spanish"],["48644.0", "French"],["48832.0", "German"]]
}
單個 ES|QL 查詢執行過濾、處理、分組、重命名、排序、查找和列修剪。
查詢從上到下流動,就像數據一樣。 人們可以根據需要鏈接任意數量的命令,對它們重新排序,并使用內置函數或其自身的評估。 ES|QL 提供了統一的查詢體驗,比現有的查詢界面更簡單、更強大,并且將繼續可用。
專用查詢引擎
ES|QL 不僅僅是一種語言,還是 Elasticsearch 的成熟、專業的查詢和計算引擎。 沒有對 QueryDSL 的翻譯或轉譯:所有 ES|QL 查詢都經過詞法分析和解析、解析和語義分析、驗證和優化,然后是針對集群中的數據進行分布式執行的規劃階??段。 指定的目標節點負責本地執行,并通過使用 ES|QL 基礎設施執行自己的本地重新規劃來利用本地數據特征。
ES|QL 帶來了一種在設計時考慮到性能的新執行引擎,該引擎一次對塊而不是對每行進行操作,以矢量化和緩存局部性為目標,并支持專業化和多線程。 它是一個獨立于現有 Elasticsearch 聚合框架的組件,具有不同的性能特征。 在我們當前的基準測試中,幾個聚合有了顯著的改進(下圖中的值越小越好)。
目標是提供不同的功能,例如執行多個鏈式分組:
POST /_query?format=txt
{"query" : """FROM employees
| STATS c = COUNT(emp_no) BY languages
| STATS most_speakers_of_a_lang = MAX(c)"""
}
上面查詢顯示的結果為:
most_speakers_of_a_lang
-----------------------
21
請留意未來的博文,我們將探討 ES|QL 的功能、設計決策和架構。
我在哪里可以得到它?
ES|QL 代碼目前在功能分支上可用,并將作為 Elasticsearch 中的技術預覽版發布。 這是一項免費功能,可供所有人使用。 每天快照很快就會可供下載,因此請隨時查看代碼并自行構建。 嘗試一下 ES|QL 并開始探索本地數據 - 請閱讀此處的文檔。
因為我們正處于 ES|QL 的早期階段,可能存在一些未解決的問題、障礙,甚至是錯誤,請提出問題。 我們迫不及待地想與 Elasticsearch 社區分享 ES|QL!
我們代表 ES|QL 團隊期待您的反饋!
本文中描述的任何特性或功能的發布和時間安排均由 Elastic 自行決定。 當前不可用的任何特性或功能可能無法按時交付或根本無法交付。
原文:https://www.elastic.co/blog/elasticsearch-query-language-esql