一免都、Elastic Search概述:
1.1 Elastic Search 簡介
Elastic Search(ES)是一個基于Lucene構(gòu)建的開源放妈、分布式适袜、RESTFul接口全文搜索引擎兑凿。ES還是一個分布式文檔庫谈为,其中每個字段均是被索引的 數(shù)據(jù)且可被搜索湾揽,它能夠擴(kuò)展至數(shù)以百計的服務(wù)器存貯以及處理PB級的數(shù)據(jù)瓤逼,它可以在短時間內(nèi)存儲、搜索和分析大量的數(shù)據(jù)钝腺。
Elastic Search的主要特點
1.橫向可擴(kuò)展性抛姑。增加一臺機(jī)器,只需要添加集群配置艳狐,啟動Elastic Search進(jìn)行即可定硝;
2.分片機(jī)制。一個索引可以分成多個Sharding毫目,提高處理效率蔬啡;
3.高可用性诲侮。每個分片可以設(shè)置多個備份,少量機(jī)器宕機(jī)不影響正常使用箱蟆;
1.1 Lucene簡介
Lucene是Apache軟件基金會中的一個開源代碼的全文搜索引擎工具包沟绪,方便實現(xiàn)全文檢索的功能。 Lucene是倒敘排序索引空猜,即由屬性的值來確定記錄的位置绽慈,而不是由記錄來確定屬性值。
舉例(轉(zhuǎn)自:《Elasticsearch技術(shù)解析與實戰(zhàn)》):
字典樹采取trie樹和DAT樹辈毯,這部分待完善...
1.2 Lucene的核心結(jié)構(gòu):
Lucene將上面的三列分別作為詞典文件(Term Dictionary)坝疼、頻率文件(frequencies)、位置文件(positions)保存谆沃,其中詞典文件保存了指向頻率文件和文件位置的指針钝凶,通過指針可以找到該關(guān)鍵字的頻率信息和位置信息。
總結(jié)socre評分有如下四個原則:
1.搜索詞出現(xiàn)次數(shù)越多唁影,得分越高耕陷;
2.搜索詞在整個索引中出現(xiàn)次數(shù)越少,得分越高据沈;
3.搜索字段中所有詞語數(shù)量越少哟沫,得分越高;
4.搜索詞和中的某一條數(shù)據(jù)匹配字段越多锌介,得分越高南用。
1.3 ES的的術(shù)語說明:
Elastic Search和mysql的對應(yīng)關(guān)系
MySql | Elastic Search |
---|---|
database | index |
table | type |
row | document |
cloumn | field |
schema | mapping |
index | Everything is indexed |
SQL | query DSL |
slect * from... | get http://... |
update talbe set... | put http://... |
二.集群內(nèi)部結(jié)構(gòu)
ES是主從模式設(shè)計
2.1 主節(jié)點(Master node)
主節(jié)點負(fù)責(zé)集群的相關(guān)操作,管理集群變更掏湾,且全局唯一裹虫,一般采用主節(jié)點和數(shù)據(jù)節(jié)點分離的部署架構(gòu)。為防止數(shù)據(jù)丟失融击,每個主節(jié)點要知道哪些從節(jié)點有資格成為主節(jié)點的數(shù)量筑公。
2.2 數(shù)據(jù)節(jié)點(Data node)
負(fù)責(zé)保存數(shù)據(jù),執(zhí)行數(shù)據(jù)相關(guān)的操作尊浪,一般情況下(特殊除外)匣屡,數(shù)據(jù)讀寫只和數(shù)據(jù)節(jié)點交互,不會和主節(jié)點打交道拇涤。
當(dāng)增加和刪除節(jié)點時捣作,即水平擴(kuò)容,會觸發(fā)rebalance操作鹅士。
數(shù)據(jù)的路由:
shard = hash(routing) % primary_shard_count
routing默認(rèn)值是document_id的
2.3 預(yù)處理節(jié)點(ingest node,5.0版本引入)
在索引寫入數(shù)據(jù)之前券躁,通過事先定義好的processors和pipeline,對數(shù)據(jù)進(jìn)行轉(zhuǎn)換、富化也拜。processors和pipeline攔截bulk和index請求以舒,在應(yīng)用相關(guān)操作后,將文檔傳回給index或bulk API慢哈。
2.4 協(xié)調(diào)節(jié)點(Coordinating node)
協(xié)調(diào)節(jié)點將請求轉(zhuǎn)發(fā)給Data node,每個Data node在本地執(zhí)行請求蔓钟,并返回給協(xié)調(diào)節(jié)點,協(xié)調(diào)節(jié)點將每個Data node的結(jié)果收集卵贱、合并甚至排序為單個全局結(jié)果滥沫,因此協(xié)調(diào)節(jié)點需要較多的CPU和內(nèi)存資源。
數(shù)據(jù)寫入過程:
數(shù)據(jù)寫入的consistency參數(shù):
quorum(默認(rèn)):
要求大部分的shard是活躍的键俱,那么寫入操作可執(zhí)行佣谐。
quorum = int((primary_count+number_of_replica) /2 ) + 1
當(dāng)quorum個數(shù)不夠時,默認(rèn)等待一分鐘方妖,如果一分鐘內(nèi)quorum個數(shù)仍然不夠才不再執(zhí)行。
one:
只要有一個primary shard是活躍的罚攀,那么寫入操作可執(zhí)行党觅。
all:
當(dāng)所有shard是活躍的(primary shard + replica shard),那么寫入操作才可執(zhí)行斋泄。
數(shù)據(jù)查詢的timeout參數(shù):
timeout機(jī)制杯瞻,指定每個shard只能在timeout時間內(nèi)(默認(rèn)無timeout限制),將檢索到的結(jié)果(可能只有一部分)返回給client炫掐,而不是等所有查詢結(jié)果全部搜索出來再返回魁莉,避免搜索時間過長,影響用戶體驗募胃。