Elasticsearch Nested datatype 嵌套数据类型
nested 嵌套数据类型
nested
类型是object
数据类型的专用版本,它允许可以彼此独立地查询对象地方式,对对象数组进行索引。
在使用大量地嵌套键值对进行存取时,可以考虑使用flattened
数据类型(允许将整个JSON对象索引为单个字段)替代,该数据类型将整个对象映射为单个字段,并允许对其内容进行简单搜索。嵌套文档,存储和查询通常很昂贵,因此此用例中使用flattened
数据类型是更好的选择。
Flattened 是付费使用功能
使用嵌套数据类型
如果需要索引对象数组并保持数组中每个对象地独立性,使用nested数据类型而不是object数据类型。在内部,嵌套数据类型阵列作为一个单独地隐藏文档中。这就意味着,嵌套对象在搜索时,可以独立于其他嵌套搜索之外。
使用示例
PUT my_index
{
"mappings": {
"properties": {
"user": {
"type": "nested"
}
}
}
}
PUT my_index/_doc/1
{
"group" : "fans",
"user" : [
{
"first" : "John",
"last" : "Smith"
},
{
"first" : "Alice",
"last" : "White"
}
]
}
GET my_index/_search
{
"query": {
"nested": {
"path": "user",
"query": {
"bool": {
"must": [
{ "match": { "user.first": "Alice" }},
{ "match": { "user.last": "Smith" }}
]
}
}
}
}
}
GET my_index/_search
{
"query": {
"nested": {
"path": "user",
"query": {
"bool": {
"must": [
{ "match": { "user.first": "Alice" }},
{ "match": { "user.last": "White" }}
]
}
},
"inner_hits": {
"highlight": {
"fields": {
"user.first": {}
}
}
}
}
}
}
说明
- user字段为嵌套字段
- 第一个查询,没有匹配结果, 是因为 Alice, Smith没在一个嵌套对象内部
- 第二个查询,有匹配结果
嵌套查询
限制条件
如上所述,每个嵌套对象都被索引为一个单独地Lucene文档。就上面地示例而言,如果我们为包含100个user对象的单个文档建立索引,则将创建101个Lucene文档:一个用于父文档,一个用于每个嵌套对象。由于与nested映射相关的开销,Elasticsearch放置了适当的设置来防范性能问题:
index.mapping.nested_fields.limit
,在索引中,嵌套对象地最大数量。建议,仅在需要的地方使用嵌套数据类型。默认为50
index.mapping.nested_objects.limit
,单个文档所有嵌套类型包含的最大JSON对象地量,当包含大量的嵌套对象时,此限制有助于防止出现内存不足的异常