【问题标题】:Avoid mapping multiple fields in elastic search避免在弹性搜索中映射多个字段
【发布时间】:2015-05-21 22:48:26
【问题描述】:

我在elasticsearch中索引文档时遇到以下问题,我的文档包含一些在其他文档中不重复的字段,因此我最终拥有超过100.000个元素的映射。我们来看一个例子:

如果我将这样的内容发送到空索引:

{"example":{
    "a1":123,
    "a2":444,
    "a3":52566,
    "a4":7,
    .....
    "aN":11
    }
}

它将创建以下映射:

{"example" : {
          "properties" : {
               "a1" : {
                      "type" : "long"
                      },
                "a2" : {
                      "type" : "long"
                      },
                "a3" : {
                      "type" : "long"
                      },
                "a4" : {
                      "type" : "long"
                      },
                .....
                "aN" : {
                      "type" : "long"
                      }
                }
        }
}

如果我发送另一个文件:

{"example":{
    "b1":123,
    "b2":444,
    "b3":52566,
    "b4":7,
    .....
    "bN":11
    }
}

它将创建一个与上述映射相同的映射。 该对象比这更复杂,但我现在遇到的情况是映射太大,正在杀死服务器。 我该如何解决这个问题?多场在这种情况下工作吗?我尝试了多种方法,但似乎都不起作用。

谢谢。

【问题讨论】:

  • 对于初学者,我的第一感觉是,如果两个文档没有相同的键(或它们的一个大子集),它们就不属于同一类型(即example ) 首先。您可能还想查看this answer。正如 Alex Brasetvik 所说,问题不在于字段太多,而在于无法控制您的映射并让它无限增长,也许您的映射需要考虑一些事情。

标签: elasticsearch mapping


【解决方案1】:

鉴于我们不了解您的用例,很难给您一个明确的答案,但我最初的猜测是,如果您有数千个没有逻辑联系的字段的映射,您可能做出了一些错误的选择关于数据的架构。您能否告诉我们为什么您需要为单一文档类型提供数千个具有不同名称的字段?事实上,我们无法为您指明正确的方向。

【讨论】:

  • 好吧,也许你是对的,问题可能出在数据架构中,我们正在使用这种架构在代码中进行 O(1) 查找,但我们可以用另一种方式进行序列化。无论如何,用例假设该示例是一个人,并且在内部我们有一些定义此人的属性,例如“isTall”:“yes”,“goesToGym”:“mondays”,......等等。
【解决方案2】:

如果您真的想这样做,请按照以下示例创建映射:

POST /index_name/_mapping/type_name
{
    "type_name": {
        "enabled": false
    }
}

它将提供所需的行为。 elasticsearch 将停止为字段创建映射,以及对文档进行解析和索引。

查看这些链接以获取更多信息:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多