Elasticsearch是什麼?
Elasticsearch簡稱ES,是一個基於Lucene構建的開源、分佈式、Restful接口的全文搜索引擎,還是一個分佈式文檔數據庫。天生就是分佈式、高可用、可擴展的,可以在很短的時間內存儲、搜索和分析大量的數據。
什麼是全文搜索?
全文搜索也叫全文檢索,是指掃描文章中的每一個詞,對每一個詞進建立一個索引,指明該詞在文章中出現的次數和位置,當前端用戶輸入的關鍵詞發起查詢請求後,搜索引擎就會根據事先建立的索引進行查找,並將查詢的結果響應給用戶。
這裏有兩個關鍵字:分詞和索引,Elasticsearch內部會完成這兩件事情,對保存的文本內容按規則進行分詞,並對這些分詞後的詞條建立索引,供用戶查詢。
什麼是倒排索引?
全文搜索過程根據關鍵詞創建的索引叫倒排索引,顧名思義,建立正向關係“文本內容-關鍵詞”叫正排索引,後續會介紹,倒排索引就是把原有關係倒過來,建立成“關鍵詞-文本內容”的關係,這樣的關係非常利於搜索。
舉個例子:
- 文本1:I have a friend who loves smile
- 文本2:I have a dream today
先進行英文分詞,再建立倒排索引,得到一份簡易的“關鍵詞-文本”的映射關係如下:
關鍵詞 | 文本編號 |
---|---|
I | 1,2 |
have | 1,2 |
a | 1,2 |
friend | 1 |
who | 1 |
loves | 1 |
smile | 1 |
dream | 2 |
today | 2 |
有了這個映射表,搜索"have"關鍵詞時,立即就能返回id爲1,2的兩條記錄,搜索today時,返回id爲2的記錄,這樣的搜索性能非常高。當然Elasticsearch維護的倒排索引包含更多的信息,此處只是作簡易的原理介紹。
Elasticsearch什麼場景適用?
常見場景
搜索類場景
常見的搜索場景比如說電商網站、招聘網站、新聞資訊類網站、各種app內的搜索。日誌分析類場景
經典的ELK組合(Elasticsearch/Logstash/Kibana),可以完成日誌收集,日誌存儲,日誌分析查詢界面基本功能,目前該方案的實現很普及,大部分企業日誌分析系統都是使用該方案。數據預警平臺及數據分析場景
例如電商價格預警,在支持的電商平臺設置價格預警,當優惠的價格低於某個值時,觸發通知消息,通知用戶購買。
數據分析常見的比如分析電商平臺銷售量top 10的品牌,分析博客系統、頭條網站top 10關注度、評論數、訪問量的內容等等。商業BI系統
比大型零售超市,需要分析上一季度用戶消費金額,年齡段,每天各時間段到店人數分佈等信息,輸出相應的報表數據,並預測下一季度的熱賣商品,根據年齡段定向推薦適宜產品。Elasticsearch執行數據分析和挖掘,Kibana做數據可視化。
常見案例
- 維基百科、百度百科:有全文檢索、高亮、搜索推薦功能
- stack overflow:有全文檢索,可以根據報錯關鍵信息,去搜索解決方法。
- github:從上千億行代碼中搜索你想要的關鍵代碼。
- 日誌分析系統:各企業內部搭建的ELK平臺。
- 等等
Elasticsearch的架構圖
架構各組件簡單釋義:
- gateway 底層存儲系統,一般爲文件系統,支持多種類型。
- distributed lucence directory 基於lucence的分佈式框架,封裝了建立倒排索引、數據存儲、translog、segment等實現。
- 模塊層 ES的主要模塊,包含索引模塊、搜索模塊、映射模塊。
- Discovery 集羣node發現模塊,用於集羣node之間的通信,選舉coordinate node操作,支持多種發現機制,如zen,ec2等。
- script 腳本解析模塊,用來支持在查詢語句中編寫的腳本,如painless,groovy,python等。
- plugins 第三方插件,各種高級功能可由插件提供,支持定製。
- transport/jmx 通信模塊,數據傳輸,底層使用netty框架
- restful/node 對外提供的訪問Elasticsearch集羣的接口
- x-pack elasticsearch的一個擴展包,集成安全、警告、監視、圖形和報告功能,無縫接入,可插拔設計。
Elasticsearch安裝使用
官網地址
https://www.elastic.co/cn/
上面有各版本的下載地址,官方文檔和使用示例,請自行下載安裝包。
源碼地址
https://github.com/elastic/elasticsearch
上面有各版本的源碼地址,可以切換到指定版本進行研究,目前選用版本爲6.3.1
安裝步驟
- 環境要求
JDK 1.8及以上 - 官網下載安裝包,在指定目錄下直接解壓
- 執行bin/elasticsearch(Linux,注意不能使用root賬戶)
bin\elasticsearch.bat(Windows) - curl http://localhost:9200/或瀏覽器打開http://localhost:9200/地址,看到下面的響應表示啓動成功:
{
"name" : "node-1",
"cluster_name" : "hy-application",
"cluster_uuid" : "lJ4DRWOvQauAy-VEYiZc2g",
"version" : {
"number" : "6.3.1",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "eb782d0",
"build_date" : "2018-06-29T21:59:26.107521Z",
"build_snapshot" : false,
"lucene_version" : "7.3.1",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
- kibana下載解壓啓動
執行bin/kibana(Linux,注意不能使用root賬戶)或bin\kibana.bat(Windows),如果kibana和elasticsearch部署在同一臺機器上,使用默認的配置文件即可。 - 驗證kibana,瀏覽器上輸入http://192.168.17.137:5601/,出現如下界面表示啓動成功:
圖二
小結
本篇簡單介紹了Elasticsearch的基本概念,適用場景和主要的功能框架,以及最簡單的用於學習驗證的安裝啓動步驟,作爲Elasticsearch系統的開篇學習,Elasticsearch有個特點就是開箱即用,如果是用作學習,或是中小型應用,數據量比較少、操作不是很複雜的話,直接啓動就可以用了。後續的Elasticsearch學習,如無特別說明,均以6.3.1版本爲例。
專注Java高併發、分佈式架構,更多技術乾貨分享與心得,請關注公衆號:Java架構社區