我希望能够运行如下查询:
.text
但我明白了:
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
);
的原因归因于documentation's use of WKT literals。另外,由于我们的实际实现是可以连接的可变数量的几何,并且wkt string
不能存在于对象中,我们希望WKT可以使用连接。
更新1 (每Augmented Jacob's answer)尝试使用此架构加入geo_shape geo_shape:
geo_shape
以上查询会产生不同的错误:
create table if not exists B (
id integer,
wkt geo_shape
);
而且,虽然错误并不理想,但我认为自docs state以来无论如何都不会有效:
请注意
一个MATCH谓词不能组合连接的两个关系的列。
更新2 使用geo_shape加入geo_shape,SQLParseException: Couldn't create executionContexts from NodeOperations
... original-error: Can't handle Symbol io.crate.analyze.symbol.MatchPredicate@6666c921
不起作用,但match
无效,being "exact" queries,性能使其大部分无法使用,至少在我们的2.4B行中。
within
答案 0 :(得分:1)
如果您正在使用match
谓词Crate,则可以利用geo_shape
生成的Lucene索引获得非常快的速度,但不会"精确的"结果(你已经注意到了)。但是,Lucene不可能在两个关系(连接)上进行地理空间匹配,这就是Crate无法做到的原因。文档也在这里解释:
https://crate.io/docs/reference/en/latest/sql/joins.html#join-conditions
答案 1 :(得分:0)
表A中的变量geom
的类型为geo_shape
,而B的wkt
类型为string
。
将它们更改为匹配类型,它应解决您的java.lang.IllegalArgumentException