0

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

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 literals。此外,由于我们的实际实现是可变数量的几何图形,我们可能会针对这些几何图形进行连接并且geo_shape不能存在于对象中,因此我们希望 WKT 可以与连接一起使用。

更新 1(根据增强 Jacob 的回答)尝试使用 geo_shape join 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 

而且,虽然错误并不理想,但我不希望它能够正常工作,因为文档状态

笔记

一个 MATCH 谓词不能组合连接的两个关系的列。

更新 2使用 geo_shape join geo_shape,match不起作用但within可以工作,但是,作为“精确”查询,性能使其几乎无法使用,至少在我们的 2.4B 行中是这样。

select A.*
  from A
  join B
    on within(B.wkt,A.geom);
4

2 回答 2

1

如果您使用match谓词 Crate 会利用生成的 Lucene 索引geo_shape来获得非常快但不是“精确”的结果(正如您已经注意到的)。但是,Lucene 无法对两个关系(连接)进行地理空间匹配,这就是 Crate 无法做到这一点的原因。文档也在这里解释:
https ://crate.io/docs/reference/en/latest/sql/joins.html#join-conditions

于 2017-01-02T15:30:24.783 回答
0

表 A 中的变量geom是类型geo_shape,而 Bwkt是类型string

将它们更改为匹配类型,它应该可以解决您的问题java.lang.IllegalArgumentException

于 2016-12-22T18:51:16.853 回答