# Array

原文链接 : [https://www.elastic.co/guide/en/elasticsearch/reference/current/array.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/array.html)

译文链接 : [Array](/display/Elasticsearch/Array)

贡献者 : @装X帝

在 **_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个文档

## 多值字段和倒排索引

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

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