OpenSearch能否支持复杂嵌套查询?嵌套查询转换及自动工具咨询
我正尝试将部分关系型数据库查询转换为OpenSearch查询,遇到了嵌套对象过滤的问题。我了解到,要对嵌套对象正确使用AND逻辑,必须将所有查询/过滤器放在单个NestedQuery下。把针对同一嵌套对象的多个NestedQuery用must连接是无效的,这个理解对吗?换句话说:
Pseudocode: NestedQuery(t1.Key = 1 && t1.Key = 5) != NestedQuery(t1.Key = 1) && NestedQuery(t1.Key = 5)
但如果确实如此,当文档包含多个嵌套对象,且查询逻辑无法(轻松/完全)拆分,没法把同一嵌套对象的所有过滤器放在单个NestedQuery下时,该怎么处理?
比如下面的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 OR t2.Key = 7) AND (t1.Key = 5 OR t2.Key = 9) )
这里t1.Key = 1和t1.Key = 5没法放在同一个NestedQuery下,因为它们被t2的逻辑交织在一起,而且两个嵌套文档没有共同的嵌套路径,也没有明确方法能在不破坏逻辑的前提下,把t1的逻辑放在一个NestedQuery、t2的逻辑放在另一个NestedQuery里。
能不能在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 AND t1.Key = 5) OR (t2.Key = 7 AND t2.Key = 9) OR (t1.Key = 1 AND t2.Key = 9) OR (t2.Key = 7 AND 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) )
但有没有不用手动预处理就能自动完成转换的方法?毕竟手动处理这类或更复杂的查询很容易出错。
我觉得奇怪的是,似乎没人抱怨这个问题,这类复杂查询在搜索功能里并不少见。所以我想知道自己是不是遗漏了什么关键点。
内容的提问来源于stack exchange,提问作者user2173353

