ES权威指南[官方文档学习笔记]-59 Complex core field types

es:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/complex-core-fields.html

下一页:http://my.oschina.net/qiangzigege/blog/270951

内容

除了简单的数据类型,JSON还有null值,数组和对象,es都支持。

多值字段:
有可能我们想我们的标签字段包含好几个标签,可以用数组:
{ "tag": [ "search", "nosql" ]}
这没有什么特别的,任何字段可以包含0,1或者多个值,这跟一个全文字段产生多个分词道理是一样的。

这意味着,一个数组的所有值必须是同样的数据类型,你不能混杂两种数据类型,
如果你通过索引一个数组而创建了一个新的字段,es将使用第一个值的数据类型来决定整个字段的数据类型。

数组的元素没有顺序,你不能说第一个元素和最后一个元素,就是一个集合。

空字段
数组,可以为空,事实上,Lucene是没有办法存储空值的,所以,一个没有值的字段被认为是一个空的字段。

以下四种字段可以认为是空的,不会被索引:
"empty_string":             "",
"null_value":               null,
"empty_array":              [],
"array_with_null_value":    [ null ]

多层对象
最后一个JSON数据类型是对象object,比如哈希,字典和数组。

数据对象嵌套是常见的,比如:

{
    "tweet":            "Elasticsearch is very flexible",
    "user": {
        "id":           "@johnsmith",
        "gender":       "male",
        "age":          26,
        "name": {
            "full":     "John Smith",
            "first":    "John",
            "last":     "Smith"
        }
    }
}

内部对象的映射
es会探测到新的对象字段并且映射为object类型,
映射如下:
{
  "gb": {
    "tweet": { 
      "properties": {
        "tweet":            { "type": "string" },
        "user": { 
          "type":             "object",
          "properties": {
            "id":           { "type": "string" },
            "gender":       { "type": "string" },
            "age":          { "type": "long"   },
            "name":   { 
              "type":         "object",
              "properties": {
                "full":     { "type": "string" },
                "first":    { "type": "string" },
                "last":     { "type": "string" }
              }
            }
          }
        }
      }
    }
  }
}

内部对象如何被索引?
Lucene不知道内部对象,一个Lucene文档包含一个平级的k/v结构。
为了让es索引内部对象,我们的文档会转化如下:
{
    "tweet":            [elasticsearch, flexible, very],
    "user.id":          [@johnsmith],
    "user.gender":      [male],
    "user.age":         [26],
    "user.name.full":   [john, smith],
    "user.name.first":  [john],
    "user.name.last":   [smith]
}
Lucene仅仅索引简单的值,不是复杂的结构。

内部对象数组

最后,思考下,一个内部对象数组如何被索引,
比如说如下:

{
    "followers": [
        { "age": 35, "name": "Mary White"},
        { "age": 26, "name": "Alex Jones"},
        { "age": 19, "name": "Lisa Smith"}
    ]
}
这个文档将被转化如下的结构

{
    "followers.age":    [19, 26, 35],
    "followers.name":   [alex, jones, lisa, smith, mary, white]
}
那么{age: 35} 和 {name: Mary White} 已经丢失了
Is there a follower who is 26 years old?
这个可以回答

Is there a follower who is 26 years old and who is called Alex Jones?
这个问题就无法回答。
后续再讨论这个问题。

 

 

你可能感兴趣的:(elasticsearch)