how to
使用 nested array 类型的字段,作为查询条件时,如何只检索出符合条件的元素
举个例子,下面的两个文档,字段 addresses
是 nested array
类型,当根据 address.c
等于 1
作为查询条件,怎样只查询出 addresses
中的 c = 1
的元素呢?
[
{
"_index": "a",
"_type": "doc",
"_id": "2",
"_score": 1,
"_source": {
"name": "a",
"addresses": [
{
"c": 1
},
{
"c": 3
}
]
}
},
{
"_index": "a",
"_type": "doc",
"_id": "1",
"_score": 1,
"_source": {
"name": "a",
"addresses": [
{
"c": 1
},
{
"c": 2
}
]
}
}
]
usually
一般我们根据 nested
字段查询是这么写的
GET a/doc/_search
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "addresses",
"query": {
"term": {
"addresses.c": {
"value": "1"
}
}
}
}
}
]
}
}
}
this way
如果要满足上面的需求,可以利用 inner_hits
参数,写成
GET a/doc/_search
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "addresses",
"query": {
"term": {
"addresses.c": {
"value": "1"
}
}
},
"inner_hits": {
}
}
}
]
}
}
}
查询结果如下
{
"_index": "a",
"_type": "doc",
"_id": "2",
"_score": 1,
"_source": {
"name": "a",
"addresses": [
{
"c": 1
},
{
"c": 3
}
]
},
"inner_hits": {
"addresses": {
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_nested": {
"field": "addresses",
"offset": 0
},
"_score": 1,
"_source": {
"c": 1
}
}
]
}
}
}
}
可以看到多返回了个 inner_hits
,包含了数组中匹配元素的偏移量。