1. 程式人生 > 資訊 >亞馬遜投資的電動車公司 Rivian 考慮 50 億美元在得州建設新工廠

亞馬遜投資的電動車公司 Rivian 考慮 50 億美元在得州建設新工廠

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 允許兩種註釋

  • 單行註釋 --
  • 多行註釋 /**/