在elasticsearch类型中添加字段映射的成本

时间:2014-12-25 06:37:06

标签: 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 并使用父/子关系将其与事件类型映射。我相信这可能会限制频繁向类型添加动态字段的成本(如果有的话)。但是,据我所知,使用父/子关系需要更多内存。

1 个答案:

答案 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>

希望这会有所帮助。