【问题标题】:Cost of adding field mapping in elasticsearch type在 elasticsearch 类型中添加字段映射的成本
【发布时间】:2014-12-25 06:37:06
【问题描述】:

我有一个用例,我有一组预定义的字段,还需要支持将动态字段添加到 ElasticSearch 并对其进行一些基本搜索。我可以使用动态模板映射来实现这一点。但是,添加这种动态字段的频率很高。

考虑 Event 类型的这个 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 都会更新 type 的映射。我关心的是在现有类型中添加新字段映射的成本是多少?

我计划通过引入另一个 type,例如 EventExtensions,将所有动态映射(在 extensions 内)从 Event 类型中分离出来 并使用父/子关系将其映射到 Event 类型。我相信这可能会限制频繁向类型添加动态字段的成本(如果有的话)。但是,据我所知,使用父/子关系需要更多内存。

【问题讨论】:

  • 在您的问题中更具体。我无法理解您的情况。

标签: elasticsearch


【解决方案1】:

首先要记住的是字段是每个索引而不是每个类型。 因此,无论您添加新字段,它都会在同一个索引中创建。无论是另一种类型,还是作为父母或孩子。 因此,将新字段解耦到另一种类型但相同的索引不会产生任何变化。

第二个字段添加并不是那么昂贵的事情。我认识使用 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"
             }
         ]
    }

这样,字段不会增加。但是为了进行字段级别的特定搜索,比如给我所有文件,其中字段名称为 newInfo2 并包含更多字词,您需要创建 newInfo 字段嵌套

希望这会有所帮助。

【讨论】:

  • 谢谢 Vineeth。我看不到字段数量会达到 1000 左右,所以我最好继续在同一索引中添加字段。关于搜索,我所有的动态字段都在一个特定的路径下,所以我可以使用动态模板为动态字段添加我的分析器。
猜你喜欢
  • 2015-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
  • 2012-08-31
  • 2017-10-13
相关资源
最近更新 更多