用于索引地图的动态键的ElasticSearch映射

时间:2015-08-13 14:58:55

标签: java json elasticsearch

我有一个示例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。不会像上面那样创建一个。

1 个答案:

答案 0 :(得分:0)

我认为在索引文档的方式方面可能存在一些混淆。

put test/names/1
{...
    document
...}

这说明:以下文档属于索引test,类型为name且标识为1。整个文档被视为类型name。使用当前的PUT API,您无法一次索引多个文档。 ES立即将123解释为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多个操作的语法。