我正在研究elasticsearch指南中的示例。对于包含以下对象的类型:
{
"first_name": "John",
"last_name": "Smith",
"age": 25,
"about": "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
我可以将对象编入索引:
{ “middle_name”:“lee”, “年龄”:36 }
因此它缺少字段,而另一个字段则不在另一个字段中。
所有这些字段是否仍被编入索引?或者每个文档都必须有相同的结构。
答案 0 :(得分:3)
默认情况下,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"
}