CData Elasticsearch ドライバーの機能と優位性
Elasticsearch は、ドキュメント指向または半構造化データの保存、インデックス作成、検索、管理向けに設計された分散型の RESTful 全文検索エンジンです。Web サイトやドキュメントコレクション用のシンプルな検索エンジンの構築から、オートコンプリート、分析、AI、コグニティブコンピューティングワークロードのサポートまで、幅広い用途で活用されています。
Elasticsearch はスキーマレス / NoSQL という性質を持つため、データ管理はしばしば課題となります。REST API を使用すれば Elasticsearch の検索機能にアクセスできますが、他のアプリケーションやサービスとの連携にはカスタム開発が必要です。また、SQL API とベンダー提供のライブラリを使用する方法では、読み取り専用の限定的な SQL クエリ機能しか利用できず、ツール連携の選択肢もごく一部に限られます。
CData Elasticsearch ドライバーは、両方のメリットを活かした最適なソリューションを提供します。CData ドライバーは REST API と SQL API の機能を拡張し、データ管理のための標準準拠の SQL-92 インターフェースを提供します。さらに、ODBC / JDBC / ADO.NET などの標準規格をサポートしているため、ほぼすべてのツールとシームレスに連携できます。この方法論の有効性は、Elasticsearch 連携に関するナレッジベースの記事からもご確認いただけます(掲載されているのは連携可能なツールの一部です)。
この記事では、CData ドライバーの以下の特長について説明します。
Elasticsearch のすべてのデータにアクセス
Elasticsearch に対する完全な SQL クエリのサポート
Elasticsearch の JSON 構造をサポート
主要なツール、プラットフォーム、アプリケーションとの接続
ネイティブドライバーを上回るクエリパフォーマンス
Elasticsearch のすべてのデータにアクセス
CData Elasticsearch ドライバーは、ネイティブドライバーでは利用できない多くの機能を備え、Elasticsearch への比類のないアクセスを提供します。Elasticsearch へのアクセスを可能にする主な機能は以下のとおりです。
- SQL エンドポイントと REST エンドポイントの両方に接続(SQL エンドポイントのみではなく)
- Elasticsearch v2.2 以降で SQL アクセスを実現(ネイティブは v6.3 以降のみ対応)
- 商用サブスクリプションに加え、オープンソース版の Elasticsearch にも対応
- SCORE() 関数を明示的に使用しなくても、クエリ結果に関連性スコアを _score カラムとして返却
- 複数インデックスのクエリに対応(詳細は以下参照)
複数インデックスのクエリ
Elasticsearch SQL は、パターンマッチングを通じて複数インデックス(またはテーブル)のクエリをサポートしています。CData ドライバーは、SQL エンドポイントだけでなく REST エンドポイントでも複数インデックスのクエリに対応しています。以下の形式で複数インデックスをクエリできます。
| 結果ソース | SQL ステートメント | REST API エンドポイント |
|---|---|---|
| すべての利用可能なインデックス | SELECT * FROM [_all] | /_all/_search |
| 特定のインデックスのリスト | SELECT * FROM [index1, index2, index3] | /index1%2Cindex2%2Cindex3/_search |
| ワイルドカードパターンに一致するインデックス | SELECT * FROM [index*] | /index*/_search |
| パターンに一致するインデックス(除外指定あり) | SELECT * FROM [index*, -index3] | /index*%2C-index/_search |
SQL サポート
CData Elasticsearch ドライバーは、標準 SQL クエリを完全にサポートしています。カスタムアプリケーションやビジュアライゼーション用に手動で作成したクエリでも、BI、レポート、ETL ツールによって自動生成されたクエリでも問題なく実行できます。
完全な CRUD サポート
CData ドライバーは SQL API と REST API エンドポイントの両方をサポートしているため、SELECT、INSERT、UPDATE、DELETE ステートメントを使用して、Elasticsearch のデータを簡単に読み書きできます。
| 操作 | SQL ステートメント | 使用エンドポイント |
|---|---|---|
| インデックス内のすべてのドキュメントをクエリ | SELECT * FROM [myIndex]; | REST, SQL |
| インデックスに新しいドキュメントを作成 | INSERT INTO [myIndex] (myField1, myField2, myField3, ...) VALUES ('myValue1', 'myValue2', 'myValue3', ...); | REST |
| インデックス内の既存ドキュメントを更新 | UPDATE [myIndex] SET myField1 = 'myNewValue1' WHERE myId = '1'; | REST |
| インデックスから既存ドキュメントを削除 | DELETE FROM [myIndex] WHERE myId = '1'; | REST |
フィルタリング
CData ドライバーでは、LIKE 演算子だけでなく = 演算子を使用したフィルタリングも可能で、より精確なクエリを実行できます。この機能は便利ですが、それでも不正確な結果につながる場合があります。例えば、Elasticsearch は同じ単語を含んでいても順序が異なるレコードを返すことがあります。「blue sky」で検索すると「sky blue」を含むレコードが返されることがあります。CData ドライバーに組み込まれたクエリタイプロジックは、カラムを Analyzed(解析済み)または Non-Analyzed(未解析)として識別し、特定の演算子と検索値に基づいて最適な Elasticsearch クエリを発行します。
| WHERE 句 | カラムタイプ | Elasticsearch クエリタイプ |
|---|---|---|
| column = 'value' | Analyzed | Query String Query |
| column = 'value with spaces' | Analyzed | Match Phrase Query |
| column LIKE 'v_lu%' | Analyzed | Query String with wildcards |
| column = 'value' | Non-Analyzed | Query String Query* |
| column = 'value with spaces' | Non-Analyzed | Wildcard Query |
| column LIKE 'v_lu%' | Non-Analyzed | Wildcard Query with wildcards |
* Non-Analyzed カラムは大文字小文字を区別せずにマッチングできるため、4 つの一般的なケースがチェックされます:'myValue' OR 'MYVALUE' OR 'myvalue' OR 'Myvalue'
JOIN サポート
Elasticsearch では、join データタイプにより同一インデックス内のドキュメント間で親子関係を作成できます。CData ドライバーは join データタイプを活用して関連テーブルを分割し、親子関係間での SQL JOIN クエリを実現します。インデックス間で JOIN が必要な場合は、組み込みの SQL エンジンがクライアントサイドのインメモリ JOIN を実行し、データ操作の制限を解消します。Elasticsearch のサンプルを使用して、join データタイプで関連テーブルを構築できます。
例えば、sample インデックスに以下のドキュメントがある場合、ネイティブドライバーと CData ドライバーではクエリ結果が異なります。
サンプルインデックス: sample
{
"_index": "sample",
"_type": "doc",
"_id": "2",
"_score": 1,
"_source": {
"text": "What is your favorite motorcycle?",
"question_id": {
"name": "question"
}
}
},
{
"_index": "sample",
"_type": "doc",
"_id": "1",
"_score": 1,
"_source": {
"text": "What is your favorite company?",
"question_id": {
"name": "question"
}
}
},
{
"_index": "sample",
"_type": "doc",
"_id": "3",
"_score": 1,
"_routing": "1",
"_source": {
"text": "CData Software",
"question_id": {
"name": "answer",
"parent": "1"
}
}
},
{
"_index": "sample",
"_type": "doc",
"_id": "4",
"_score": 1,
"_routing": "1",
"_source": {
"text": "Elastic",
"question_id": {
"name": "answer",
"parent": "1"
}
}
},
{
"_index": "sample",
"_type": "doc",
"_id": "5",
"_score": 1,
"_routing": "1",
"_source": {
"text": "Suzuki V-Strom 650",
"question_id": {
"name": "answer",
"parent": "2"
}
}
},
{
"_index": "sample",
"_type": "doc",
"_id": "6",
"_score": 1,
"_routing": "1",
"_source": {
"text": "Yamaha FZ6",
"question_id": {
"name": "answer",
"parent": "2"
}
}
}
ネイティブドライバーでは、ドキュメント間の関係が保持されず、text というカラムを1つだけ持つ sample という単一テーブルが公開されます。一方、CData ドライバーでは、インデックス内のドキュメントの関係に基づいて sample_question と sample_answer という2つのテーブルが公開されます。
ネイティブドライバー
ネイティブ Elasticsearch ドライバーでデータをクエリすると、'text' という1つのカラムを持つ単一テーブルが返されます。
クエリ結果 (sample)
| text |
|---|
| What is your favorite company? |
| What is your favorite motorcycle? |
| CData Software |
| Elastic |
| Suzuki V-Strom 650 |
| Yamaha FZ6 |
CData ドライバー
一方、CData ドライバーでは、関係を定義する外部キーを含む複数のカラムを持つ、2つの関連テーブルが公開されます。
親 (sample_question)
| _id | _score | text |
|---|---|---|
| 1 | 0.0 | What is your favorite company? |
| 2 | 0.0 | What is your favorite motorcycle? |
子 (sample_answer)
| _id | sample_question_id | _score | text |
|---|---|---|---|
| 3 | 1 | 0.0 | CData Software |
| 4 | 1 | 0.0 | Elastic |
| 5 | 2 | 0.0 | Suzuki V-Strom 650 |
| 6 | 2 | 0.0 | Yamaha FZ6 |
JSON 構造のサポート
CData ドライバーは、Elasticsearch のレコードによく見られる配列やネストされた JSON オブジェクトなどの JSON 構造のクエリをサポートしています。組み込みのスキーマ検出機能と JSON 構造のフラット化により、Elasticsearch から必要なデータを正確に取得できます。
配列サポート
ネイティブ Elasticsearch ドライバーは(執筆時点では)配列内のデータのクエリをサポートしていません。CData ドライバーは配列へのアクセス(生の JSON データとして)をサポートするだけでなく、配列をフラット化して関連データにドリルダウンすることもできます。以下の JSON 配列を例に考えてみましょう。
{
...
"coords" : [35.91,-79.06],
...
}
CData Elasticsearch ドライバーは coords、coords.0、coords.1 カラムを公開します(以下は結果のサンプルです)。
| coords | coords.0 | coords.1 |
|---|---|---|
| [35.92,-79.06] | 35.91 | -79.06 |
ネストタイプのサポート
Elasticsearch で使用されるデータには、ネストされた JSON オブジェクトが含まれていることがよくあります。これらのオブジェクトをサポートしていないネイティブドライバーでは、クエリで多くのデータを取得できません。CData ドライバーはネストされたオブジェクトの検索をサポートし、データを細分化するためのフラット化機能も備えています。以下の JSON オブジェクトを例に考えてみましょう。
{
"manager": {
"name": "Ms. Manager",
"age": 35,
"location": "Flagship Store",
...
}
}
CData Elasticsearch ドライバーは manager をカラムとして公開するとともに、ネストされた各要素を個別のカラムとして公開します:manager.name、manager.age、manager.location(以下は結果のサンプルです)。
| manager | manager.name | manager.age | manager.location |
|---|---|---|---|
| { "name": "Ms. Manager", "age": 35, "location": "Flagship Store", ... } | Ms. Manager | 35 | Flagship Store |
プラットフォームサポート
バージョンやサブスクリプションの制限以外にも、ネイティブ Elasticsearch ドライバーの最大の制限の1つは、JDBC と ODBC 標準のみをサポートしていることです。一方、CData は ODBC(Windows、Linux、Mac)、JDBC、ADO.NET などのデータ中心の標準規格に加え、Excel、SSIS、PowerShell などのツール内で直接利用できる接続機能を提供しています。BI、分析、レポート、ETL 用のツールやアプリケーションを使用する場合でも、カスタムアプリケーションを構築する場合でも、CData ドライバーは必要な場所で Elasticsearch データへのライブアクセスを提供します。
パフォーマンス比較
CData JDBC ドライバーは、ネイティブドライバーの2倍以上の速度でデータを読み取ることができます。CData のエンジニアは、大規模なデータセットを高速に処理するために、クライアントサイドのリソースをより効率的に活用するドライバーを構築しました。
| JDBC クエリ時間(ミリ秒) | ||
|---|---|---|
| クエリ行数 | CData Software | ネイティブ |
| 25,000 | 1,016.9 (+35%) | 1,375.4 |
| ~10,000,000 | 199,577 (+155%) | 508,338 |
詳細については、パフォーマンス比較記事をご覧ください。
その他の機能
これらの主要機能と差別化要因に加えて、CData Elasticsearch ドライバーには、CData がサポートするすべてのデータソースで利用可能な追加機能も含まれています。
- コラボレーティブクエリ処理:強力な組み込み SQL エンジンが、サポートされている複雑なクエリ(フィルタリング、集計、JOIN など)を Elasticsearch にプッシュダウンしてサーバーサイドで実行し、サポートされていないクエリはクライアントサイド処理で対応します。
- 積極的な開発とメンテナンス:Elasticsearch API の変更に迅速に対応し、最新バージョンおよびアップデートとの互換性を確保しています。
無料トライアルと詳細情報
最新版の Elasticsearch ドライバーはこちらからダウンロードできます。すべてのドライバーには 30日間の無料トライアルが含まれています。既存のツールやアプリケーションでのドライバーの使用方法については、ナレッジベースをご覧ください。
ご不明な点がございましたら、サポートチームまでお気軽にお問い合わせください。