2015-09-15 86 views
0

我試圖存儲一個文檔'doc',其中一個字段'doc.value'可以是不同類型(float,string ,對象...)。我知道我不能將它編入索引,但我只是希望它被存儲(不搜索doc.value,搜索將基於其他'doc'字段)。Elasticsearch映射:如何存儲可能是不同類型的非索引字段

我的第一個想法是使用'索引/ _type'來處理它,但它似乎是違背良好的做法,甚至不可能與ES 2.0(規定here)。

我可以在'doc'級別上使用'dynamic:false'設置並跳過映射聲明中的'value'字段;但我需要'doc'中其他字段的動態行爲。

我可以將'doc.value'字段移動到'doc.inner.value'中,並將'doc.inner'映射設置爲具有'dynamic:false'的對象;但在那種情況下;當我存儲並檢索它們時,我將不得不修改每個文檔。

我看到的最後一個解決方案是通過插件創建我自己的'type'(如'any_type'),並且將'doc.value'映射到'any_type'。但是,這種解決方案顯然不是我想採取的道路......

所以我想知道如果有任何問題,這個問題的最佳解決方案是什麼。

回答

0

第一個提議在大多數情況下都是最好的,但是因爲您需要針對其他字段的動態映射,所以第二個解決方案最簡單(創建一個禁用動態映射的子字段,根對象)。

1)dynamic:"false"設置創建inner物場:

POST dynamic 
{ 
    "mappings": { 
    "test": { 
     "properties": { 
     "inner": { 
      "type": "object", 
      "dynamic": false 
     } 
     } 
    } 
    } 
} 

2)添加一些值來測試(用領域,如new_stringnew_long動態創建太):

PUT dynamic/test/1 
    { 
     "new_string":"lorem ipsum", 
     "inner":{ 
     "sub_object":{ 
      "field1": "value1", 
      "field2": 123 
     } 
     } 
    } 

    PUT dynamic/test/2 
    { 
     "new_long":1234, 
     "inner":{ 
     "field3": "value2", 
     "field4": 123 
     } 
    } 

3)由於默認情況下文檔的來源是存儲的,並且它正是您提供給ElasticSearch的JSON文檔,所以即使沒有索引或存儲,您也可以在響應中使用內部值:

"hits": [ 
      { 
       "_index": "dynamic", 
       "_type": "test", 
       "_id": "1", 
       "_score": 1, 
       "_source": { 
        "new_string": "lorem ipsum", 
        "inner": { 
         "sub_object": { 
         "field1": "value1", 
         "field2": 123 
         } 
        } 
       } 
      }, 
      { 
       "_index": "dynamic", 
       "_type": "test", 
       "_id": "2", 
       "_score": 1, 
       "_source": { 
        "new_long": 1234, 
        "inner": { 
         "field3": "value2", 
         "field4": 123 
        } 
       } 
      } 
      ] 

4)檢查映射看到new_stringnew_long區域映射已創建:

"dynamic": { 
     "mappings": { 
     "test": { 
      "properties": { 
       "inner": { 
        "type": "object", 
        "dynamic": "false" 
       }, 
       "new_long": { 
        "type": "long" 
       }, 
       "new_string": { 
        "type": "string" 
       } 
      } 
     } 
     } 
    } 
+0

非常感謝這種反饋。你現在非常清楚這個解決方案。轉換原始文檔的缺點對我來說很有幫助(我想按原樣檢索原始文檔)。但正如你所說,如果沒有「完美」的存在,這可能是最好的解決方案。 – c2m

+0

不客氣。最後一件事:小心如果你有非常大量的動態字段,因爲映射將相應地增長。 – ThomasC

相關問題