亞馬遜投資的電動車公司 Rivian 考慮 50 億美元在得州建設新工廠
阿新 • • 發佈:2021-08-12
Elasticsearch SQL 是一個X-Pack元件,允許對Elasticsearch實時執行類似SQL的查詢,為Elasticsearch提供一個強大而輕量的SQL介面。
無論使用REST介面,命令列還是JDBC,任何客戶機都可以使用SQL對EsasticSearch進行查詢。Elasticsearch SQL是一個將SQL轉換為DQL的轉換器。主要針對於查詢操作。
約定
很多人習慣地把ElasticSerach和資料庫進行類比,如 一個ES索引等同於一張資料庫表,一條Document記錄等同於一行資料庫表記錄,一個欄位等同於表的一個屬性....
在Elasticsearch SQL這裡,這些類比的合適的,更方便理解SQL和DQL的對映。
SQL和ElasticSerach的對映關係
SQL | ElasticSerach | 說明 |
---|---|---|
column | field | 一個欄位或屬性 |
row | document | 一條完整的資料 |
table | index | |
schema | implicit |
SQL REST API
SQL REST API 接收json格式的SQL,執行並返回結果,和傳統DSL語法詳細,形式相同
如:
POST /_sql?format=txt
{
"query": """
show tables
"""
}
查詢
POST /_sql?format=txt { "query": """ SELECT key,price,title FROM "dang-dang" order by price desc limit 6 """ }
結果:
key | price | title ---------------+---------------+------------------------------------------------------------- java1 |¥99.80 |Java從入門到專案實戰(全程視訊版) C2 |¥99.80 |C語言從入門到精通(彩印版)案例視訊版 程式設計入門/IT計算機書籍 C3 |¥99.80 |C語言從入門到專案實戰(全程視訊版) 瀏覽器5 |¥99.78 |騰訊Android自動化測試實戰-彙集QQ瀏覽器應用寶等億級APP自動化測試精髓【正版圖書,達額立減】 C5 |¥99.70 |Unity與C++網路遊戲開發實戰:基於VR、AI與分散式架構 架構設計4 |¥99.44 |[現貨] 微服務架構設計模式 [美] 克里斯・理查森(Chris Richardson) 9787111624127 機
返回的資料格式format
format | Axxept HTTP Header | 說明 |
---|---|---|
csv | text/csv | 逗號分隔 |
json | application/json | JSON格式 |
tsv | text/tab-separated-values | tab分隔 |
txt | text/pain | 文字格式 |
yaml | application/yaml | yaml格式 |
vbor | application/vbor | 簡潔的二進位制 |
smile | application/smile | 類似cbor的二進位制 |
支援的引數
引數名稱 | 預設值 | 說明 |
---|---|---|
query | Mandatory | 傳遞SQL語句 |
filter | none | 可選的查詢DSL,用於過濾query的執行結果 |
fetch_size | 1000 | 獲取結果的最大數量 |
request_timeout | 90s | 請求超時時間 |
page_timeout | 45s | 分頁請求超時時間 |
time_zone | UTC | 時區 |
filed_multi_value_leniency | false | 當遇到一個欄位多個值時丟擲異常,或者從列表中返回第一個值 |
filter-過濾結果
POST /_sql?format=txt
{
"query": """
SELECT key,price,title FROM "dang-dang" limit 20
""",
"filter":{
"range": {
"price": {
"gte": 100
}
}
}
}
SQL Translate API
translate 接受JSON格式的SQL,並將其轉換為ES查詢DSL,一幫用來了解SQL背後轉換原理。
POST /_sql/translate
{
"query": """
SELECT key,price,title FROM "dang-dang" limit 20
"""
}
響應:
{
"size" : 20,
"_source" : false,
"fields" : [
{
"field" : "key"
},
{
"field" : "price"
},
{
"field" : "title"
}
],
"sort" : [
{
"_doc" : {
"order" : "asc"
}
}
]
}
SQL
ES SQL 支援一般的SQL查詢語法和關鍵字,如AND,IN,IS,JOIN,LIKE...
識別符號
識別符號可以有兩種型別:帶引號和不帶引號的
1 不帶引號
查詢的目標欄位和條件均不是關鍵字,不需要帶引號
SELECT title FROM "dang-*"
使用場景:某一型別的索引是 dang-202108,dang-202107,dang-202106,由於索引資料太大,選擇按月建立索引,此時需要從多個索引查詢同一屬性。
2 帶引號
由於要查詢的欄位 from是關鍵字,需要用引號包起來,否則會和FROM衝突;
第二個因為包含了數學日期,會使解析器混淆,也需要包起來。
SELECT "from" FROM "<logstash-{now/d}>"
單引號和雙引號
在SQL中,單引號和雙引號具有不同的含義,不能相互轉換;
- 單引號:宣告字串
- 雙引號:宣告識別符號
示例:
SELECT "first_name"
FROM "musicians"
WHERE "last_name" = 'Carroll'
- first_name是列名
- musicians是表名(索引)
- last_name是列名
- Carroll是字串
特殊字元
特殊字元 | 含義 |
---|---|
* | 在某些上下文中用於表示佔位符,也可用於某些聚合函式的引數 |
, | 用於列舉列表的元素 |
. | 使用者數字常量或分隔識別符號限定符(目錄,表,列名等) |
() | 用於特定的SQL命令,函式宣告或控制優先順序 |
註釋
ElasticSearch SQL 允許兩種註釋
- 單行註釋 --
- 多行註釋 /**/