ElasticSearch:对同一映射定义具有不同索引的优缺点

时间:2015-05-18 08:58:13

标签: database-design elasticsearch architecture

假设我定义了两个ElasticSearch映射,例如:

"firstMapping" : {
    "properties" : {
        "name" : {
            "type" : "string"
        },
        "someProperty" : {
            "type" : "string"
        }
    }
}

"secondMapping" : {
    "properties" : {
        "name" : {
            "type" : "string"
        },
        "someOtherProperty" : {
            "type" : "string"
        }
    }
}

我有两个问题:

  1. 目前,这些映射是在两个不同的索引中创建的,没有明显的原因(除了通过计算索引中元素的数量来快速计算一个映射中的文档数量,这似乎是一个非常虚假的原因。)

    我认为这样做的优先方法是创建一个包含这两个相关映射的索引,因为关系数据库会包含许多不同的表。

  2. 对于每个映射,一个文档都有一个" origin"," realtime"或者"批次"。正如您可能已经猜到的那样,对于每个"批次"文件应该只有一个相应的"实时"文件,每个基本上持有相同的值。

    换句话说,在该系统中,"记录"应该由两个文件组成:a" batch"文件和"实时"文件,否则相同。

    因此,有一个"批次"或"实时"文件应视为异常;因此需要有一种简单的方法来比较"批次"和"实时"数据相互对立。

    目前,每个映射实际上都是在两个索引中创建的,例如

    • batchFirstMappingIndex包含"批次"的firstMapping个文档原点
    • realtimeFirstMappingIndex包含"实时"的firstMapping个文档原点

    (resp.secondMapping)

    由于映射本质上是类型,我想知道对两个源都有一个映射是否更合适,例如:

    "firstMappingWithOrigin" : {
        "properties" : {
            "origin" : {
                "type" : "boolean"
            },
            "name" : {
                "type" : "string"
            },
            "someProperty" : {
                "type" : "string"
            }
        }
    }
    

    (resp.secondMapping) &{34;批次"的false值&{34}实时"

  3. true

    总而言之,我目前在4个独立的指数中有4个资源:

    • batchFirstMappingIndex / firstMapping
    • realtimeFirstMappingIndex / firstMapping
    • batchSecondMappingIndex / secondMapping
    • realtimeSecondMappingIndex / secondMapping

    我认为我们只能在一个索引中轻松拥有2个资源:

    • myIndex / firstMappingWithOrigin
    • myIndex / secondMappingWithOrigin

    这两种解决方案的优点和缺点是什么?第二种方法的最佳理由是什么?

    对于这两个问题,我特别关注:

    • 读取(动态生成聚合)并写入性能
    • 索引维护(例如,添加/删除/修改映射属性)
    • 比较"批次"和"实时"数据

1 个答案:

答案 0 :(得分:1)

ES人员的以下文章应该对此有所了解:http://elastic.co/blog/index-vs-type

另请注意"删除属性" ES中不可能,"modifying properties"仅限于兼容的更改。