nest 类型是对象数据类型的一种特殊版本,允许以一种可以独立查询对象数组元素的方式对对象数组进行索引。
The nested
type is a specialised version of the object
data type that allows arrays of objects to be indexed in a way that they can be queried independently of each other.
nested类型的限制:
// todo — 待更新
e.g.
PUT my-index-000001/_doc/1
{
"user": [
{
"first": "John",
"last": "Smith"
},
{
"first": "Alice",
"last": "White"
}
]
}
上述的插入文档的操作在内部会将其转换成如下:
{
"user.first": ["john", "alice"],
"user.last": ["smith", "white"]
}
可以看出 user.first、user.last 字段都会平铺成多值的字段,alice、white 之间还有 john、smith 之间的关联关系会丢失。
导致下面的查询的结果也是不准确的:
GET my-index-000001/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"user.first": "Alice"
}
},
{
"match": {
"user.last": "Smith"
}
}
]
}
}
}
对此,可以采用 nested 类型解决这种问题。
PUT my-index-000001
{
"mappings": {
"properties": {
"user": {
"type": "nested",
"properties": {
"first": {
"type": "text"
},
"last": {
"type": "text"
}
}
}
}
}
}
PUT my-index-000001/_doc/1
{
"user": [
{
"first": "John",
"last": "Smith"
},
{
"first": "Alice",
"last": "White"
}
]
}
GET my-index-000001/_search
{
"query": {
"nested": {
"path": "user",
"query": {
"bool": {
"must": [
{
"match": {
"user.first": "Alice"
}
},
{
"match": {
"user.last": "White"
}
}
]
}
}
}
}
}
即嵌套查询。针对 nested 类型字段的查询。
自己的理解:前面说到 nested 类型是允许以一种可以独立查询对象数组元素的方式对对象数组进行索引,也就是说对象数组元素即子对象作为一个整体进行匹配,如果匹配成功,则返回父文档。
path:(必须)想要查询的嵌套对象
query:(必须)基于嵌套对象,想要查询的内容
score_mode:匹配的子对象集合的分数如何影响父文档的关联性分数