Elasticsearch catalog
StarRocks は v3.1 以降、Elasticsearch catalog をサポートしています。
StarRocks と Elasticsearch はどちらも人気のある分析システムで、それぞれ異なる強みを持っています。StarRocks は大規模な分散コンピューティングに優れ、外部テーブルを通じて Elasticsearch からデータをクエリすることをサポートしています。Elasticsearch は全文検索機能で知られています。StarRocks と Elasticsearch の組み合わせにより、より包括的な OLAP ソリューションが提供されます。Elasticsearch catalog を使用すると、データ移行の必要なく、StarRocks 上で SQL ステートメントを使用して Elasticsearch クラスター内のすべてのインデックスデータを直接分析できます。
他のデータソースの catalog とは異なり、Elasticsearch catalog には作成時に default という名前のデータベースが 1 つだけ含まれています。各 Elasticsearch インデックスは自動的にデータテーブルにマッピングされ、default データベースにマウントされます。
Elasticsearch catalog の作成
構文
CREATE EXTERNAL CATALOG <catalog_name>
[COMMENT <comment>]
PROPERTIES ("key"="value", ...)
パラメータ
catalog_name
Elasticsearch catalog の名前です。命名規則は以下の通りです:
- 名前には文字、数字 (0-9)、アンダースコア (_) を含めることができます。文字で始める必要があります。
 - 名前は大文字と小文字を区別し、1023 文字を超えてはなりません。
 
comment
Elasticsearch catalog の説明です。このパラメータはオプションです。
PROPERTIES
Elasticsearch catalog のプロパティです。以下の表に、Elasticsearch catalog でサポートされているプロパティを示します。
| パラメータ | 必須 | デフォルト値 | 説明 | 
|---|---|---|---|
| hosts | Yes | None | Elasticsearch クラスターの接続アドレスです。1 つ以上のアドレスを指定できます。StarRocks はこのアドレスから Elasticsearch のバージョンとインデックスシャードの割り当てを解析できます。StarRocks は GET /_nodes/http API 操作によって返されるアドレスに基づいて Elasticsearch クラスターと通信します。したがって、hosts パラメータの値は GET /_nodes/http API 操作によって返されるアドレスと同じでなければなりません。そうでない場合、BEs または CNs は Elasticsearch クラスターと通信できない可能性があります。 | 
| type | Yes | None | データソースのタイプです。Elasticsearch catalog を作成する際にこのパラメータを es に設定します。 | 
| user | No | Empty | HTTP ベーシック認証が有効な Elasticsearch クラスターにログインするために使用されるユーザー名です。/cluster/state/nodes/http などのパスにアクセスする権限があり、インデックスを読み取る権限があることを確認してください。 | 
| password | No | Empty | Elasticsearch クラスターにログインするために使用されるパスワードです。 | 
| es.type | No | _doc | インデックスのタイプです。Elasticsearch 8 以降のバージョンでデータをクエリする場合、このパラメータを設定する必要はありません。Elasticsearch 8 以降のバージョンではマッピングタイプが削除されています。 | 
| es.nodes.wan.only | No | FALSE | StarRocks が Elasticsearch クラスターにアクセスしてデータを取得する際に hosts で指定されたアドレスのみを使用するかどうかを指定します。
  | 
| es.net.ssl | No | FALSE | Elasticsearch クラスターにアクセスするために HTTPS プロトコルを使用できるかどうかを指定します。StarRocks v2.4 以降のみこのパラメータの設定をサポートしています。
  | 
| enable_docvalue_scan | No | TRUE | Elasticsearch 列指向(カラムナ)ストレージからターゲットフィールドの値を取得するかどうかを指定します。ほとんどの場合、列指向(カラムナ)ストレージからデータを読み取る方が行指向(ロウ)ストレージから読み取るよりも優れています。 | 
| enable_keyword_sniff | No | TRUE | Elasticsearch で KEYWORD タイプのフィールドに基づいて TEXT タイプのフィールドをスニッフするかどうかを指定します。このパラメータが false に設定されている場合、StarRocks はトークン化後にマッチングを行います。 | 
例
次の例は、es_test という名前の Elasticsearch catalog を作成します:
CREATE EXTERNAL CATALOG es_test
COMMENT 'test123'
PROPERTIES
(
    "type" = "es",
    "es.type" = "_doc",
    "hosts" = "https://xxx:9200",
    "es.net.ssl" = "true",
    "user" = "admin",
    "password" = "xxx",
    "es.nodes.wan.only" = "true"
);
Predicate pushdown
StarRocks は、Elasticsearch テーブルに対するクエリで指定された述語を Elasticsearch にプッシュダウンして実行することをサポートしています。これにより、クエリエンジンとストレージソースの距離が最小化され、クエリパフォーマンスが向上します。以下の表に、Elasticsearch にプッシュダウンできるオペレーターを示します。
| SQL 構文 | Elasticsearch 構文 | 
|---|---|
= | term query | 
in | terms query | 
>=, <=, >, < | range | 
and | bool.filter | 
or | bool.should | 
not | bool.must_not | 
not in | bool.must_not + terms | 
esquery | ES Query DSL | 
クエリ例
esquery() 関数を使用して、SQL で表現できないマッチクエリやジオシェイプクエリなどの Elasticsearch クエリを Elasticsearch にプッシュダウンしてフィルタリングと処理を行うことができます。esquery() 関数では、カラム名を指定する最初のパラメータがインデックスと関連付けられ、2 番目のパラメータは Elasticsearch クエリの Elasticsearch Query DSL ベースの JSON 表現で、波括弧({})で囲まれています。JSON 表現には、match、geo_shape、bool などのルートキーが 1 つだけ含まれている必要があります。
- 
マッチクエリ
SELECT * FROM es_table WHERE esquery(k4, '{
"match": {
"k4": "StarRocks on elasticsearch"
}
}'); - 
ジオシェイプクエリ
SELECT * FROM es_table WHERE esquery(k4, '{
"geo_shape": {
"location": {
"shape": {
"type": "envelope",
"coordinates": [
[
13,
53
],
[
14,
52
]
]
},
"relation": "within"
}
}
}'); - 
ブールクエリ
SELECT * FROM es_table WHERE esquery(k4, ' {
"bool": {
"must": [
{
"terms": {
"k1": [
11,
12
]
}
},
{
"terms": {
"k2": [
100
]
}
}
]
}
}'); 
使用上の注意
- v5.x 以降、Elasticsearch は異なるデータスキャン方法を採用しています。StarRocks は Elasticsearch v5.x 以降からのデータクエリのみをサポートしています。
 - StarRocks は、HTTP ベーシック認証が有効な Elasticsearch クラスターからのデータクエリのみをサポートしています。
 count()を含むクエリなど、一部のクエリは StarRocks 上で Elasticsearch よりもはるかに遅く実行されます。これは、Elasticsearch がクエリ条件を満たす指定されたドキュメント数に関連するメタデータを直接読み取ることができ、要求されたデータをフィルタリングする必要がないためです。