本篇短文主要介绍一下ElasticSearch中的数据类型Arrays的相关概念。
在elasticsearch
中,没有明确定义array
类型,默认每个field
都可以包含0个或者多个值。同一个array中的值的数据类型应该保持一致,比如:
- 一个字符串
array
:
["one","two"]
- 一个
integer
类型的array
:
[1,2]
- 一个包含
array
的array
:
[1,[2,3]]
等价于,
代码语言:javascript复制[1,2,3]
- 一个
object
类型的array
:
[{"name":"Mary","age":12},{"name":"John","age":10}]
当自动增加一个field
的时候,这个field
中的第一个value
决定了这个field
的类型。
所有后续值必须具有相同的数据类型,或者至少必须能够将后续值强制转换为相同的数据类型。
Arrays不支持混合数据类型,比如:
代码语言:javascript复制[10,"some string"]
一个array
是可以包含null
值的,他会被配置的null_value
替代或者忽略,一个空的array
([]
),是被当作一个missing field
,也就是说这个field
中是没有value
的。
为了在文档中使用数组,不需要进行任何预配置,开箱即用地支持它们:
代码语言:javascript复制curl -X PUT "localhost:9200/my-index-000001/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{
"message": "some arrays in this document...",
"tags": [ "elasticsearch", "wow" ],
"lists": [
{
"name": "prog_list",
"description": "programming list"
},
{
"name": "cool_list",
"description": "cool stuff list"
}
]
}
'
curl -X PUT "localhost:9200/my-index-000001/_doc/2?pretty" -H 'Content-Type: application/json' -d'
{
"message": "no arrays in this document...",
"tags": "elasticsearch",
"lists": {
"name": "prog_list",
"description": "programming list"
}
}
'
curl -X GET "localhost:9200/my-index-000001/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"match": {
"tags": "elasticsearch"
}
}
}
'
多值字段和倒排索引
所有字段类型均支持开箱即用的多值字段,这是Lucene
起源的结果。Lucene
被设计为全文搜索引擎。为了能够在大文本块中搜索单个单词,Lucene
将文本标记为单个术语,并将每个术语分别添加到倒排索引中。
这意味着默认情况下,即使是简单的文本字段也必须能够支持多个值。当添加其他数据类型(例如数字和日期)时,它们使用与字符串相同的数据结构,因此免费获得了多值。
对象数组
对象数组无法按预期工作:无法独立于数组中的其他对象查询每个对象。如果需要执行此操作,则应使用嵌套数据类型而不是对象数据类型。
本文就简单介绍了一些关于ES的Arrays的数据类型。