是否可以使用两个表中的形状发出空间连接?

时间:2016-12-22 15:27:24

标签: sql join spatial crate

我希望能够运行如下查询:

.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

2 个答案:

答案 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