如何在ElasticSearch中正确定义哈希映射

时间:2015-09-15 19:46:27

标签: templates elasticsearch hashmap mapping

我在ElasticSearch中使用动态映射。

我使用它是因为我的索引很长,我需要使用模板功能以避免在多个位置更新定义(see my other SO question)。

我发送以下json(Object Zoo),包含HashMap 作为示例:

Put 127.0.0.1:9200/myIndex/Zoo/10
{
  "id" : 1,
  "Name" : "Madagascar",
  "map" : {
    "1" : {
      "id" : -4944060986111146989,
      "name" : null
    },
    "2" : {
      "id" : 5073063561743125202,
      "name" : null
    },
    "3" : {
      "id" : -1777985506870671559,
      "name" : null
    }
  }
}

这会创建以下索引

{
    "mm3_v2": {
        "mappings": {
            "Zoo": {
                "properties": {
                    "Name": {
                        "type": "string"
                    },
                    "id": {
                        "type": "long"
                    },
                    "map": {
                        "properties": {
                            "1": {
                                "properties": {
                                    "id": {
                                        "type": "long"
                                    }
                                }
                            },
                            "2": {
                                "properties": {
                                    "id": {
                                        "type": "long"
                                    }
                                }
                            },
                            "3": {
                                "properties": {
                                    "id": {
                                        "type": "long"
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

在此示例中,hashmap中的内部对象很短 在现实生活中,我的hashmap的对象可能很长。

这可以创建一个巨大的索引文件(容易1M行),并且对于每个对象,它重复完全相同的定义 (例如,当存储在列表中时,映射不会重复)

有没有办法在弹性搜索中正确定义散列图?

2 个答案:

答案 0 :(得分:2)

  

有没有办法在弹性搜索中正确定义散列图?

在处理对象方面,Elasticsearch有Object TypeNested Type。嵌套对象被视为单独的文档,文档提供了理解优点(和缺点)的良好示例。

我认为Elasticsearch's dynamic templates可能值得探索一下你的情况,如果你想微调新的键值对添加的处理方式虽然你提到嵌套对象有一个严格的定义?

  

这可以创建一个巨大的索引文件(容易1M行)和每个   对象它重复完全相同的定义。 (例如,当存储在   列表,映射不会重复)

您指的是将要创建的大型映射吗?正如您所提到的,使用Array类型可以避免这种情况,因此可以更改地图对象的结构以避免这种情况吗?或者地图键不是简单的1,2,3,......?

答案 1 :(得分:0)

如果您没有查询该字段,可以在该字段的映射中设置“enabled”:false

  "map": {
    "type": "object",
    "enabled": false
  }