前些天,boss分配了個任務給我:把ElasticSearch的日誌整合到應用中,要求可以根據某個關鍵詞key,日誌保持時間段查詢就可以了,ElasticSearch有api,你去網上找找看,具體選擇自己把握,儘快完成。
回想了下這些年,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依賴包引入:
springboot是個好東西,要用的,application。yml配置如下:
es:
hostAndPorts: ‘ip1:9200,ip2:9200,ip3:9200,ipn:9200’
index: ‘info-prod-*’
type: ‘user’
es是個查詢工具,把api封裝成服務最好不過了,於是就有了EsClientService:
EsClientService
說明:
方法getClient() 獲取客戶端連線;
方法search() 封裝es的查詢,並返回SearchResponse物件;
接下來就是業務類的呼叫了:具體如下:
業務類呼叫es查詢
說明:最終可以拿到搜尋結果的一個Map,這個系列化返回給前端就好。
最後分享一個小坑:es的查詢速度是賊快賊快的,這是基於es的分片技術,然後再合併結果使得查詢結果很快,但也恰恰因為此:在深度分頁(from+size > 10000)時查詢速度就不再理想了,所以es乾脆就直接報錯了,以下為Kinbaba深度分頁錯誤示範,望大家避免之。
es分頁查詢報錯資訊
最後,謝謝大家的觀看 ^-^