如何在弹性搜索中为特殊情况定义映射?

时间:2016-06-24 00:53:59

标签: elasticsearch

我想存储类型"城市"在各个城市的弹性搜索中,这些城市的降雨量指标是多少。以下是两个示例文档:

{
  "name": "Seattle"
  "rain_fall": {
    "jan16": {"max": 1000, "min": 1000, "avg": 1200 }, 
    "feb16": {"max": 1100, "min": 1000, "avg": 1200 },
    "mar16": {"max": 1800, "min": 1000, "avg": 1200 } 
  }
}

{
  "name": "London"
  "rain_fall": {
    "jan16": {"max": 1200, "min": 1000, "avg": 1200 }, 
    "feb16": {"max": 1300, "min": 1000, "avg": 1200 },
    "mar16": {"max": 1400, "min": 1000, "avg": 1200 } 
  }
}

如何为上面的sampel文档定义相应的映射?到目前为止我设法得到了这个 -

"mappings": {
  "_index": "myindex",
  "cities": {
    "dynamic": "strict", 
    "properties": {
      "name" {"type": "string"},
      "rain_fall": {
        "type": "nested",
        "properties": {
          ----???----
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:0)

如果您这样做,您将为每个月jan16feb16等创建新的对象属性。每个月,您将创建一个新属性我不确定这是最有效的方式。这取决于你之后如何查询该索引,但我建议将月份作为嵌套对象中的新属性移动,如下所示:

{
  "name": "London",
  "rain_fall": [
    {"month": "jan16", "max": 1200, "min": 1000, "avg": 1200 }, 
    {"month": "feb16", "max": 1300, "min": 1000, "avg": 1200 },
    {"month": "mar16", "max": 1400, "min": 1000, "avg": 1200 } 
  ]
}

映射将如下所示:

{
  "mappings": {
    "cities": {
      "dynamic": "strict",
      "properties": {
        "name": {
          "type": "string"
        },
        "rain_fall": {
          "type": "nested",
          "properties": {
            "avg": {
              "type": "long"
            },
            "min": {
              "type": "long"
            },
            "month": {
              "type": "string"
            },
            "max": {
              "type": "long"
            }
          }
        }
      }
    }
  }
}