Elasticsearch 文檔索引過(guò)程描述
1.協(xié)調(diào)節(jié)點(diǎn)默認(rèn)使用文檔ID參與計(jì)算(也支持通過(guò)routing)硕舆,以便為路由提供合適的分片秽荞。
shard = hash(document_id) % (num_of_primary_shards)
2.當(dāng)分片所在的節(jié)點(diǎn)接收到來(lái)自協(xié)調(diào)節(jié)點(diǎn)的請(qǐng)求后,會(huì)將請(qǐng)求寫(xiě)入到Memory Buffer抚官,然后定時(shí)(默認(rèn)是每隔1秒)寫(xiě)入到Filesystem Cache扬跋,這個(gè)從Momery Buffer到Filesystem Cache的過(guò)程就叫做refresh;
3.當(dāng)然在某些情況下揖盘,存在Momery Buffer和Filesystem Cache的數(shù)據(jù)可能會(huì)丟失弦聂,ES是通過(guò)translog的機(jī)制來(lái)保證數(shù)據(jù)的可靠性的逾柿。其實(shí)現(xiàn)機(jī)制是接收到請(qǐng)求后,同時(shí)也會(huì)寫(xiě)入到translog中朴上,當(dāng)Filesystem cache中的數(shù)據(jù)寫(xiě)入到磁盤(pán)中時(shí),才會(huì)清除掉卒煞,這個(gè)過(guò)程叫做flush痪宰。
4.在flush過(guò)程中,內(nèi)存中的緩沖將被清除,內(nèi)容被寫(xiě)入一個(gè)新段衣撬,段的fsync將創(chuàng)建一個(gè)新的提交點(diǎn)乖订,并將內(nèi)容刷新到磁盤(pán),舊的translog將被刪除并開(kāi)始一個(gè)新的translog具练。
5.flush觸發(fā)的時(shí)機(jī)是定時(shí)觸發(fā)(默認(rèn)30分鐘)或者translog變得太大(默認(rèn)為512M)時(shí)乍构。
Update和Delete實(shí)現(xiàn)原理
刪除和更新操作也是寫(xiě)操作。但是扛点,Elasticsearch中的文檔是不可變的(immutable)哥遮,因此不能刪除或修改。那么陵究,如何刪除/更新文檔呢昔善??
磁盤(pán)上的每個(gè)分段(segment)都有一個(gè).del文件與它相關(guān)聯(lián)。當(dāng)發(fā)送刪除請(qǐng)求時(shí)畔乙,該文檔未被真正刪除君仆,而是在.del文件中標(biāo)記為已刪除。此文檔可能仍然能被搜索到牲距,但會(huì)從結(jié)果中過(guò)濾掉返咱。當(dāng)分段合并時(shí)(我們將在后續(xù)的帖子中包括段合并),在.del文件中標(biāo)記為已刪除的文檔不會(huì)被包括在新的合并段中牍鞠。?
現(xiàn)在咖摹,我們來(lái)看看更新是如何工作的。創(chuàng)建新文檔時(shí)难述,Elasticsearch將為該文檔分配一個(gè)版本號(hào)萤晴。對(duì)文檔的每次更改都會(huì)產(chǎn)生一個(gè)新的版本號(hào)。當(dāng)執(zhí)行更新時(shí)胁后,舊版本在.del文件中被標(biāo)記為已刪除店读,并且新版本在新的分段中編入索引。舊版本可能仍然與搜索查詢(xún)匹配攀芯,但是從結(jié)果中將其過(guò)濾掉屯断。?
indexed/updated文檔后,我們希望執(zhí)行搜索請(qǐng)求侣诺。我們來(lái)看看如何在Elasticsearch中執(zhí)行搜索請(qǐng)求殖演。
Read的實(shí)現(xiàn)原理
讀操作由兩個(gè)階段組成:查詢(xún)階段(Query Phase)和獲取階段(Fetch Phase)
1.查詢(xún)階段(Query Phase)
????在此階段,協(xié)調(diào)節(jié)點(diǎn)將搜索請(qǐng)求路由到索引(index)中的所有分片(shards)(包括:主節(jié)點(diǎn)或副本)年鸳。分片獨(dú)立執(zhí)行搜索趴久,并根據(jù)相關(guān)性分?jǐn)?shù)創(chuàng)建一個(gè)優(yōu)先級(jí)排序結(jié)果(稍后我們將介紹相關(guān)性分?jǐn)?shù))。所有分片將匹配的文檔和相關(guān)分?jǐn)?shù)的文檔ID返回給協(xié)調(diào)節(jié)點(diǎn)搔确。協(xié)調(diào)節(jié)點(diǎn)創(chuàng)建一個(gè)新的優(yōu)先級(jí)隊(duì)列彼棍,并對(duì)全局結(jié)果進(jìn)行排序已添。可以有很多文檔匹配結(jié)果滥酥,但默認(rèn)情況下更舞,每個(gè)分片將前10個(gè)結(jié)果發(fā)送到協(xié)調(diào)節(jié)點(diǎn),協(xié)調(diào)創(chuàng)建優(yōu)先級(jí)隊(duì)列坎吻,從所有分片中分選結(jié)果并返回前10個(gè)匹配缆蝉。
2.獲取階段(Fetch Phase)
在協(xié)調(diào)節(jié)點(diǎn)對(duì)所有結(jié)果進(jìn)行排序,已生成全局排序的文檔列表后瘦真,它將從所有分片請(qǐng)求原始文檔刊头。?
所有的分片都會(huì)豐富文檔并將其返回到協(xié)調(diào)節(jié)點(diǎn)。?
搜索相關(guān)性(Search Relevance)
相關(guān)性由Elasticsearch給予搜索結(jié)果中返回的每個(gè)文檔的分?jǐn)?shù)確定诸尽。用于評(píng)分的默認(rèn)算法為tf / idf(術(shù)語(yǔ)頻率/逆文檔頻率)原杂。該術(shù)語(yǔ)頻率測(cè)量術(shù)語(yǔ)出現(xiàn)在文檔中的次數(shù)(更高頻率=更高的相關(guān)性),逆文檔頻率測(cè)量術(shù)語(yǔ)在整個(gè)索引中出現(xiàn)的頻率占索引中文檔總數(shù)的百分比(更高的頻率 ==較少的相關(guān)性)您机。最終得分是tf-idf分?jǐn)?shù)與其他因素(如詞語(yǔ)鄰近度(短語(yǔ)查詢(xún)))穿肄,術(shù)語(yǔ)相似度(用于模糊查詢(xún))等的組合。