我希望能够运行以下查询:
select A.*
from A
join B
on match(A.geom,B.wkt) using within;
但我得到:
ERROR: UnhandledServerException: java.lang.IllegalArgumentException: queryTerm must be a literal
样本模式:
create table if not exists A (
id integer,
geom geo_shape
);
create table if not exists B (
id integer,
wkt string index off
);
尝试wkt string
的原因是由于文档对WKT文字的使用。此外,由于我们的实际实现是我们可能会加入的几何数字,并且geo_shape
在对象中不存在,因此我们希望WKT能够与JOIN一起使用。
更新1 (每个增强雅各布的答案)尝试使用GEO_SHAPE加入GEO_SHAPE使用此架构:
create table if not exists B (
id integer,
wkt geo_shape
);
和以上查询会产生不同的错误:
SQLParseException: Couldn't create executionContexts from NodeOperations
... original-error: Can't handle Symbol io.crate.analyze.symbol.MatchPredicate@6666c921
,虽然错误并不理想,但由于文档状态下,我都不会指望它可以正常工作:
注意
一个匹配谓词无法结合JOIN的两种关系的列。
更新2 使用geo_shape加入geo_shape, match
不起作用,但是 within
可行,但是"确切"查询,至少在我们的2.4B行之间,性能使其大多是无法使用的。
select A.*
from A
join B
on within(B.wkt,A.geom);
如果您使用的是match
谓词板条箱利用geo_shape
的生成的Lucene索引变得非常快,但不是"精确"结果(如您已经注意到的那样)。但是,与Lucene无法进行两种关系(JOIN)的地理空间匹配,这就是为什么Crate无法做到这一点的原因。文档在这里也解释了:
https://crate.io/docs/reference/en/latest/sql/joins.html#join-conditions
表A中的变量geom
是类型geo_shape
,而B具有string
类型的wkt
。
将它们更改为匹配类型,它应该解决您的java.lang.IllegalArgumentException