Elasticsearch自定义映射定义

时间:2018-10-10 15:42:23

标签: elasticsearch

我必须以以下格式将数据上传到麋鹿:

{
  "location":{
    "timestamp":1522751098000,
    "resources":[
      {
         "resource":{
           "name":"Node1"
          },
          "probability":0.1
      },
      {
        "resource":{
          "name":"Node2"
         },
        "probability":0.01
      }]
  }
}

我正在尝试定义一种此类数据的映射,并根据以下映射生成了他:

{
 "mappings": {
   "doc": {
     "properties": {
        "location": {
           "properties" : {
              "timestamp": {"type": "date"},
              "resources": []
           }
         }
     }
  }
}

我有2个问题:

  1. 如何在映射中定义“资源”数组?
  2. 是否可以定义自定义类型(例如资源)并在我的映射中使用该类型(例如“ resources”:[{type:resource}])?

1 个答案:

答案 0 :(得分:1)

关于Elasticsearch映射有很多事情要知道。我强烈建议您通读至少their documentation的部分内容。

如果您不在乎,请先简短回答:

  1. Elasticsearch自动允许存储一个或多个已定义对象的值,无需指定数组。请参阅标记1或参阅其array types上的文档。
  2. 我认为没有。由于Elasticsearch 6,每个索引仅允许使用1种类型。嵌套对象可能是最接近的,但是您可以在同一文件中定义它们。嵌套对象存储在单独的索引中(内部)。

好答案和一些想法

看看下面的映射:

"mappings": {
    "doc": {
        "properties": {
            "location": {
                "properties": {
                    "timestamp": {
                        "type": "date"
                    },
                    "resources": { [1]
                        "type": "nested", [2]
                        "properties": {
                            "resource": {
                                "properties": {
                                    "name": { [3]
                                        "type": "text"
                                    }
                                }
                            },
                            "probability": {
                                "type": "float"
                            }
                        }
                    }
                }
            }
        }
    }
}

这就是您的映射的外观。可以做不同的事情,但是我认为这样是可行的-也许除了标记3。我现在就来谈谈这些:

标记1:。如果定义字段,通常会为其指定一种类型。我将resources定义为nested类型,但是您的timestampdate类型。 Elasticsearch自动允许存储这些对象的一个​​或多个值。 timestamp实际上还可以包含dates的数组,有no need to specify an array

标记2:我将resources定义为nested类型,但是它也可能是一个像resource这样的对象,位于下面(没有类型是给定)。了解嵌套对象here。最后,我不知道您的查询是什么样子,所以不确定您是否真的需要嵌套类型。

标记3:我想在这里解决两点。首先,我想再次提到resource被定义为具有属性name的普通object。您也可以为resources做到这一点。

第二件事更多是发人深省的冲动:如果某些事情绝对不适合您的情况,请不要太当真。只是把它当作一种意见。

此映射结构看起来很受关系数据库方法的启发。我认为您通常希望为弹性搜索定义更多的文档结构,以进行预期的搜索。冗余不是问题,但是嵌套对象会使查询变得复杂。我想我会省略整个资源部分,并做这样的事情:

"mappings": {
    "doc": {
        "properties": {
            "location": {
                "properties": {
                    "timestamp": {
                        "type": "date"
                    },
                    "resource": {
                        "properties": {
                            "resourceName": {
                                "type": "text"
                            }
                            "resourceProbability": {
                                "type": "float"
                            }
                        }
                    }
                }
            }
        }
    }
}

因为正如我所说,在这种情况下,resource可以包含一个对象数组,每个对象都有一个resourceName和一个resourceProbability

相关问题