【ElasticSearch】 ElasticSearch SQL(十三)


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 Columns和fields 本身不存在;它們是row或的一部分document。兩者的語義略有不同:a row趨於嚴格(並具有更多的強制性),而a document趨於更加靈活或寬松(同時仍具有結構)。
table index 對其執行查詢的目標,無論是SQL還是Elasticsearch。
schema implicit 在RDBMS中,schema主要是表的命名空間,通常用作安全邊界。Elasticsearch沒有為其提供等效的概念。但是,啟用安全性后,Elasticsearch會自動應用安全性強制措施,以便角色僅查看允許其訪問的數據(在SQL行話中,其模式為)。
catalog or database cluster instance 在SQL中,catalogdatabase可互換使用,並表示一組模式,即多個表。在Elasticsearch中,可用的索引集被分組為一個cluster。語義也有所不同。a database本質上是另一個名稱空間(可能對數據的存儲方式有一定影響),而Elasticsearch cluster是運行時實例,或者是一組至少一個Elasticsearch實例(通常是分布式運行)。實際上,這意味着,盡管在SQL中一個實例中可能具有多個目錄,但在Elasticsearch中一個實例僅限於一個。
cluster

cluster(federated)

傳統上,在SQL中,群集是指包含多個catalogs或databases 的單個RDMBS實例(請參見上文)。同樣的單詞也可以在Elasticsearch內部重用,但是其語義有所澄清。

盡管RDBMS往往只有一個正在運行的實例,但在單台機器(未分布)上,Elasticsearch卻相反,默認情況下,它是分布的和多實例的。

此外,Elasticsearch cluster可以以聯合方式連接到其他cluster,因此意味着:cluster

單個集群::通常在同一名稱空間內運行的多個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可以以下格式返回數據,可以通過formatURL中屬性或通過設置AcceptHTTP標頭來設置數據

  

  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查詢上

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM