ElasticSearch SQL介紹
Elasticsearch SQL是一個X-Pack組件,它允許針對Elasticsearch實時執行類似SQL的查詢。無論使用REST接口,命令行還是JDBC,任何客戶端都可以使用SQL 在Elasticsearch內部本機搜索和聚合數據 。可以將Elasticsearch SQL視為一種翻譯器,它可以理解SQL和Elasticsearch,並可以利用Elasticsearch功能輕松地進行大規模實時讀取和處理數據。
Elasticsearch SQL旨在為Elasticsearch提供強大而輕量級的SQL接口。
為什么選擇Elasticsearch SQL?
- 本機集成
- Elasticsearch SQL是為Elasticsearch從頭開始構建的。根據基礎存儲,針對相關節點有效執行每個查詢。
- 沒有外部零件
- 無需其他硬件,流程,運行時或庫即可查詢Elasticsearch;Elasticsearch SQL通過 在 Elasticsearch集群中運行來消除多余的運動部件。
- 輕巧高效
- Elasticsearch SQL並未抽象化Elasticsearch及其搜索功能-相反,它包含並公開了SQL以允許以相同的聲明性,簡潔的方式實時進行適當的全文本搜索。
SQL 入門
1、准備數據
本例使用ES版本是7.6.1,准備數據如下:
1 POST /book/_bulk 2 3 {"index":{"_id": "1001"}} 4 {"id": 1001, "name": "Java編程思想", "author": "小紅", "release_date": "2011-06-02", "page_count": 561} 5 {"index":{"_id": "1002"}} 6 {"id": 1002, "name": "Java數據結構和算法", "author": "小綠", "release_date": "1989-05-26", "page_count": 482} 7 {"index":{"_id": "1003"}} 8 {"id": 1003, "name": "JavaScript權威指南", "author": "小藍", "release_date": "1965-06-01", "page_count": 604} 9 {"index":{"_id": "1004"}} 10 {"id": 1004, "name": "Java並發編程實踐", "author": "小白", "release_date": "1975-06-01", "page_count": 704}
2、使用SQL REST API查詢
1 POST /_sql?format=txt 2 { 3 "query": "SELECT * FROM book WHERE release_date < '2000-01-01'" 4 }
效果如下:
3、使用SQL CLI查詢
Elasticsearch附帶了一個腳本,用於在其bin
目錄中運行SQL CLI :
1)運行sql cli
命令(默認連接http://localhost:9200):./bin/elasticsearch-sql-cli
命令(指定連接url):./bin/elasticsearch-sql-cli http://some.server:9200
命令(指定連接url帶認證):./bin/elasticsearch-sql-cli http://sql_user:strongpassword@some.server:9200
2、使用sql cli執行查詢sql命令
查詢sql:SELECT * FROM book WHERE page_count > 500 ORDER BY page_count DESC;
效果如下:
SQL和Elasticsearch映射概念
盡管SQL和Elasticsearch對於數據的組織方式(和不同的語義)使用不同的術語,但本質上它們的目的是相同的。
SQL | Elasticsearch | 描述 |
column | field | 在這兩種情況下,數據都以最低級別存儲在命名條目中,該條目具有多種數據類型,包含一個值。SQL將此類條目稱為列,而Elasticsearch將其稱為字段。請注意,在Elasticsearch中,一個字段可以包含多個相同類型的值(本質上是一個列表),而在SQL中,一列可以恰好包含一個所述類型的值。Elasticsearch SQL將盡最大努力保留SQL語義,並根據查詢拒絕那些返回具有多個值的字段的查詢。 |
row | document | Column s和field s 本身不存在;它們是row 或的一部分document 。兩者的語義略有不同:a row 趨於嚴格(並具有更多的強制性),而a document 趨於更加靈活或寬松(同時仍具有結構)。 |
table | index | 對其執行查詢的目標,無論是SQL還是Elasticsearch。 |
schema | implicit | 在RDBMS中,schema 主要是表的命名空間,通常用作安全邊界。Elasticsearch沒有為其提供等效的概念。但是,啟用安全性后,Elasticsearch會自動應用安全性強制措施,以便角色僅查看允許其訪問的數據(在SQL行話中,其模式為)。 |
catalog or database | cluster instance | 在SQL中,catalog 或database 可互換使用,並表示一組模式,即多個表。在Elasticsearch中,可用的索引集被分組為一個cluster 。語義也有所不同。a database 本質上是另一個名稱空間(可能對數據的存儲方式有一定影響),而Elasticsearch cluster 是運行時實例,或者是一組至少一個Elasticsearch實例(通常是分布式運行)。實際上,這意味着,盡管在SQL中一個實例中可能具有多個目錄,但在Elasticsearch中一個實例僅限於一個。 |
cluster | cluster(federated) |
傳統上,在SQL中,群集是指包含多個 盡管RDBMS往往只有一個正在運行的實例,但在單台機器(未分布)上,Elasticsearch卻相反,默認情況下,它是分布的和多實例的。 此外,Elasticsearch 單個集群::通常在同一名稱空間內運行的多個Elasticsearch實例通常跨計算機分布。多個集群::多個集群,每個集群都有自己的名稱空間,並在聯合設置中相互連接 |
SQL REST API
1、查詢
1)普通查詢,同上
1 POST /_sql?format=txt 2 { 3 "query": "SELECT * FROM book ORDER BY page_count DESC LIMIT 5" 4 }
2)匹配索引查詢
1 POST /_sql?format=txt 2 3 { 4 "query": "SELECT * FROM \"boo*\" WHERE page_count > 500 ORDER BY page_count DESC" 5 }
注意:索引名需要用雙引號(")引起來
2、響應格式
雖然文本格式對人類很有益,但計算機更喜歡結構化的東西。
Elasticsearch SQL可以以下格式返回數據,可以通過format
URL中的屬性或通過設置Accept
HTTP標頭來設置數據:
json格式如下:
3、分頁
當數據量較大時,需要分頁返回,ES提供了游標的形式來分頁
示例
1)第一次請求,設置接收數據大小
1 POST /_sql?format=sql 2 3 { 4 "query": "SELECT * FROM book order by release_date", 5 "fetch_size" : 1 6 }
效果如下:
2)第二頁,使用游標獲取數據
POST /_sql?format=json { "cursor": "5/WuAwFaAXNARFhGMVpYSjVRVzVrUm1WMFkyZ0JBQUFBQUFBQUFESVdlbVJGWmtzMmVWVlRXRk4zZW1SSFdETTNhMDFrWnc9Pf////8PBQFmBmF1dGhvcgEGYXV0aG9yAQR0ZXh0AAAAAWYCaWQBAmlkAQRsb25nAAAAAWYEbmFtZQEEbmFtZQEEdGV4dAAAAAFmCnBhZ2VfY291bnQBCnBhZ2VfY291bnQBBGxvbmcAAAABZgxyZWxlYXNlX2RhdGUBDHJlbGVhc2VfZGF0ZQEIZGF0ZXRpbWUBAAABHw==" }
效果如下:
請注意,響應數據中,該columns
對象只是第一頁的一部分。
cursor
結果未返回時,您已到達最后一頁。像Elasticsearch的滾動一樣,
SQL可以在Elasticsearch中保持狀態以支持游標。與滾動不同,接收最后一頁足以保證清除Elasticsearch狀態。
3)清空cursor
示例
1 POST /_sql/close 2 { 3 "cursor": "sDXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAAEWYUpOYklQMHhRUEtld3RsNnFtYU1hQQ==:BAFmBGRhdGUBZgVsaWtlcwFzB21lc3NhZ2UBZgR1c2Vy9f///w8=" 4 }
SQL 翻譯 API
SQL Translate API接受JSON文檔中的SQL,並將其轉換為本地Elasticsearch查詢。
例如:
1 POST /_sql/translate 2 3 { 4 "query": "SELECT * FROM book ORDER BY page_count DESC", 5 "fetch_size": 10 6 }
效果如下:
翻譯出來的DSL語句,可以用在Elasticsearch查詢上