es的store屬性詳解
總結:es在儲存資料的時候發吧json物件儲存到"_source"欄位裡,如果index 屬性設定了 analyzed 會做一個倒排表方便查詢。可以理解_source 就是資料庫裡的一條記錄(可以選著不存),index就是存索引資訊的(可以選著不索引)。
轉自:https://www.jeeboot.com/archives/1499.html
使用 elasticsearch 時碰上了很迷惑的地方,我看官方文件說 store 預設是 no ,我想當然的理解為也就是說這個 field 是不會 store 的,但是查詢的時候也能查詢出來,經過查詢資料瞭解到原來 store 的意思是,是否在 _source 之外在獨立儲存一份,這裡要說一下 _source 這是源文件,當你索引資料的時候, elasticsearch 會儲存一份源文件到 _source ,如果文件的某一欄位設定了 store 為 yes (預設為 no),這時候會在 _source 儲存之外再為這個欄位獨立進行儲存,這麼做的目的主要是針對內容比較多的欄位,放到 _source 返回的話,因為_source 是把所有欄位儲存為一份文件,命中後讀取只需要一次 IO,包含內容特別多的欄位會很佔頻寬影響效能,通常我們也不需要完整的內容返回(可能只關心摘要),這時候就沒必要放到 _source 裡一起返回了(當然也可以在查詢時指定返回欄位)。
對內容太長的欄位,將 store 設定為 yes ,一般來說還應該在 _source 排除 exclude 掉這個欄位,這時候索引的欄位,不會儲存在 _source 裡了,會獨立儲存一份,查詢時 _source 裡也沒有這個欄位了,但是還是可以通過指定返回欄位來獲取,但是會有額外的 IO 開銷,因為 _source 的讀取只有一次 IO ,而已經 exclude 並設定 store 的欄位,是獨立儲存的需要一個新的 IO 。
值得注意的是,雖然這個欄位沒有儲存在 _source 了,但是這個欄位還是可以 match 和高亮的。當然如果 _source 不儲存,並且 store 也為 no 這時候,資料就不會返回了,也不能高亮了。但是還是可以 match 的,前提是這個欄位對映時 index 屬性設定了 analyzed ,lucence 對這個欄位建立了倒排索引。如果 index 設定為 no 這時候等於就是沒有對映這個欄位了,既不能查詢,也不能得到返回。設定為 not_analyzed 不會建立倒排索引,但是可以被查詢到