2013-11-28 159 views
5

具有屬性的任意數量的對象我有一個給定的文檔:映射在elasticsearch

{ 
    "foo": {} 
} 

foo其中可具有的任意屬性的量。讓我們假設我將導入數百萬個文件到我的索引中,其中foo的每個屬性都有其他值。

這意味着我將動態構建的映射將變得非常龐大。有沒有一種方式,我可以告訴elasticsearch像

帶你在foo,只是接受它,因爲它是一切(或字符串化foo),而無需導致百萬行映射???

還是在編制索引文件之前我必須自己照顧?

如果如此,有一個2的解決方案,我認爲

  1. JSON.stringifyfoo

  2. 地圖的每個屬性在foo成鍵/值對,並創建對象的數組:

    // object 
    { 
        "foo": [ 
        {"key": "bar1", "value": "bar1's value"}, 
        {"key": "bar2", "value": "bar2's value"} 
        ] 
    } 
    
    // resulting mapping 
    { 
        "type": { 
        "properties": { 
         "foo": { 
         "properties": { 
          "key": { 
          "type": "string" 
          }, 
          "value": { 
          "type": "string" 
          } 
         } 
         } 
        } 
        } 
    } 
    

你願意然後解決方案1 ​​o 2,爲什麼?

感謝您的幫助!

回答

3

您無法使Elasticsearch爲您進行字符串化。你可以忽略「foo」中的所有內容,它將成爲「_source」的一部分,但是它根本無法被搜索到。

第二種方法可以有很大的意義,取決於你將如何查詢它,以及你可以知道你將接受的值的種類。

有一個在Dynamic Type with Mappings一個相關的問題描述這種方法,在這裏可運行的例子:https://www.found.no/play/gist/7596633

的想法是,你必須每值一個嵌套的文件。如果每個文檔的值數量不是很大,那麼效果很好。如果您不使用嵌套文檔,則在搜索「key」時會返回文檔:「bar1」和「value」:「bar2的值」。

+0

感謝您的回答。我如何忽略它?如果我這樣做,我不能在該字段上搜索,但是當我檢索這個對象時它仍然是文檔的一部分? – hereandnow78

+1

發現它:{「enabled」:「false」,「type」:「object」},無論如何,非常感謝您的幫助! – hereandnow78