我有一个示例json,我想索引到elasticsearch。 样本Json索引:
put test/names/1
{
"1" : {
"name":"abc"
},
"2" : {
"name":"def"
},
"3" : {
"name":"xyz"
}
}
其中, 索引名称:test, 类型名称:名称, id:1
现在,elasticsearch生成的默认映射是:
{
"test": {
"mappings": {
"names": {
"properties": {
"1": {
"properties": {
"name": {
"type": "string"
}
}
},
"2": {
"properties": {
"name": {
"type": "string"
}
}
},
"3": {
"properties": {
"name": {
"type": "string"
}
}
},
"metadataFieldDefinition": {
"properties": {
"name": {
"type": "string"
}
}
}
}
}
}
}
}
如果地图大小从3(当前)增加到假设千或百万,那么ElasticSearch将为每个创建一个映射,这可能会导致性能问题,因为映射集合将是巨大的。
我尝试通过设置:
创建映射"dynamic":false,
"type":object
但它被ES覆盖。因为它与索引数据不匹配。
请告诉我如何定义映射以便ES。不会像上面那样创建一个。
答案 0 :(得分:0)
我认为在索引文档的方式方面可能存在一些混淆。
put test/names/1
{...
document
...}
这说明:以下文档属于索引test
,类型为name
且标识为1
。整个文档被视为类型name
。使用当前的PUT API,您无法一次索引多个文档。 ES立即将1
,2
和3
解释为object类型的属性,每个属性都包含string类型的属性name
。
实际上,ES认为您正在尝试索引一个文档,而不是三个
要使用类型名称将许多文档导入索引测试,您可以使用CURL语法执行此操作:
curl -XPUT"http://your-es-server:9200/test/names/1" -d'
{
"name": "abc"
}'
curl -XPUT"http://your-es-server:9200/test/names/2" -d'
{
"name": "ghi"
}'
curl -XPUT"http://your-es-server:9200/test/names/3" -d'
{
"name": "xyz"
}'
这将指定您要编入索引的端点中的文档ID。您的映射将如下所示:
"test": {
"mappings": {
"names": {
"properties": {
"name": {
"type": "string"
}
}
}
}
}
Final Word:将索引拆分为离散操作,或查看Bulk API以查看有关如何在单个请求中POST多个操作的语法。