Elasticsearch SQL
Elasticsearch引擎
Elasticsearch是當今許多生產部署中使用最廣泛的搜索引擎之一。 它基于Lucene搜索庫,它提供的主要功能之一是在Lucene之上的基于JSON的查詢DSL,它提供了一種易于使用的機制來與搜索引擎進行交互。 但是,查詢DSL非常特定于Elasticsearch。 Elasticsearch 6.3中引入的SQL支持帶來了一種針對搜索引擎運行查詢的標準機制,并且朝著更容易被已熟悉SQL的開發人員采用更進一步。 盡管SQL最初是為與關系數據庫管理系統一起使用而設計的,但它已經在許多其他系統(例如NoSQL數據庫)中實現。 以分布式數據處理引擎(如Apache Spark)或基于分布式緩存的計算系統(如Apache Ignite)中提供的受支持的SQL為例,其中SQL是所提供的核心查詢工具之一。 在本文中,我們將探討Elasticsearch SQL的工作方式。
初步設置
為了嘗試本文中的示例,您需要啟動一個本地Elasticsearch(至少6.3)實例。 在本文中,我們將使用最新的Elasticsearch 7.5。 我們將創建一個帖子索引,其中包含來自論壇的帖子。 我們將使用Elasticsearch Java客戶端將數據饋入索引,并且我們將不為索引的字段提供顯式映射(為簡單起見,我們將讓Elasticsearch為我們自動創建它)。 首先,我們將創建一個依賴于Elasticsearch Java高級客戶端的Maven項目(不推薦使用舊的Elasticsearch HTTP客戶端,并計劃在Elasticsearch 8.0中將其刪除):
<dependency> <groupId>org.elasticsearch.client< /groupId > <artifactId>elasticsearch-rest-high-level-client< /artifactId > <version>7.5.0< /version > < /dependency >我們將使用以下代碼在posts索引中創建10000個生成的post文檔:
RestHighLevelClient client = new RestHighLevelClient( RestClient.builder( new HttpHost( "localhost" , 9200 , "http" ))); ????????String[] possibleUsers = new String[] { "Martin" , "Jim" , "John" }; String[] possibleDates = new String[] { "2019-12-15" , "2019-12-16" , "2019-12-17" }; String[] possibleMessages = new String[] { "Hello, Javaadvent !" , "Cool set of blog posts. We want more !" , "Elasticsearch SQL is great." }; ????????for ( int i = 1 ; i <= 10000 ; i++) { Map<String, Object> jsonMap = new HashMap<>(); jsonMap.put( "user" , possibleUsers[ThreadLocalRandom.current().nextInt( 0 , 3 )]); jsonMap.put( "date" , possibleDates[ThreadLocalRandom.current().nextInt( 0 , 3 )]); jsonMap.put( "message" , possibleMessages[ThreadLocalRandom.current().nextInt( 0 , 3 )]); IndexRequest request = new IndexRequest( "posts" ) .id(String.valueOf(i)).source(jsonMap); client.index(request, RequestOptions.DEFAULT); } ????????client.close();運行SQL查詢
我們可以使用Kibana來查詢用戶名為Martin的所有文檔,如下所示:
POST /_sql ? format =txt { "query" : "SELECT * FROM posts where user = 'Martin'" }另一個示例是計算消息字段中包含Javaadvent單詞的所有文檔:
POST /_sql ? format =txt { "query" : "SELECT count(*) FROM posts where message like '%Javaadvent%'" }現在,如果您想在Java應用程序中運行上述查詢,則有幾種選擇:
- 使用Elasticsearch JDBC驅動程序運行它。 但是,此選項僅適用于白金級和企業級訂閱。
- REST客戶端調用Elasticsearch SQL端點。 如果只有基本(免費)的Elasticsearch選項,則可以選擇此選項。
您可以使用幾乎所有用于Java的REST客戶端來使用第二個選項,但是我們將使用低級Elasticsearch REST客戶端:
<dependency> <groupId>org.elasticsearch.client< /groupId > <artifactId>elasticsearch-rest-client< /artifactId > <version>7.5.0< /version > < /dependency >以下代碼塊僅從posts索引返回10個文檔:
RestClient restClient = RestClient.builder( new HttpHost( "localhost" , 9200 , "http" )).build(); ????????Request request = new Request( "POST" , "/_sql" ); request.setJsonEntity( "{\"query\":\"SELECT * FROM posts limit 10\"}" ); Response response = restClient.performRequest(request); String responseBody = EntityUtils.toString(response.getEntity()); System.out.println(responseBody); restClient.close();要了解如何在后臺執行SQL查詢,可以使用/ _sql / translate端點下提供的translation API。 如果要查看為先前的SQL查詢生成的查詢DSL,我們可以在Kibana中運行以下命令:
POST /_sql/translate { "query" : "SELECT * FROM posts limit 10" , "fetch_size" : 10 }我們應該得到類似于以下內容的結果:
{ "size" : 10, "_source" : { "includes" : [ "message" , "user" ], "excludes" : [ ] }, "docvalue_fields" : [ { "field" : "date" , "format" : "epoch_millis" } ], "sort" : [ { "_doc" : { "order" : "asc" } } ] }Elasticsearch SQL功能
我們演示了如何執行基本的SQL查詢。 Elasticsearch SQL引擎非常豐富,包括:
- SQL查詢響應的多種格式,例如csv,json,txt,yaml等;
- 與Elasticsearch SQL一起應用其他查詢DSL過濾;
- 由elasticsearch-sql-cli實用程序提供的CLI,您可以在其中直接執行SQL查詢。
關于SQL實現本身,可以參考支持的SQL命令以及SQL函數和運算符參考文檔。
結論
在本文中,我們演示了如何使用Elasticsearch SQL與Elasticsearch引擎進行交互。 與基于JSON的查詢DSL相比,使用此機制的可能性更高。 但是,Elasticsearch SQL不能替代它,而是在它之上構建的,并且可以滿足搜索引擎提供的眾多功能。
翻譯自: https://www.javacodegeeks.com/2020/01/elasticsearch-sql.html
總結
以上是生活随笔為你收集整理的Elasticsearch SQL的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓怎么复制门禁卡到手机(安卓怎么复制)
- 下一篇: [MEGA DEAL] Ultimate