由于嵌套对象 被索引在独立隐藏的文档中,我们无法直接查询它们。 相应地,我们必须使用 {ref}/query-dsl-nested-query.html[ nested
查询] 去获取它们:
GET /my_index/blogpost/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"title": "eggs" (1)
}
},
{
"nested": {
"path": "comments", (2)
"query": {
"bool": {
"must": [ (3)
{
"match": {
"comments.name": "john"
}
},
{
"match": {
"comments.age": 28
}
}
]
}
}
}
}
]
}}}
-
title
子句是查询根文档的。 -
nested
子句作用于嵌套字段comments
。在此查询中,既不能查询根文档字段,也不能查询其他嵌套文档。 -
comments.name
和comments.age
子句操作在同一个嵌套文档中。
Tip
|
|
nested
查询肯定可以匹配到多个嵌套的文档。每一个匹配的嵌套文档都有自己的相关度得分,但是这众多的分数最终需要汇聚为可供根文档使用的一个分数。
默认情况下,根文档的分数是这些嵌套文档分数的平均值。可以通过设置 score_mode 参数来控制这个得分策略,相关策略有 avg
(平均值), max
(最大值), sum
(加和) 和 none
(直接返回 1.0
常数值分数)。
GET /my_index/blogpost/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"title": "eggs"
}
},
{
"nested": {
"path": "comments",
"score_mode": "max", (1)
"query": {
"bool": {
"must": [
{
"match": {
"comments.name": "john"
}
},
{
"match": {
"comments.age": 28
}
}
]
}
}
}
}
]
}
}
}
-
返回最优匹配嵌套文档的
_score
给根文档使用。
Note
|
如果 |