我有一个用例,我有一组预定义字段,还需要支持向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字段 嵌套 。 / p>
希望这会有所帮助。