【问题标题】:Do elasticsearch documents within a type have to have the same field structure类型中的elasticsearch文档是否必须具有相同的字段结构
【发布时间】:2015-05-04 04:01:51
【问题描述】:

我正在研究弹性搜索指南中的示例。对于具有以下对象的类型:

{
               "first_name":  "John",
               "last_name":   "Smith",
               "age":         25,
               "about":       "I love to go rock climbing",
               "interests": [ "sports", "music" ]
            }

我可以像这样索引一个对象吗:

{ “中间名”:“李”, “年龄”:36 }

所以它有缺失的字段和一个不在另一个字段中的额外字段。

所有这些字段是否仍被索引?还是每个文档都必须有相同的结构。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    Elasticsearch 默认使用dynamic mapping,这意味着它第一次看到一个新字段时会为其创建一个映射。

    在您的情况下,middle_name 字段是新的,因此 Elasticsearch 会自动为您创建该字段的映射:

    {
    "middle_name": {
      "type":"string"
      }
    }
    

    所以是的,额外的字段将被索引。并非所有文档都必须包含所有字段。

    但是,所有相同的字段在所有文档中必须具有相同的类型。也就是说,如果您尝试索引文档{"age":26},然后索引文档{"age":"old"},则会出现错误,因为在第一种情况下,该字段是一个数字,在第二种情况下是一个字符串:

    {
       "error": "MapperParsingException[failed to parse [age]]; nested: NumberFormatException[For input string: \"adsf\"]; ",
       "status": 400
    }
    

    通过玩 Marvel Sense,您可以轻松尝试所有这些。通过在您的 Elasticsearch 文件夹中运行 bin/plugin -i elasticsearch/marvel/latest 来安装它,然后转到 http://localhost:9200/_plugin/marvel/sense/index.html 并尝试运行以下命令来自己尝试:

    put typetest
    put typetest/doc/2
    {
      "age":25
    }
    put typetest/doc/2
    {
      "age":"old"
    }
    

    【讨论】:

    • 打开动态映射并不能解决所有情况,即使在索引时也是如此。
    【解决方案2】:

    缺少的字段不会造成问题。但额外的字段可能会根据您在 dynamic mapping 属性中的设置创建。

    引用文档。

    幸运的是,您可以使用动态设置来控制此行为, 它接受以下选项:

    true 动态添加新字段——默认值

    false 忽略新字段

    strict 如果遇到未知字段则抛出异常

    【讨论】:

      猜你喜欢
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-12
      • 2010-09-23
      • 2016-04-11
      相关资源
      最近更新 更多