OpenSearch:它能支持复杂的嵌套查询吗?

OpenSearch: can it support complex nested queries?

提问人:user2173353 提问时间:11/17/2023 最后编辑:user2173353 更新时间:11/17/2023 访问量:19

问:

我一直在尝试将一些关系数据库查询复制到 OpenSearch 查询中,但我刚刚遇到了嵌套对象和筛选方面的一些问题。从我收集到的信息来看,为了在嵌套对象上正确使用运算符逻辑,您必须在单个嵌套查询下拥有所有查询/过滤器。对于同一个嵌套对象,有多个嵌套查询,由运算符联接不会削减它。我说得对吗?换言之:ANDmust

Pseudocode:
NestedQuery(t1.Key = 1 && t1.Key = 5) != NestedQuery(t1.Key = 1) && NestedQuery(t1.Key = 5)

但是,如果这是真的,那么当你的文档上有许多嵌套对象,并且查询的逻辑不允许以这种方式拆分查询时,会发生什么情况(很容易?根本不?)为了在单个嵌套查询下获取嵌套对象的所有过滤器?

例如,以下 SQL:

SELECT *
FROM Document d
INNER JOIN SubDocumentType1 t1 ON t1.Id = d.Id  -- nested document 1
INNER JOIN SubDocumentType2 t2 ON t2.Id = d.Id  -- nested document 2
WHERE (
    (t1.Key = 1 || t2.Key = 7) && (t1.Key = 5 || t2.Key = 9)
)

在这里,并且不能位于同一个嵌套查询下,因为存在围绕它的额外逻辑,并且两个嵌套文档查询没有单个嵌套路径(因为它们是两个不同的嵌套文档),也没有一种非常明显的方法将此逻辑分解为将逻辑保留在嵌套查询下,将逻辑保留在另一个嵌套查询下而不破坏逻辑。t1.Key = 1t1.Key = 5t2t1t2

有没有办法在 OpenSearch 中复制这样的东西? 我的布尔代数有点生疏,也许有人可以为 OpenSearch “简化”这样的表达式,但有没有更好、更自动化的方法?也许是一个将上述查询转换为 OpenSearch 可以处理的库?

我猜上面的SQL查询可以这样重写(如果我没记错的话......

SELECT *
FROM Document d
INNER JOIN SubDocumentType1 t1 ON t1.Id = d.Id  -- nested document 1
INNER JOIN SubDocumentType2 t2 ON t2.Id = d.Id  -- nested document 2
WHERE (
    (t1.Key = 1 && t1.Key = 5) || (t2.Key = 7 && t2.Key = 9) ||
    (t1.Key = 1 && t2.Key = 9) || (t2.Key = 7 && t1.Key = 5)
)

...这似乎是可以在 OpenSearch 世界中工作的查询的正确传输,就像在这个伪代码中一样:

    NestedQuery(t1.Key = 1 && t1.Key = 5) ||
    NestedQuery(t2.Key = 7 && t2.Key = 9) ||
    ( NestedQuery(t1.Key = 1) && NestedQuery(t2.Key = 9) ) ||
    ( NestedQuery(t2.Key = 7) && NestedQuery(t1.Key = 5) )

...可以简化为:

    ( NestedQuery(t1.Key = 1) && NestedQuery(t2.Key = 9) ) ||
    ( NestedQuery(t2.Key = 7) && NestedQuery(t1.Key = 5) )

...但是有没有办法自动完成此操作,而无需我预处理 OpenSearch 查询,在将它们发送到 OpenSearch 之前将它们转换为“关系正确”的东西?因为,你可以很容易地想象,如果你尝试手动操作,这可能会失控,无论是对于这样的查询还是更复杂的查询......

我觉得很奇怪,没有人抱怨这一点,因为在搜索功能方面,这种复杂的查询并不少见。所以,我想知道我是否错过了什么。

SQL 嵌套 OpenSearch

评论


答: 暂无答案