搜索功能
使用傳統(tǒng)關(guān)系型數(shù)據(jù)庫做搜索存在:性能差(模糊查詢可能會(huì)索引失效)、不可靠、結(jié)果不準(zhǔn)確(相關(guān)度低)等問題,為解決這類問題,可以使用ES來處理搜索請(qǐng)求。ES的核心是倒排索引
倒排索引 數(shù)據(jù)結(jié)構(gòu)
- 包含這個(gè)關(guān)鍵詞的document list
- 關(guān)鍵詞在每個(gè)doc中出現(xiàn)的次數(shù)(詞頻) TF(term frequency)
- 關(guān)鍵詞在整個(gè)索引中出現(xiàn)的次數(shù) IDF (inverse doc frequency)
- 關(guān)鍵詞在當(dāng)前doc中出現(xiàn)的次數(shù)
- 每個(gè)doc的長度,越長相關(guān)度越低
- 包含這個(gè)關(guān)鍵詞的所有doc的平均長度
Lucene
Lucene是一個(gè)jar包,幫我們創(chuàng)建倒排索引,提供復(fù)雜的API。Lucene是單點(diǎn)的,擴(kuò)展相對(duì)復(fù)雜。
Elasticsearch
- 基于Lucene開發(fā)的分布式的搜索,存儲(chǔ)和數(shù)據(jù)分析引擎
- 優(yōu)點(diǎn):
1. 面向開發(fā)者友好,屏蔽了Lucene的復(fù)雜性,集群自動(dòng)發(fā)現(xiàn)
2. 自動(dòng)維護(hù)數(shù)據(jù)在多個(gè)節(jié)點(diǎn)上的建立
3. 請(qǐng)求負(fù)載均衡
4. 自動(dòng)維護(hù)冗余副本,部分節(jié)點(diǎn)宕機(jī)數(shù)據(jù)不會(huì)丟失
5. 提供高級(jí)功能,符合查詢,聚合分析,基于地理位置等
6. 開箱即用,也可構(gòu)建大型分布式集群,處理PB級(jí)數(shù)據(jù)
7. 提供全文檢索,同義詞處理,相關(guān)度排名,海量數(shù)據(jù)近實(shí)時(shí)處理 - 應(yīng)用領(lǐng)域
1. 百度(全文檢索,高亮,搜索推薦)
2.用戶行為日志(用戶點(diǎn)擊、瀏覽、收藏、評(píng)論)
3. BI (business intelligence)商業(yè)智能,數(shù)據(jù)挖掘統(tǒng)計(jì)
4. ELK (Elasticsearch 數(shù)據(jù)存儲(chǔ) + Logstash 日志采集 + Kibana 可視化)
ES核心概念
- Cluster(集群):每個(gè)集群至少包含兩個(gè)節(jié)點(diǎn)
- Node(節(jié)點(diǎn)):集群中的每個(gè)節(jié)點(diǎn),一個(gè)節(jié)點(diǎn)不代表一臺(tái)服務(wù)器
- Field(字段): 一個(gè)數(shù)據(jù)字段,與index和type一起,可以定位一個(gè)doc
- Document (文檔):ES最小的數(shù)據(jù)單元 是json格式
- Type:邏輯上的數(shù)據(jù)分類,es 7.x中刪除了type的概念
- Index:一類相同或者類似的doc,比如一個(gè)員工索引,商品索引
Shard分片:
- 一個(gè)index包含多個(gè)Shard,默認(rèn)5個(gè)Primay,默認(rèn)每個(gè)Primay分配一個(gè)Replica,Primay的數(shù)量在創(chuàng)建索引的時(shí)候設(shè)置,如果想修改,需要重建索引。
- 每個(gè)Shard都是一個(gè)Lucene實(shí)例,有完整的創(chuàng)建索引的處理請(qǐng)求能力。
- ES會(huì)自動(dòng)在nodes上為我們做shard 均衡。
- 一個(gè)doc是不可能同時(shí)存在于多個(gè)PShard中的,但是可以存在于多個(gè)RShard中。
- Primay和對(duì)應(yīng)的Replica不能同時(shí)存在于同一個(gè)節(jié)點(diǎn),所以最低的可用配置是兩個(gè)節(jié)點(diǎn),互為主備。