索引原理
磁碟io與預讀
倒排索引
fst索引是加速資料查詢的重要手段,其核心原理是通過不斷的縮小想要獲取資料的範圍來篩選出最終想要的結果,同時把隨機的事件變成順序的事件。也就是說,有了這種索引機制,我們可以總是用同一種查詢方式來鎖定資料。
磁碟io程式設計中非常高昂的操作,也是影響程式效能的重要因素,因此應當盡量避免過多的磁碟io,有效的利用記憶體可以大大的提公升程式的效能。在作業系統層面,發生一次io時,不光把當前磁碟位址的資料,而是把相鄰的資料也都讀取到記憶體緩衝區內,區域性預讀性原理告訴我們,當計算機訪問乙個位址的資料的時候,與其相鄰的資料也會很快被訪問到。每一次io讀取的資料我們稱之為一頁(page)。具體一頁有多大資料跟作業系統有關,一般為4k或8k,也就是我們讀取一頁內的資料時候,實際上才發生了一次io,這個理論對於索引的資料結構設計非常有幫助。
當資料寫入 es 時,資料將會通過分詞被切分為不同的term,es 將 term 與其對應的文件列表建立一種對映關係,這種結構就是倒排索引。如下圖所示:
為了進一步提公升索引的效率,es 在 term 的基礎上利用 term 的字首或者字尾構建了 term index, 用於對 term 本身進行索引,es 實際的索引結構如下圖所示:
當資料量不斷增長,記憶體中無法儲存完整的 term index,此時必須將資料儲存再磁碟上,這樣就增加了對磁碟的io操作。為了盡量多的將 term index 載入到記憶體中,es 採用了 fst 資料結構對 term index 進行壓縮。fst 資料結構有兩個優點:1)空間占用小。通過對詞典中單詞字首和字尾的重複利用,壓縮了儲存空間;2)查詢速度快,o(len(str))字元長度的查詢時間複雜度。當使用fst插入cat、deep、do、dog、dogs等詞時過程如下:
es 父子查詢 es父子文件建立查詢
一 準備 1,elasticsearch 5.6.9 2,kibana 5.6.9 3,jdk1.8 二 建立索引,文件 1建立資料庫put database?pretty station stationname 三 填充資料 插入父文件一條記錄 插入id 1的6路post database lin...
ES 父子文件查詢
1.父 子文件是完全獨立的。2.父文件更新不會影響子文件。3.子文件更新不會影響父文件或者其它子文件。put company 父文件 type employee 2.父文件的索引和普通文件索引一樣。post company branch bulk 3.子文件索引必須指定其對應的父文件 id,作用 p...
ES系列 按時段查詢資料
今天遇到乙個問題,es裡有個date欄位,儲存的是2020 12 28t16 16 22.000z日期 時間,現在有個查詢任意時段內的資料,不考慮日期,例如,查詢08 10 00到18 00 00之間的資料。這種情況下,可以使用script進行查詢或過濾。查詢語句 上面只是示例,這裡使用second...