使用类型动态创建索引
示例使用基本 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>
}
}
- 如果它已经存在(由于前面的例子),删除索引。
- 将文档索引到索引
my_index
中,类型为my_type
,ID 为abc123
(可以是数字,但它始终是一个字符串)。- 默认情况下,只需索引文档即可启用动态索引创建。这对于开发环境来说非常好,但对于生产环境来说并不一定好。
- 此字段是整数,因此第一次看到它必须映射。Elasticsearch 总是假定任何传入类型的最宽类型,因此这将被映射为
long
而不是integer
或short
(两者都可以包含1234
和456
)。 - 这个领域也是如此。它将被映射为
double
而不是float
,如你所愿。
此动态创建的索引和类型大致匹配第一个示例中定义的映射。但是,理解 <3>
和 <4>
如何影响自动定义的映射至关重要。
你可以通过将另一种类型动态添加到同一索引来实现此目的:
PUT /my_index/my_other_type/abc123 <1>
{
"field1": 91, <2>
"field3": 4.567
}
- 该类型是与上述文档的唯一区别。ID 是一样的,没关系! 它与其他
abc123
没有任何关系,只是它碰巧在同一个索引中。 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"
}
}
}
}
- 这使用
_mappings
端点从我们创建的索引中获取映射。 - 我们在本例的第一步动态创建了
my_type
。 field2
现在是long
而不是integer
因为我们没有预先定义它。这可能证明在磁盘存储中是浪费的。object1.field1
现在是一个double
,其原因与#3 相同,与#3 具有相同的分支。- 从技术上讲,
long
可以在很多情况下进行压缩。但是,由于它是浮点数,因此无法压缩double
。
- 从技术上讲,
- 我们还在本例的第二步中动态创建了
my_other_type
。它的映射恰好相同,因为我们已经在使用long
和double
。- 请记住,
field1
必须与my_type
的定义匹配(它确实如此)。 field3
是这种类型的独特之处,所以它没有这样的限制。
- 请记住,