【问题标题】:ElasticSearch mapping for dynamic keys for indexing a map用于索引地图的动态键的 ElasticSearch 映射
【发布时间】:2015-08-13 23:28:20
【问题描述】:

我有一个示例 json,我想将它索引到 elasticsearch 中。 示例 Json 索引:

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

}

在哪里, 索引名称:测试, 输入名称:名称, 编号: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.不会像上面那样创建一个。

【问题讨论】:

    标签: java json elasticsearch


    【解决方案1】:

    我认为在我们如何索引文档方面可能会有些混乱。

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

    这表示:以下文档属于索引test,类型为name,id 为1。整个文档被视为类型name。像现在一样使用 PUT API,您不能一次索引多个文档。 ES 立即将123 解释为对象类型的属性,每个属性都包含字符串类型的属性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"
               }
            }
         }
      }
    }
    

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

    【讨论】:

    • 感谢@IanGabes 的回复。
    • 我想将地图索引为单一类型(在本例中为名称),具有多个动态键和值。键是动态字符串,例如 "1","2","3 “.......”1000“。这些值是像“abc”、“def”......“xyz”这样的字符串。你能告诉我如何为此编写映射吗?谢谢。
    • 下面的链接会让您清楚地理解我的问题,因为这里也讨论了同样的问题,但他们仍然没有答案。 groups.google.com/forum/#!topic/elasticsearch/vrD5BMShwf4/…
    • 为了其他阅读此问题的人的利益,最好描述在问题中直接存储使用 GSON 的 HashMap 生成的 json 文档时遇到此问题。不幸的是,您不能存储/映射动态键。这些动态字符串是唯一的吗?如果是这样,您可以将它们定义为文档 ID。如果它们不是唯一的,最好为它们创建一个字段,例如 "dynamic_field" : "value"
    猜你喜欢
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 2017-03-11
    • 2014-05-28
    • 1970-01-01
    • 2021-04-02
    相关资源
    最近更新 更多