使用类型动态创建索引

示例使用基本 HTTP,它可以轻松转换为 cURL 和其他 HTTP 应用程序。它们还匹配 Sense 语法,该语法将在 Kibana 5.0 中重命名为 Console。

注意:示例插入 <#> 以帮助引起对零件的注意。如果你复制它们应该被删除!

DELETE /my_index <1>

PUT /my_index/my_type/abc123 <2>
{
  "field1" : 1234, <3>
  "field2" : 456,
  "object1" : {
    "field1" : 7.8 <4>
  }
}
  1. 如果它已经存在(由于前面的例子),删除索引。
  2. 将文档索引到索引 my_index 中,类型为 my_type,ID 为 abc123(可以是数字,但它始终是一个字符串)。
    • 默认情况下,只需索引文档即可启用动态索引创建。这对于开发环境来说非常好,但对于生产环境来说并不一定好。
  3. 此字段是整数,因此第一次看到它必须映射。Elasticsearch 总是假定任何传入类型的最宽类型,因此这将被映射为 long 而不是 integershort(两者都可以包含 1234456)。
  4. 这个领域也是如此。它将被映射为 double 而不是 float,如你所愿。

此动态创建的索引和类型大致匹配第一个示例中定义的映射。但是,理解 <3><4> 如何影响自动定义的映射至关重要。

你可以通过将另一种类型动态添加到同一索引来实现此目的:

PUT /my_index/my_other_type/abc123 <1>
{
  "field1": 91, <2>
  "field3": 4.567
}
  1. 该类型是与上述文档的唯一区别。ID 是一样的,没关系! 它与其他 abc123 没有任何关系,只是它碰巧在同一个索引中。
  2. field1 已存在于索引中,因此它必须与其他类型中定义的字段类型相同。提交一个字符串或不是整数的值会失败(例如,"field1": "this is some text""field1": 123.0)。

这将在同一索引 my_index 中动态创建 my_other_type 的映射。

注意: 预先定义映射总是更快,而不是让 Elasticsearch 在索引时动态执行它。

索引两个文档的最终结果与第一个示例类似,但字段类型会有所不同,因此会略有浪费:

GET /my_index/_mappings <1>
{
  "mappings": {
    "my_type": { <2>
      "properties": {
        "field1": {
          "type": "long"
        },
        "field2": {
          "type": "long" <3>
        },
        "object1": {
          "type": "object",
          "properties": {
            "field1" : {
              "type": "double" <4>
            }
          }
        }
      }
    }
  },
  "my_other_type": { <5>
    "properties": {
      "field1": {
        "type": "long"
      },
      "field3": {
        "type": "double"
      }
    }
  }
}
  1. 这使用 _mappings 端点从我们创建的索引中获取映射。
  2. 我们在本例的第一步动态创建了 my_type
  3. field2 现在是 long 而不是 integer 因为我们没有预先定义它。这可能证明在磁盘存储中是浪费的。
  4. object1.field1 现在是一个 double,其原因与#3 相同,与#3 具有相同的分支。
    • 从技术上讲,long 可以在很多情况下进行压缩。但是,由于它是浮点数,因此无法压缩 double
  5. 我们还在本例的第二步中动态创建了 my_other_type。它的映射恰好相同,因为我们已经在使用 longdouble
    • 请记住,field1 必须my_type 的定义匹配(它确实如此)。
    • field3 是这种类型的独特之处,所以它没有这样的限制。