倒排索引存儲-分段存儲(lucene的功能)
在lucene中:lucene index包含了若干個segment
在elasticsearch中:index包含了若干主從shard,shard包乾了若干segment
segment是elasticsearch中存儲的最小文件單元,也就是分段存儲,segment被設計爲不可變的
新增:新建立索引時,新建一個segment存儲新的數據
刪除:因爲segment是隻讀的,因此在索引文件中新增了.del文件,專門存儲被刪除的數據id,當查詢時被刪除的數據仍能被查詢,進行查詢結果合併時纔會過濾掉,merge segment時會真正刪除
更新:新增和刪除的組合
segment的不可變性的優勢服務器
segment的不可變性的缺點異步
新增數據的過程jvm
這個流程的目的是:提高寫入性能(異步落盤)elasticsearch
一、保存到index buffer中,同時寫入Transaction log(防止內存的數據丟失,有點想redo log)性能
二、當index buffer空間滿了(默認佔用jvm10%)或每1秒(經過index.refresh_interval 配置)執行Refresh操做,寫入segment並清空index buffer(這裏的1秒內是查不到剛保存的數據的,因此es也被成爲近實時的搜索引擎)搜索引擎
三、於此同時將segment刷入內存,開放查詢設計
四、flush操做將segment寫入磁盤(默認30分鐘執行一次)blog
flash操做包含:索引