0、故事引入
無意中看到了ES的mapping中有store字段,作為一個ES菜雞,有必要對這個字段進行下筆記。
1、_source
_source字段我在們進行檢索時相當重要,
ES默認檢索只會返回ID,如果在{"enabled":false}情況下,你需通過根據這個ID去去倒排索引中去取每個Field數據,效率不高。
而反之,在{"enabled":true}的情況下可以根據ID直接檢索對應source JSON的字段,不用去倒排索引去按Field取數據。
盡管_source
非常有用, 但它確實會占用索引的存儲空間, 所以也可以禁用(enabled false)、啟用狀態的壓縮策略(compress)。
壓縮的策略有兩類:
- compress:是否進行壓縮,建議一般情況下將其設為true
- "includes" : ["author", "name"], "excludes" : ["sex"]
2、store
默認為no,
如果在{"store":yes}的情況下,ES會對該字段單獨存儲倒排索引,每次根據ID檢索的時候,會多走一次IO來從倒排索引取數據。
而如果_source enabled 情況下,ES可以直接根據Client類來解析_source JSON,只需一次IO就將所有字段都檢索出來了。
{"store":yes}既然這么費力不討好,但是仍然有兩個應用場景:
- 文檔很長,檢索所有文檔或者存儲所有文檔、獲取所有field的代價比較大
- 僅僅針對某幾個字段進行re-index的時候
3、總結
_source\store | yes | no |
enabled | store為yes的字段從倒排索引里檢索, 浪費IO次數 |
所有字段根據Client類解析實現存儲的JSON串 僅需一次IO |
disabled | store為yes的字段從倒排索引里檢索, 其他字段能檢索不能展示 |
所有字段只能檢索,不能展示 |
PS. 索引后-->可查詢檢索,存儲后-->可展示