elasticsearch嵌套对象的映射

    在es中,我们有时候可能需要映射,{ "field" : "xx" , "field01" : [] }这样格式的嵌套对象,默认情况下es会将field01的type映射成object类型,这个时候,我们去查询可能就会出现问题。需要手动修改成nested嵌套类。型。

一、有问题的情形演示。

1、插入数据,es默认会自动创建映射

curl -XPUT "http://192.168.99.1:9200/nestedindex/personinfo/1" -d'
{
  "name" : "my name is zhangsa",
  "address" : [
      {
        "city" : "china hubei",
        "zipcode" : "123456"
      },
      {
        "city" : "china huanggang",
        "zipcode" : "654321"
      }
    ]
}'

 2、查询name字段中必须要出现name这个值,且address.city的值是"huanggang",address.zipcode的值是123456,这个时候应该查询不出来数据,可是查询的结果如下。
    注意这样可以查询出来是因为底层的存储格式被扁平化成下方这种格式了

               address.city=["china", "hubei","huanggang"]

               address.zipcode=["123456","64321"]

               那么city和zipcode之间的关联关系就打乱了。


 二、正确的做法

1、创建索引的时候,手动指定address的type为nested

curl -XPUT "http://192.168.99.1:9200/nestedindex" -d'
{
  "mappings": {
    "personinfo" : {
      "properties": {
        "name" : {
          "type": "text"
        },
        "address" : {
          "type": "nested",
          "properties": {
            "city" : {
              "type" : "text"
            },
            "zipcode" : { "type" : "keyword" }
          }
        }
      }
    }
  }
}'

 2、插入数据

curl -XPUT "http://192.168.99.1:9200/nestedindex/personinfo/1" -d'
{
  "name" : "my name is zhangsa",
  "address" : [
      {
        "city" : "china hubei",
        "zipcode" : "123456"
      },
      {
        "city" : "china huanggang",
        "zipcode" : "654321"
      }
    ]
}'

 3、查询name字段中必须要出现name这个值,且address.city的值是"huanggang",address.zipcode的值是123456,应该查询不出来结果,就是正确的。
    注意嵌套对象会被索引成分离的隐藏文档,不能直接查询它们。而是需要使用nested查询或nested过滤器来查询它们。

posted @ 2017-08-18 15:50  huan1993  阅读(80)  评论(0编辑  收藏  举报