elasticsearch的store屬性 vs _source字段


眾所周知_source字段存儲的是索引的原始內容,那store屬性的設置是為何呢?es為什么要把store的默認取值設置為no?設置為yes是否是重復的存儲呢? 

 

我們將一個field的值寫入es中,要么是想在這個field上執行search操作(不知道具體的id),要么執行retrieve操作(根據id來 檢索)。但是,如果不顯式的將該field的store屬性設置為yes,同時_source字段enabled的情況下,你仍然可以獲取到這個 field的值。這就意味着在一些情況下讓一個field不被index或者store仍然是有意義的。 

 

當你將一個field的store屬性設置為true,這個會在lucene層面處理。lucene是倒排索引,可以執行快速的全文檢索,返回符合檢索條 件的文檔id列表。在全文索引之外,lucene也提供了存儲字段的值的特性,以支持提供id的查詢(根據id得到原始信息)。通常我們在lucene層 面存儲的field的值是跟隨search請求一起返回的(id+field的值)。es並不需要存儲你想返回的每一個field的值,因為默認情況下每 一個文檔的的完整信息都已經存儲了,因此可以跟隨查詢結構返回你想要的所有field值。 

 

有一些情況下,顯式的存儲某些field的值是必須的:當_source被disabled的時候,或者你並不想從source中parser來得到 field的值(即使這個過程是自動的)。請記住:從每一個stored field中獲取值都需要一次磁盤io,如果想獲取多個field的值,就需要多次磁盤io,但是,如果從_source中獲取多個field的值,則只 需要一次磁盤io,因為_source只是一個字段而已。所以在大多數情況下,從_source中獲取是快速而高效的。 

 

es中默認的設置_source是enable的,存儲整個文檔的值。這意味着在執行search操作的時候可以返回整個文檔的信息。如果不想返回這個文 檔的完整信息,也可以指定要求返回的field,es會自動從_source中抽取出指定field的值返回(比如說highlighting的需求)。 

 

你可以指定一些字段store為true,這意味着這個field的數據將會被單獨存儲。這時候,如果你要求返回field1(store:yes),es會分辨出field1已經被存儲了,因此不會從_source中加載,而是從field1的存儲塊中加載。  
 
哪些情形下需要顯式的指定store屬性呢?大多數情況並不是必須的。從_source中獲取值是快速而且高效的。如果你的文檔長度很長,存儲 _source或者從_source中獲取field的代價很大,你可以顯式的將某些field的store屬性設置為yes。缺點如上邊所說:假設你存 儲了10個field,而如果想獲取這10個field的值,則需要多次的io,如果從_source中獲取則只需要一次,而且_source是被壓縮過 的。 
 
還有一種情形:reindex from some field,對某些字段重建索引的時候。從source中讀取數據然后reindex,和從某些field中讀取數據相比,顯然后者代價更低一些。這些字段store設置為yes比較合適。

  

總結:

 如果對某個field做了索引,則可以查詢。如果store:yes,則可以展示該field的值。

 但是如果你存儲了這個doc的數據(_source enable),即使store為no,仍然可以得到field的值(client去解析)。

 所以一個store設置為no 的field,如果_source被disable,則只能檢索不能展示。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM