在Elasticsearch中,没有专门的数组(Array)数据类型。但是,在默认情况下,任意一个字段都可以包含0或多个值,这意味着每个字段默认都是数组类型,只不过,数组类型的各个元素值的数据类型必须相同。
在ElasticSearch中,数组是开箱即用的(out of box),不需要进行任何配置,就可以直接使用。
例如,tags
字段类型是Text,我们同时可以往里面存放数组:
数组类型的各个元素值的数据类型必须相同, 如果连强制类型转换都进行不了就会报错:
传入一个字符串数组给标准分析器:
POST /_analyze
{
"text": ["hello world", "hello pingfan"],
"analyzer": "standard"
}
标准分析器将它摊平成了四个单词:
所以"text": ["hello world", "hello pingfan"]
其实等价于"hello world hello pingfan"
在第四节我们也提到了嵌套数据类型,这里再结合本节回顾下。
嵌套数据类型是对象数据类型的特殊版本,它允许对象数组中的各个对象被索引,数组中的各个对象之间保持独立,能够对每一个文档进行单独查询,这就意味着,嵌套数据类型保留文档的内部之间的关联,ElasticSearch引擎内部使用不同的方式处理嵌套数据类型和对象数组的方式,对于嵌套数据类型,ElasticSearch把数组中的每一个嵌套文档(Nested Document)索引为单个文档,这些文档是隐藏(Hidden)的,文档之间是相互独立的,但是,保留文档的内部字段之间的关联,使用嵌套查询(Nested Query)能够独立于其他文档而去查询单个文档。在创建嵌套数据类型的字段时,需要设置字段的type属性为nested。