嵌套json对象的弹性搜索映射

时间:2015-05-18 16:50:42

标签: json elasticsearch

我需要有关嵌套json文档的弹性搜索映射的帮助。 我在网上搜索了很多,但没有找到任何有用的点信息。 假设我有这种类型的数据..

{
  "name" : "Zach",
  "car" : [
    {
      "make" : "Saturn",
      "model" : "SL"
    },
    {
      "make" : "Subaru",
      "model" : "Imprezza"
    }
  ]
}
{
  "name" : "Bob",
  "car" : [
    {
      "make" : "Saturn",
      "model" : "Imprezza"
    }
  ]
}

其中汽车内部可以有任意数量的数据对象。 根据{{​​3}} doc,我发现对于嵌套的json,我必须将类型指定为嵌套。但是没有关于如何在嵌套类型下指定变量的映射信息的信息。

就像上面的例子一样,我可以像这样编写映射。

{
  "person":{
    "properties":{
      "name" : {
        "type" : "string"
      },
      "car":{
        "type" : "nested"
      }
    }
  }
}

但是如何为car.make&提供映射信息car.model ...

这会在没有任何未来问题的情况下正常工作吗?

{
  "person": {
    "properties": {
      "name" : {
        "type" : "string"
      },
      "car": {
        "type" : "nested"
        "properties": {
          "make": {....},
          "model": {....}
        }
      }
    }
  }
}

3 个答案:

答案 0 :(得分:17)

你可以这样做:

PUT /my_index
{
  "mappings": {
    "blogpost": {
      "properties": {
        "comments": {
          "type": "nested", 
          "properties": {
            "name":    { "type": "string"  },
            "comment": { "type": "string"  },
            "age":     { "type": "short"   },
            "stars":   { "type": "short"   },
            "date":    { "type": "date"    }
          }
        }
      }
    }
  }
}

来自this section of the ES definitive guide

答案 1 :(得分:0)

对象数组不像您期望的那样工作:您不能独立于数组中的其他对象查询每个对象。如果您需要能够做到这一点,那么您应该使用嵌套数据类型而不是对象数据类型。

  tasks: {
      type: 'nested',
      properties: {
        id: {
          type: 'text',
        },
        description: {
          type: 'text',
        },
        assignee: {
          type: 'nested',
          properties: {
            id: {
              type: 'text',
            },
            thumbnail: {
              type: 'text',
            },
          },
        },
      },
    },

https://www.elastic.co/guide/en/elasticsearch/reference/current/nested.html https://www.elastic.co/guide/en/elasticsearch/reference/current/array.html

答案 2 :(得分:-1)

您可以通过以下方式进行映射:

put /my_index/_mapping/my_type
{
  "person": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "string_lowercase",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      },
      "car": {
        "type": "nested",
        "properties": {
          "make": {
            "type": "text",
            "analyzer": "string_lowercase",
            "fields": {
              "keyword": {
                "type": "keyword"
              }
            }
          },
          "model": {
            "type": "text",
            "analyzer": "string_lowercase",
            "fields": {
              "keyword": {
                "type": "keyword"
              }
            }
          }
        }
      }
    }
  }
}