es store詳解
眾所周知_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的需求)。