Array

Elasticsearch 中,没有特定的 array 类型。默认情况下,任何字段都可以包含0个或者更多值,但是,所有 array 中的值必须具有相同的数据类型,例如:

字符串数组:[“one”, “two”]

整数数组:[1,2]

数组的数组:[1, [2, 3]],等价于[1,2,3]

对象数组:[ { "name": "Mary", "age": 12 }, { "name": "John", "age": 10 }]

注意

对象 数组并不能像你期望的那样工作:你不能独立于数组中的其它对象来查询每一个对象。如果想达到这个目的,你应该使用 nest 数据类型代替 object 数据类型

详细的解释请看这里_ Nested datatype_

当自动添加一个字段,array 的第一个值决定了字段的类型。所有接下来的值必须使用相同的数据类型或者必须至少能将他们转换为与它相同的类型

数组不支持混合的数据类型:[10, “some string”]

数组可以包含 null 值,这些值可以由配置的 null_value 替换或完全跳过。一个空的array [] 被视为不存在的字段-无值的字段。

在文档中使用 array 类型不需要提前做任何配置,天生就支持。

PUT my_index/my_type/1
{
  "message": "some arrays in this document...",
  "tags":  [ "elasticsearch", "wow" ],
  "lists": [
    {
      "name": "prog_list",
      "description": "programming list"
    },
    {
      "name": "cool_list",
      "description": "cool stuff list"
    }
  ]
}

PUT my_index/my_type/2
{
  "message": "no arrays in this document...",
  "tags":  "elasticsearch",
  "lists": {
    "name": "prog_list",
    "description": "programming list"
  }
}

GET my_index/_search
{
  "query": {
    "match": {
      "tags": "elasticsearch"
    }
  }
}
  1. tags 字段会动态添加为一个 string 字段
  2. lists 字段动态添加为一个 object 字段
  3. 第二个文档不包含 arrays,但是可以索隐为相同字段
  4. 这个查询,在 tags 字段查找 elasticsearch,会同时匹配到这2个文档

多值字段和倒排索引

事实上,所有字段类型天生支持多值字段源于 LuenceLucene 设计为一个全文检索引擎。为了在一个大的文本快中查找特定单词,Lucene 将文本标记为特定的术语,将每一个术语分别添加到倒排索引中。

这意味着即使是一个简单的文本也必须默认支持多值。当其它数据类型如数字或者日期被添加的时,他们使用和 strings 一样的数据结构,因此自然变为多值。