ElasticStack系列之八 _source 字段
有很多人會有這樣的一個疑問:
_source字段存儲的是索引的原始內(nèi)容,那 store 屬性的設置是為何呢?elasticsearch 為什么要把 store 的默認取值設置為 no?設置為 yes 是否是重復的存儲呢?
我們將一個 field 的值寫入 elasticsearch 中,是想在這個 field 上執(zhí)行 search 操作。但是,如果不顯式的將該 field 的 store 屬性設置為yes,同時 _source 字段 enabled 的情況下,你仍然可以獲取到這個 field 的值。這就意味著在一些情況下讓一個 field 不被 index 或者 store 仍然是有意義的。當你將一個field的store屬性設置為true,這個會在lucene層面處理。
elasticsearch 并不需要你單獨存儲需要返回的每一個 field 的值,因為默認情況下每一個文檔的的完整信息都已經(jīng)存儲了(存儲在_source字段中),因此可以跟隨查詢結果返回你想要的所有 field值。有一些情況下,顯式的存儲某些field的值是必須的:
> 當 _source 被 disabled 的時候,或者你并不想從 source 中 parser 來得到 field 的值(即使這個過程是自動的)
請記住:從每一個stored field中獲取值都需要一次磁盤io,如果想獲取多個field的值,就需要多次磁盤io,但是,如果從_source中獲取多個field的值,則只需要一次磁盤io,因為_source只是一個字段而已。所以在大多數(shù)情況下,從_source中獲取是快速而高效的。
elasticsearch 中默認的設置 _source 是 enable 的,存儲整個文檔的值。這意味著在執(zhí)行 search 操作的時候可以返回整個文檔的信息。如果不想返回這個文檔的完整信息,也可以指定要求返回的 field,elasticsearch 會自動從 _source 中抽取出指定 field 的值返回。
你可以指定一些字段 store 為 true,這意味著這個field的數(shù)據(jù)將會被單獨存儲。這時候,如果你要求返回 field1(store:yes),es會分辨出 field1 已經(jīng)被存儲了,因此不會從 _source 中加載,而是從 field1 的存儲塊中加載。
哪些情形下需要顯式的指定store屬性呢?
大多數(shù)情況并不是必須的。從 _source 中獲取值是快速而且高效的。如果你的文檔長度很長,存儲 _source 或者從 _source 中獲取 field 的代價很大,你可以顯式的將某些 field 的 store 屬性設置為 yes。
優(yōu)點是只查詢這一個字段的值的話效率高;
缺點如上邊所說:假設你存儲了10個 field,而如果想獲取這10個 field的值,則需要多次的 io,
如果從_source中獲取則只需要一次,而且_source是被壓縮過的。
總結:
如果對某個 field 做了索引,則可以查詢。如果 store:yes,則可以展示該field的值。
但是如果你存儲了這個doc的數(shù)據(jù)(_source enable),即使 store 為 no,仍然可以得到field的值(client去解析)。
所以一個store設置為 no 的 field,如果 _source 被 disable,則只能檢索不能展示。
轉載于:https://www.cnblogs.com/liang1101/p/7282809.html
總結
以上是生活随笔為你收集整理的ElasticStack系列之八 _source 字段的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue2+VueRouter2+webp
- 下一篇: uva 753(网络流最大流)