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 リテラルの使用によるものです。さらに、実際の実装は、結合する可能性がありgeo_shape、オブジェクトに存在できない可変数のジオメトリであるため、WKT が結合で機能することを期待していました。

更新 1 ( Augmented Jacob の回答による) 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 

そして、エラーは理想的ではありませんが、ドキュメントの状態から、とにかく動作するとは思わないでしょう:

ノート

1 つの 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

述語を使用している場合、matchCrate は の生成された Lucene インデックスを利用して、geo_shape非常に高速に取得しますが、「正確な」結果ではありません (既にお気づきのとおり)。ただし、Lucene では 2 つのリレーション (結合) の地理空間的な一致は不可能であり、それが Crate がそれを実行できない理由です。ドキュメントでは、ここでも説明されています:
https://crate.io/docs/reference/en/latest/sql/joins.html#join-conditions

于 2017-01-02T15:30:24.783 に答える
0

Table A の Variable はgeomtypeですgeo_shapeが、B はwkttypestringです。

それらを一致するタイプに変更すると、問題が解決するはずですjava.lang.IllegalArgumentException

于 2016-12-22T18:51:16.853 に答える