2014-12-25 55 views
0

我有一個用例,其中有一組預定義的字段,還需要支持將動態字段添加到ElasticSearch並對其進行一些基本搜索。我能夠使用動態模板映射來實現這一點。但是,添加這種動態字段的頻率非常高。在elasticsearch類型中添加字段映射的代價

考慮爲事件類型的本ES文件:

{ 
    "name":"Youth Conference", 
    "venue":"Ahmedabad", 
    "date":"10/01/2015", 
    "organizer":"Invincible", 
    "extensions":{ 
     "about": { 
      "vision":"Visualizes the image of an ideal Country. ", 
      "mission":"Encapsulates the gravity of the top reformative solutions for betterment of Country." 
     } 
    // Any thing can go here.. 
    } 

} 

在上面的例子中,各事件的文檔可以具有任何未知的/新字段。因此,對於所引入的每個這樣的新動態字段,ES將更新類型的映射。我擔心在現有類型中添加新的字段映射的成本是多少?

我計劃通過引入另一個類型,從事件型分離出所有的動態映射(內部擴展)說EventExtensions和使用父/子關係與事件類型映射。我相信這可能會限制經常向該類型添加動態字段的成本(如果有的話)。不過,就我所知,使用父母/孩子的關係需要更多的記憶。

+0

在你的問題中更具體。我無法理解你的情況。 –

回答

2

這裏要記住的第一件事是該字段是按索引而不是按類型。 所以無論你添加新字段,它都會在同一個索引中生成。以另一種方式,或以父母或小孩的身份。 因此,將新字段解耦爲另一種類型但索引相同的操作不會進行任何更改。

第二場增加不是那麼昂貴的東西。我認識那些使用1000個領域的人,並且對他們很好。這就是說,應該有一個字段的數量選項卡,以便它不會出現瘋狂的數字。

在這裏,我們有多種方法來解決這個問題

1)讓我們假設新領域的數據不需要精確地搜索到。在這種情況下,您可以將整個JSON反序列化爲字符串並將其添加到字段中。還要確保這個字段沒有編入索引。通過這種方式,您可以基於其他字段進行搜索,但是可以在檢索文檔時獲取反序列化的信息。

2)可以說新領域看起來像這樣

 { 
      "newInfo1" : "log Of Info", 
      "newInfo2" : "A lot more info" 
     } 

取而代之的是,你可以使用

{ 
     "newInfo" : [ 
      { 
       "fieldName" : "newInfo1", 
       "fieldValue" : "log Of Info" 
      }, 
      { 
       "fieldName" : "newInfo2", 
       "fieldValue" : "A lot more info" 
      } 
     ] 
    } 

這樣,場不會增加。但是,爲了進行字段級別的特定搜索,例如給我帶有filedName的所有文檔作爲newInfo2並在其中包含更多字詞,您需要製作newInfo字段嵌套

希望這會有所幫助。

+0

謝謝Vineeth。我沒有看到領域的數量將達到1000左右,所以我會更好地在同一個索引中添加字段。關於搜索,所有我的動態字段在一個特定的路徑下,所以我可以使用動態模板來添加我的分析器的動態字段。 –

相關問題