语境
假设您有一组已定义嵌套映射的文档。还假设一些文档有嵌套文档,而一些没有:
文件 1
{
"id":1,
"nested":[
{
"x":1
}
]
}
文件 2
{
"id":2,
"nested":[
{
"x":2
}
]
}
文件 3
{
"id":3
}
问题
有没有办法执行以下 SQL 查询的等效项:
SELECT
r.id,
COUNT(*)
FROM
root r
LEFT JOIN
nested n
ON parent(n) = r
WHERE
n.x = 1 /* nested condition */
GROUP BY
r.id
使用 ElasticSearch 的查询 DSL 非常接近的事情是:
curl -XGET http://localhost:9200/nested/type/_search?pretty -d'
{
"fields":["id"],
"query":{
"nested":{
"query":{
"constant_score":{
"query":{
"term":{"x":1}
}
},
"boost":1.0
}
},
"path":"nested",
"score_mode":"total"
}
}
}'
但是,由于嵌套查询和嵌套过滤器的语义要求文档至少有一个嵌套文档,因此此处将过滤掉Document 3 (即“内连接”语义)。
如果文档没有嵌套文档,是否有解决方法/替代方法来防止文档被排除?
应用
上面要注意的是嵌套文档的条件。尽管在此示例中很简单,但可以轻松想象由于组合爆炸而无法预先计算基于多个动态条件的基于分数的聚合的情况。
上述查询的主要价值是它包含得分值为“0”的结果并保留全局文档得分排序,因此无法使用构面或即将推出的聚合模块进行计算。