Elasticsearch データ ソース
概要
Elasticsearch は、増え続けるユースケースに対応できる、分散型の RESTful 検索および分析エンジンです。Elastic Stack の中核として、データを一元的に保存し、高速な検索、微調整された関連性、簡単にスケールする強力な分析を実現します。Elasticsearch SQL を使用すると、Elasticsearch インデックスに対して SQL クエリを実行でき、使い慣れた SQL 構文を使用してデータを操作しやすくなります。このトピックでは、Reveal アプリケーションで Elasticsearch データ ソースに接続して、データを視覚化および分析する方法について説明します。
サーバーの構成
インストール
- ASP.NET
- Node.js
ASP.NET アプリケーションの場合、Elasticsearch サポートを有効にするには、別の NuGet パッケージをインストールする必要があります。
dotnet add package Reveal.Sdk.Data.Elasticsearch
次に、アプリケーションに Elasticsearch プロバイダーを登録します。
builder.Services.AddControllers().AddReveal( builder =>
{
builder.DataSources.RegisterElasticsearch();
});
Node.js アプリケーションの場合、Elasticsearch データ ソースはメインの Reveal SDK パッケージにすでに含まれています。標準の Reveal SDK セットアップ以外に追加のインストールは必要ありません。
接続の構成
Elasticsearch のすべての接続プロパティは、データ ソース プロバイダーの実装を 通じてサーバー側で構成されます。
- ASP.NET
- Node.js
- Node.js - TS
// データ ソース プロバイダーを作成する
public class DataSourceProvider : IRVDataSourceProvider
{
public async Task<RVDataSourceItem> ChangeDataSourceItemAsync(IRVUserContext userContext, string dashboardId, RVDataSourceItem dataSourceItem)
{
// 必須: 基になるデータ ソースを更新する
await ChangeDataSourceAsync(userContext, dataSourceItem.DataSource);
if (dataSourceItem is RVElasticsearchDataSourceItem elasticsearchDataSourceItem)
{
// 特定のインデックスを使用して構成する
if (dataSourceItem.Id == "elasticsearchDataSourceItemId")
{
elasticsearchDataSourceItem.Index = "kibana_sample_data_ecommerce";
}
// またはカスタム SQL クエリを使用して構成する
if (dataSourceItem.Id == "elasticsearchDataSourceItemCustomQueryId")
{
elasticsearchDataSourceItem.CustomQuery = "SELECT * FROM \"kibana_sample_data_ecommerce\" WHERE \"customer_first_name\" = 'Eddie'";
}
// フィールドの複数値処理を構成する
elasticsearchDataSourceItem.FieldMultiValueLeniency = true;
}
return dataSourceItem;
}
public Task<RVDashboardDataSource> ChangeDataSourceAsync(IRVUserContext userContext, RVDashboardDataSource dataSource)
{
if (dataSource is RVElasticsearchDataSource elasticsearchDataSource)
{
// 接続プロパティを構成する
elasticsearchDataSource.Nodes = new List<string> { "http://localhost:9200" };
// オプション: SSL/TLS 証明書フィンガープリントを構成する
elasticsearchDataSource.CertificateFingerprint = "your_certificate_fingerprint";
// オプション: データ ソース レベルでフィールドの複数値処理を構成する
elasticsearchDataSource.FieldMultiValueLeniency = true;
}
return Task.FromResult(dataSource);
}
}
// データ ソース プロバイダーを作成する
const dataSourceItemProvider = async (userContext, dataSourceItem) => {
// 必須: 基になるデータ ソースを更新する
await dataSourceProvider(userContext, dataSourceItem.dataSource);
if (dataSourceItem instanceof reveal.RVElasticsearchDataSourceItem) {
// 特定のインデックスを使用して構成する
if (dataSourceItem.id === "elasticsearchDataSourceItemId") {
dataSourceItem.index = "kibana_sample_data_ecommerce";
}
// またはカスタム SQL クエリを使用して構成する
if (dataSourceItem.id === "elasticsearchDataSourceItemCustomQueryId") {
dataSourceItem.customQuery = "SELECT * FROM \"kibana_sample_data_ecommerce\" WHERE \"customer_first_name\" = 'Eddie'";
}
// フィールドの複数値処理を構成する
dataSourceItem.fieldMultiValueLeniency = true;
}
return dataSourceItem;
}
const dataSourceProvider = async (userContext, dataSource) => {
if (dataSource instanceof reveal.RVElasticsearchDataSource) {
// 接続プロパティを構成する
dataSource.nodes = ["http://localhost:9200"];
// オプション: SSL/TLS 証明書フィンガープリントを構成する
dataSource.certificateFingerprint = "your_certificate_fingerprint";
// オプション: データ ソース レベルでフィールドの複数値処理を構成する
dataSource.fieldMultiValueLeniency = true;
}
return dataSource;
}
// データ ソース プロバイダーを作成する
const dataSourceItemProvider = async (userContext: IRVUserContext | null, dataSourceItem: RVDataSourceItem) => {
// 必須: 基になるデータ ソースを更新する
await dataSourceProvider(userContext, dataSourceItem.dataSource);
if (dataSourceItem instanceof RVElasticsearchDataSourceItem) {
// 特定のインデックスを使用して構成する
if (dataSourceItem.id === "elasticsearchDataSourceItemId") {
dataSourceItem.index = "kibana_sample_data_ecommerce";
}
// またはカスタム SQL クエリを使用して構成する
if (dataSourceItem.id === "elasticsearchDataSourceItemCustomQueryId") {
dataSourceItem.customQuery = "SELECT * FROM \"kibana_sample_data_ecommerce\" WHERE \"customer_first_name\" = 'Eddie'";
}
// フィールドの複数値処理を構成する
dataSourceItem.fieldMultiValueLeniency = true;
}
return dataSourceItem;
}
const dataSourceProvider = async (userContext: IRVUserContext | null, dataSource: RVDashboardDataSource) => {
if (dataSource instanceof RVElasticsearchDataSource) {
// 接続プロパティを構成する
dataSource.nodes = ["http://localhost:9200"];
// オプション: SSL/TLS 証明書フィンガープリントを構成する
dataSource.certificateFingerprint = "your_certificate_fingerprint";
// オプション: データ ソース レベルでフィールドの複数値処理を構成する
dataSource.fieldMultiValueLeniency = true;
}
return dataSource;
}
ChangeDataSourceAsync メソッドでデータ ソースに加えられた変更は、ChangeDataSourceItemAsync メソッドに引き継がれません。両方のメソッドでデータ ソース プロパティを更新する必要があります。上記の例に示すように、ChangeDataSourceItemAsync メソッド内で ChangeDataSourceAsync メソッドを呼び出し、データ ソース アイテムの基になるデータ ソースをパラメーターとして渡すことをお勧めします。
認証
Elasticsearch の認証は、ユーザー名とパスワードの資格情報を使用してサーバー側で処理されます。認証オプションの詳細については、認証トピックを参照してください。
- ASP.NET
- Node.js
- Node.js - TS
public class AuthenticationProvider: IRVAuthenticationProvider
{
public Task<IRVDataSourceCredential> ResolveCredentialsAsync(IRVUserContext userContext, RVDashboardDataSource dataSource)
{
IRVDataSourceCredential userCredential = null;
if (dataSource is RVElasticsearchDataSource)
{
userCredential = new RVUsernamePasswordDataSourceCredential("elastic", "your_password");
}
return Task.FromResult<IRVDataSourceCredential>(userCredential);
}
}
const authenticationProvider = async (userContext, dataSource) => {
if (dataSource instanceof reveal.RVElasticsearchDataSource) {
return new reveal.RVUsernamePasswordDataSourceCredential("elastic", "your_password");
}
return null;
}
const authenticationProvider = async (userContext:IRVUserContext | null, dataSource: RVDashboardDataSource) => {
if (dataSource instanceof RVElasticsearchDataSource) {
return new RVUsernamePasswordDataSourceCredential("elastic", "your_password");
}
return null;
}
クライアント側の実装
クライアント側では、データ ソースの ID、タイトル、サブタイトルなどの基本的なプロパティを指定するだけです。実際の接続構成はサーバー上で行われます。
データ ソースの作成
手順 1 - RevealView.onDataSourcesRequested イベントのイベント ハンドラーを追加します。
const revealView = new $.ig.RevealView("#revealView");
revealView.onDataSourcesRequested = (callback) => {
// ここにデータ ソースを追 加する
callback(new $.ig.RevealDataSources([], [], false));
};
手順 2 - RevealView.onDataSourcesRequested イベント ハンドラーで、RVElasticsearchDataSource オブジェクトの新しいインスタンスを作成します。title プロパティと subtitle プロパティを設定します。RVElasticsearchDataSource オ ブジェクトを作成したら、それをデータ ソース コレクションに追加します。
revealView.onDataSourcesRequested = (callback) => {
const elasticsearchDS = new $.ig.RVElasticsearchDataSource();
elasticsearchDS.title = "My Elasticsearch Data Source";
elasticsearchDS.subtitle = "Elasticsearch";
callback(new $.ig.RevealDataSources([elasticsearchDS], [], false));
};
アプリケーションを実行すると、新しい視覚化を作成すると、新しく作成された Elasticsearch データ ソースが [データ ソースの選択] ダイアログに表示されます。
データ ソース アイテムの作成
データ ソース アイテムは、ユーザーが視覚化のために選択できる Elasticsearch データ ソース内の特定のデータセットを表します。クライアント側では、ID、タイトル、サブタイトルを指定するだけです。
revealView.onDataSourcesRequested = (callback) => {
// データ ソースを作成する
const elasticsearchDS = new $.ig.RVElasticsearchDataSource();
elasticsearchDS.title = "My Elasticsearch Data Source";
elasticsearchDS.subtitle = "Elasticsearch";
// データ ソース アイテムを作成する
const elasticsearchDSI = new $.ig.RVElasticsearchDataSourceItem(elasticsearchDS);
elasticsearchDSI.id = "my-data-source-item";
elasticsearchDSI.title = "My Elasticsearch Data Source Item";
elasticsearchDSI.subtitle = "Elasticsearch";
callback(new $.ig.RevealDataSources([elasticsearchDS], [elasticsearchDSI], false));
};
アプリケーションを実行すると、新しい視覚化を作成すると、新しく作成された Elasticsearch データ ソース アイテムが [データ ソースの選択] ダイアログに表示されます。
その他のリソース
API リファレンス
- ASP.NET
- Node.js
- RVElasticsearchDataSource - Elasticsearch データ ソースを表します
- RVElasticsearchDataSourceItem - Elasticsearch データ ソース アイテムを表します
- RVElasticsearchDataSource - Elasticsearch データ ソースを表します
- RVElasticsearchDataSourceItem - Elasticsearch データ ソース アイテムを表します