是否可以通过两个表的形状发出空间连接



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

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

相关内容

  • 没有找到相关文章

最新更新