Web應用整合ElasticSearch實現日誌查詢

前些天,boss分配了個任務給我:把ElasticSearch的日誌整合到應用中,要求可以根據某個關鍵詞key,日誌保持時間段查詢就可以了,ElasticSearch有api,你去網上找找看,具體選擇自己把握,儘快完成。

Web應用整合ElasticSearch實現日誌查詢

回想了下這些年,ElasticSearch,什麼鬼,沒用過,遂百度之,結果發現這玩意還挺nb(具體怎麼nb這裡不說),首先是瞭解了下ELK這三兄弟,算你有一套,瞭解過程……ELK這裡說下K(Kibnana):一個視覺化工具,用來但不限於查詢ElasticSearch的資料,我們有搭建ELK這套系統,要了個賬號直接就去操作了,官網學了下操作語法,下面是幾個查詢語句

GET _cat/indices?v // 獲取所有index資訊

再來一個精確查詢的例子(以下ElasticSearch簡稱es),info(es的index) user(es的type)

POST info/user/_search

{

“query”:{“term”:{“name”:“zhagnsan”}},

“from”: 0,

“size”: 100

} // 分頁查詢info/user下名字為zhangsan的記錄

這裡有幾個es技術詞語需要解釋下,es 其實與資料庫比較相似,就拿mysql來比較

es:index mysql:database

es:type mysql:table

es:document mysql:資料庫表一行記錄

es:field mysql:資料庫表中一個欄位

萬事具備,只欠東風,接下來該寫程式來實現功能了,maven引包的實現發現有以下選擇:

TransportClient:基於tcp的客戶端

Jest:專門的Java客戶端

Spring-data-elasticsearch:Spring全家桶的東西,更新速度趕不上es的更新速度

RestHighLevelClient/LevelHighLevelClient:官方推薦的客戶端

這裡我選擇了RestHighLevelClient,官方推薦,遇到問題討論的人多,問題解決快。

下面貼點乾貨,篇幅有限,只貼部分主要程式碼。

maven依賴包引入:

org。elasticsearch。client

elasticsearch-rest-high-level-client

6。2。3

springboot是個好東西,要用的,application。yml配置如下:

es:

hostAndPorts: ‘ip1:9200,ip2:9200,ip3:9200,ipn:9200’

index: ‘info-prod-*’

type: ‘user’

es是個查詢工具,把api封裝成服務最好不過了,於是就有了EsClientService:

Web應用整合ElasticSearch實現日誌查詢

EsClientService

說明:

方法getClient() 獲取客戶端連線;

方法search() 封裝es的查詢,並返回SearchResponse物件;

接下來就是業務類的呼叫了:具體如下:

Web應用整合ElasticSearch實現日誌查詢

業務類呼叫es查詢

說明:最終可以拿到搜尋結果的一個Map,這個系列化返回給前端就好。

最後分享一個小坑:es的查詢速度是賊快賊快的,這是基於es的分片技術,然後再合併結果使得查詢結果很快,但也恰恰因為此:在深度分頁(from+size > 10000)時查詢速度就不再理想了,所以es乾脆就直接報錯了,以下為Kinbaba深度分頁錯誤示範,望大家避免之。

Web應用整合ElasticSearch實現日誌查詢

es分頁查詢報錯資訊

最後,謝謝大家的觀看 ^-^