ElasticSearch映射动态键用于索引映射的内容

3

我有一个样本json,想要将其索引到Elasticsearch中。 索引的样本Json:

put test/names/1
{
  "1" : {
    "name":"abc"
  },
  "2" : {
    "name":"def"
  },
  "3" : {
    "name":"xyz"
  }

}

现在,elasticsearch生成的默认映射如下:

其中, 索引名称:test, 类型名称:names, ID:1。

{
   "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

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

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

这里是说明:以下文件属于索引test,类型为name,其ID为1。整个文档被视为name类型。使用当前的PUT API,您无法一次对多个文档进行索引。ES立即将123解释为对象类型的属性,每个属性都包含一个字符串类型的name属性。

实际上,ES认为您正在尝试将一个文档索引,而不是三个文档。

要将多个文档放入类型为name的测试索引中,您可以使用以下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"
           }
        }
     }
  }
}

最后的建议:将您的索引拆分为离散操作,或查看Bulk API以了解如何在单个请求中发布多个操作的语法。

感谢 @IanGabes 的回复。 - rahul anand
我想将一个具有多个动态键和值的映射索引到单个类型中(在这种情况下是名称)。键是动态字符串,如“1”,“2”,“3”……“1000”。值是字符串,如“abc”,“def”……“xyz”。你能告诉我如何编写这个映射吗?谢谢。 - rahul anand
以下链接将让您清楚地了解我的问题,因为他们在这里讨论了相同的问题,但仍然没有答案。https://groups.google.com/forum/#!topic/elasticsearch/vrD5BMShwf4/discussion - rahul anand
为了让其他读到这个问题的人受益,最好描述一下您在将使用GSON的HashMap生成的json文档直接存储在问题中时遇到的问题。不幸的是,您无法存储/映射动态键。这些动态字符串是唯一的吗?如果是,您可以将它们定义为文档ID。如果它们不是唯一的,则最好为它们创建一个字段,例如“ dynamic_field”:“ value”。 - IanGabes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接