2013-05-13 35 views
24

兩者之間的區別,誰擁有所有的領域,沒有我。Elasticsearch中_source和_all之間的區別是什麼

如果我的文件有:

{"mydoc": 
    {"properties": 
     {"name":{"type":"string","store":"true"}}, 
     {"number":{"type":"long","store":"false"}}, 
     {"title":{"type":"string","include_in_all":"false","store":"true"}} 

    } 
} 

據我所知,_source是具有所有字段的字段。但是_all呢? 這是否意味着「名稱」被多次保存(兩次?在_src和_all中),增加了文檔佔用的磁盤空間?

是否爲該字段存儲一次「名稱」,曾存儲過_source,以及存儲過一次_all? 「數字」是什麼,他是否存儲在所有,即使不在_source?

什麼時候應該在查詢中使用_source,何時_all?

什麼是我可以禁用「_all」的用例,然後什麼功能會被拒絕我?

回答

43

這與在lucene中索引字段和存儲字段之間的區別幾乎相同。

當您希望搜索它們時,您可以使用索引字段,同時存儲要作爲搜索結果返回的字段。

_source字段旨在存儲最初發送給elasticsearch的整個源文檔。它被用作搜索結果,被檢索。你無法搜索它。實際上它是一個存儲在lucene中的字段,並且未被索引。

_all字段用於索引來自您的文檔所組成的所有字段的所有內容。您可以搜索它,但不會返回它,因爲它已編入索引,但未存儲在lucene中。

沒有冗餘,這兩個字段是針對不同的用例,並存儲在lucene索引中的不同位置。 _all字段成爲我們稱爲倒排索引的一部分,用於索引文本並能夠對其執行全文搜索,而_source字段僅作爲lucene文檔的一部分存儲。

只有當您返回結果時,纔會在查詢中使用_source字段,因爲這是缺省情況下elasticsearch返回的結果。有一些功能取決於_source字段,如果您禁用它,則會丟失。其中之一是update API。此外,如果您禁用它,則需要記住在映射中將所有要作爲搜索結果返回的字段配置爲store:yes。我寧願說,除非它困擾你,否則不要禁用它,因爲它在很多情況下都非常有用。另一個常見用例是當你需要重新索引你的數據時;您可以從elasticsearch本身檢索所有文檔,並將其重新發送到另一個索引。

另一方面,_all字段只是一個默認捕獲所有字段,當您只想搜索所有可用字段並且您不想在查詢中指定它們時,可以使用該字段。這很方便,但我不會過多地依賴它,因爲在不同的字段上運行更復雜的查詢會更好,每個字段的權重也不盡相同。如果你不使用它,你可能想要禁用它,這在我看來會比禁用_source的影響小。

+0

謝謝! 如果我設置一個字段爲「索引」:「不」,它仍然出現在「_all」中,對不對? 因此,如果我無意一次對多個指定字段進行全文搜索,那麼在所有字段中將「include_in_all」設置爲false將節省空間,對吧? – eran 2013-05-13 16:04:28

+1

與此同時,我在回答中增加了更多的想法。 '_all'字段默認設置爲'「index」:yes',並且與其他字段的映射無關,如果不使用'include_in_all'選項。如果你不使用'_all'字段,我會完全禁用它,而不是將所有字段設置爲''include_in_all「:false'。 – javanna 2013-05-13 16:24:30

+0

謝謝,將禁用'_all'字段保存可觀的磁盤空間? (它看起來似乎幾乎使需要的空間增加一倍,直觀) – eran 2013-05-13 17:39:55

相關問題