<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title><![CDATA[Kibana - Elasticsearch Labs]]></title>
    <description><![CDATA[Articles and tutorials from the Search team at Elastic]]></description>
    <copyright><![CDATA[© 2026. Elasticsearch B.V. All Rights Reserved]]></copyright>
    <image>
      <title><![CDATA[Kibana - Elasticsearch Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1121c0bf0e8a6e65/6a88da6340a1841030ef456f/search-labs-thumbnail.png</url>
      <link>https://www.elastic.co/jp/search-labs/blog/category/kibana</link>
    </image>
    <link>https://www.elastic.co/jp/search-labs/blog/category/kibana</link>
    <atom:link href="https://www.elastic.co/jp/search-labs/rss/category/kibana.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[jp]]></language>
    <lastBuildDate>Mon, 28 Sep 2026 23:51:32 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Kibana Dashboards API：GA前に50以上のチームでテストされた、あらゆるパネルタイプに対応する安定した仕様]]></title>
    <description><![CDATA[Kibanaのダッシュボードをコードとして管理：Kibana APIとTerraformを使ってGitにコミットし、環境間で展開し、導入を自動化します。]]></description>
    <content:encoded><![CDATA[<p><a href="https://dashboardsapispec.kibana.dev/dashboards#tag/Dashboards">KibanaのDashboards APIとVisualizations API</a>は、Elastic 9.5で本番環境に対応しており、すべてのサブスクリプションティアで利用可能で、完全な下位互換性も備えています。ダッシュボードをJSONとして定義してGitにコミットし、継続的インテグレーションと継続的デプロイメント（CI/CD）パイプライン、<a href="https://registry.terraform.io/providers/elastic/elasticstack/latest/docs/resources/kibana_dashboard">Terraform</a>、またはすでにお持ちのツールを使って環境全体にデプロイします。<a href="https://www.elastic.co/search-labs/blog/kibana-dashboards-as-code-terraform-api">9.4のテクニカルプレビュー</a>期間中に50以上のチームがAPIをテストし、中には既に本番環境で運用しているチームもあります。バージョン9.5では<a href="https://dashboardsapispec.kibana.dev/tags.html">タグ</a>用の新しいエンドポイント（テクニカルプレビュー中）が追加され、<a href="https://dashboardsapispec.kibana.dev/markdowns.html">マークダウン</a>および<a href="https://dashboardsapispec.kibana.dev/links.html#tag/Links">リンク</a>パネルエンドポイントはElastic Cloud Serverlessで利用可能となり、9.6でリリース予定です。</p><h2>Kibana Dashboards APIにおける後方互換性の意味</h2><p>テクニカルプレビュー中はリリース間でAPIの仕様が変更される可能性があります。[1]現在はこれは該当しません。一般提供（GA）開始とは、以下のことを意味します。</p><ul><li><p><strong>完全な後方互換性。</strong>新しいフィールドやパネルの種類は今後追加されますが、既存のフィールドや動作は変更されません。今後、互換性を損なうような変更を行う場合は、非常に慎重に検討し、新しいメジャーバージョンでのみ導入します。</p></li><li><p><strong>本番環境での利用に対応し、完全にサポートさ。</strong>このAPIには、Elasticの完全なサポート保証が付いています。本番環境では、自動化された導入、環境の昇格、およびプログラムによるダッシュボード管理に安全にご利用いただけます。</p></li></ul><h2>タグ、マークダウン、リンクパネル用の新しいKibana APIエンドポイント</h2><p>Elastic 9.5では、<a href="https://dashboardsapispec.kibana.dev/tags.html"><strong>タグ</strong></a>用の新しいスタンドアロンエンドポイントも導入され、ダッシュボードの分類やフィルタリングが可能になりました。専用のCRUDエンドポイントによりプログラムによる管理が可能になり、複数の環境にわたって大規模にダッシュボードを整理しやすくなりました。	</p><p>新しい<a href="https://dashboardsapispec.kibana.dev/markdowns.html"><strong>マークダウン</strong></a>および<a href="https://dashboardsapispec.kibana.dev/links.html#tag/Links"><strong>リンク</strong></a>パネルエンドポイントは現在Serverlessで利用可能で、次回のスタックリリース（9.6）に搭載される予定です。</p><h2>Kibana Dashboards APIはどのようなパネル型をサポートしていますか？</h2><p>Dashboards APIは、9.5のすべての<em>値渡し</em>パネル（再利用のために保存されたライブラリパネルとは対照的に、ダッシュボードで直接定義されたもの）をサポートしています。サポートされているすべてのパネル型には、型指定され検証済みのスキーマがあります。</p><p><strong>パネル型</strong></p><p><strong>ステータス</strong></p><p>XYチャート</p><p>サポートあり</p><p>メトリクス</p><p>サポートあり</p><p>円グラフ</p><p>サポートあり</p><p>ゲージ</p><p>サポートあり</p><p>ヒートマップ</p><p>サポートあり</p><p>データ表</p><p>サポートあり</p><p>ツリーマップ</p><p>サポートあり</p><p>Discoverセッション</p><p>サポートあり</p><p>コントロール</p><p>サポートあり</p><p>マークダウン</p><p>サポートあり</p><p>リンク</p><p>サポートあり</p><p>MLパネル</p><p>サポートあり</p><p>オブザーバビリティパネル</p><p>サポートあり</p><p>マップ</p><p>まもなくリリース</p><p>Vega</p><p>まもなくリリース</p><h2>Kibanaのダッシュボードをコードとして管理する方法</h2><p>Dashboards APIを使用すると、完全なダッシュボード・アズ・コードのワークフローが実現できます。ダッシュボードをクリーンで差分比較可能なJSONとしてエクスポートし、それをGitにコミットして真の情報源とし、プルリクエストで変更内容を確認し、開発環境、ステージング環境、本番環境に同じ定義をデプロイできます。ダッシュボードをコードとして管理するようになったら、Gitを唯一の信頼できる情報源として扱います。UIで直接行った変更は、次回デプロイ時に上書きされます。</p><p>ダッシュボードをスペース、クラスター、またはステージ間で移動する際の主な課題は、ダッシュボードがデータビューやライブラリの視覚化などのオブジェクトをIDで参照することです。これらのIDは自動生成され、環境ごとに異なるため、ある環境からエクスポートされたダッシュボードが、別の環境には存在しないオブジェクトを指し示すことがあります。この問題を解決するには3つの方法があり、自動化の度合いが高い順に以下に示します。</p><ul><li><p><strong>Terraformを使用する。</strong><a href="https://registry.terraform.io/providers/elastic/elasticstack/latest/docs/resources/kibana_dashboard">Elastic Stack Terraformプロバイダー</a>は各リソースを追跡し、環境ごとにIDを自動マッピングするため、開発から本番環境へダッシュボードを移行する際に参照が一貫して保たれます。</p></li><li><p><strong>値渡しの</strong><a href="https://www.elastic.co/docs/explore-analyze/visualize/esorql"><strong>Elasticsearchクエリ言語（ES|QL）パネル</strong></a><strong>を定義する。</strong>パネルを構築する最もポータブルな方法は、ES|QLを使用してダッシュボードで直接可視化を定義することです。<a href="https://www.elastic.co/docs/explore-analyze/query-filter/languages/esql-kibana">ES|QL</a>クエリは、クエリ内で指定したインデックスからデータを読み取るため、パネルにはData viewやライブラリオブジェクトへの外部参照は含まれません。その結果、完全に自己完結型のポータブルダッシュボードとなります。</p></li><li><p><strong>一致するIDを割り当てる。</strong>Data viewやライブラリの視覚化など、保存済みのオブジェクトを参照する場合は、POST（IDを自動生成）ではなく、PUT（アップサート）を使用して、選択したIDでオブジェクトを作成してください。「logs-prod」のような人間が読みやすいIDを使うことで、環境を超えて再利用・認識しやすくなります。</p></li></ul><p>これらの移植性パターンとダッシュボード・アズ・コードのワークフロー全体に関する詳細な説明については、<a href="https://www.elastic.co/docs/explore-analyze/dashboards/manage-dashboards-as-code#dashboards-as-code-portability">「ダッシュボードをコードとして管理する」</a>ドキュメントをご覧ください。</p><h3>PUTメソッドを使用してDashboards APIでKibanaダッシュボードを作成</h3><p>ここでは、ダッシュボード名（service-health-overview）を使用してカスタムIDを割り当てるために、POSTではなくPUTを使用してメトリックパネルを含むダッシュボードを作成する簡単な例を示します。ライブラリに保存されたスタンドアロンの可視化を作成する場合も、同じロジックが適用されます。</p>PUT kbn:/api/dashboards/service-health-overview
{
  "title": "Service health overview",
  "description": "Key service metrics — managed via API",
  "tags": [
    "production",
    "sre-team"
  ],
  "panels": [
    {
      "type": "vis",
      "grid": {
        "x": 0,
        "y": 0,
        "w": 12,
        "h": 8
      },
      "config": {
        "title": "Error rate (5xx)",
        "type": "metric",
        "data_source": {
          "type": "esql",
          "query": "FROM logs-* | WHERE http.response.status_code &gt;= 500 | STATS error_rate=count(*) BY host.name"
        },
        "metrics": [
          {
            "type": "primary",
            "column": "count"
          }
        ]
      }
    }
  ]
}<h2>Kibana Dashboards APIロードマップ：マップ、Vega、スタンドアロンのエンドポイント</h2><p>APIの展開範囲を積極的に拡大していきます。次に、マップとVegaパネルのサポートを進め、それらに型付きスキーマを追加します。また、ダッシュボードのライフサイクルから切り離したDiscoverセッション（既存のダッシュボードパネルのサポートを超えて）、Vega、マップ、Annotations向けのスタンドアロンCRUDエンドポイントも構築しています。</p><p>スキーマ定義の詳細は、<a href="https://dashboardsapispec.kibana.dev/dashboards#tag/Dashboards">Dashboards APIドキュメント</a>をご覧ください。Terraformユーザー向けには<a href="https://registry.terraform.io/providers/elastic/elasticstack/latest/docs/resources/kibana_dashboard">Elastic Stack Terraformプロバイダー</a>が一般提供のDashboards APIをサポートしています。</p><h2>注</h2><ol><li><p>コアエンドポイントはテクニカルプレビュー版から変更されていません。9.4向けに構築した統合機能は、9.5でも動作します。唯一の破壊的変更は、ダッシュボード一覧と所要時間単位のフォーマットに影響を与える2つの小さな変更で、<a href="https://www.elastic.co/docs/release-notes/kibana/breaking-changes">こちら</a>に記載されています。</p></li></ol>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/dashboards-as-code-kibana-api</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/dashboards-as-code-kibana-api</guid>
    <category><![CDATA[Kibana]]></category>
    <category><![CDATA[開発者エクスペリエンス]]></category>
    <category><![CDATA[統合]]></category>
    <dc:creator><![CDATA[Teresa Alvarez Soler]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8ed7e33de291f255/6a730619c8b7ac02b251f9d3/image1.png" length="0" type="image/png"/>
    <pubDate>Wed, 05 Aug 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[プロンプトから1分以内にダッシュボードを作成、コストを5分の1に削減：KibanaのAIダッシュボードとカスタムVega-Liteチャート]]></title>
    <description><![CDATA[指標を自然言語で説明すれば、KibanaのAIチャットが、散布図から条件付き書式、カスタムツールチップまで、ES|QLベースのダッシュボードとVega-Liteチャートを生成します。]]></description>
    <content:encoded><![CDATA[<p>Kibanaの<a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/chat">AIチャット</a>は現在、自然言語のプロンプトから1分以内に、<a href="https://www.elastic.co/docs/explore-analyze/visualize/esorql">Elasticsearch Query Language（ES|QL）</a>を基盤とする完全なダッシュボードを作成します。Elastic 9.5では、この機能が<a href="https://www.elastic.co/jp/search-labs/blog/ai-dashboard-generation-elastic-agent-kibana">9.4でのテクニカルプレビュー</a>を経て一般提供（GA）となり、失敗したクエリを再試行するエラー回復機能、階層型モデルルーティングによってES|QL生成コストを5分の1に抑える機能、インタラクティブなフィルターコントロールが利用可能になります。今回のリリースでは、散布図、箱ひげ図、条件付き書式、カスタムツールチップなど、通常はJSONで手動コーディングする必要がある<a href="https://www.elastic.co/docs/explore-analyze/visualize/custom-visualizations-with-vega">Vega-Lite</a>チャートを自然言語で作成する機能も追加されました。</p><h2>KibanaのAIダッシュボード作成の新機能</h2><p><strong>機能</strong></p><p><strong>テクニカルプレビュー（9.4）</strong></p><p><strong>一般提供（GA）（9.5）</strong></p><p>エラー処理</p><p>失敗したES|QLクエリの再試行なし</p><p>クエリを検査・調整しながら最大3回まで自動的に再試行</p><p>ES|QL生成コスト</p><p>すべてのクエリをプライマリモデルにルーティング</p><p>階層型モデルルーティングにより、コストを最大5分の1に抑制</p><p>時間範囲</p><p>固定のデフォルト期間</p><p>データの時間的分布に基づく自動選択</p><p>フィルターコントロール</p><p>サポートなし</p><p>最も関連性の高いフィールドに自動的に追加</p><p>Vega-Liteチャート</p><p>サポートなし</p><p>散布図、箱ひげ図、条件付き書式、カスタムツールチップなどを自然言語で作成</p><p>チャート編集</p><p>サポートなし</p><p>既存のVega-Liteパネルを自然言語で編集</p><h3>AIダッシュボード生成の自動エラー回復</h3><p>テクニカルプレビューでは、エージェントが失敗したES|QLクエリを再試行しませんでした。9.5では、クエリエラーを検出し、各エラーを検査してクエリを調整しながら、最大3回まで再試行します。実際には、これにより空のパネルが発生する問題の大半が解消され、最初の試行で正しくレンダリングされるダッシュボードが生成されます。</p><h3>Elastic 9.5では、なぜAIダッシュボードの作成コストが下がるのか？</h3><p>ダッシュボード生成のすべてのステップで、同じレベルの推論が必要なわけではありません。9.5では、ES|QL生成はデフォルトで軽量モデルにルーティングされ、必要な場合にのみプライマリモデルにフォールバックします。<a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/connectors">コネクタ</a>でAnthropicのClaude Opus 4.8を使用している場合、すべてのパネルにおけるES|QL生成コストを5分の1に抑えられます。</p><h3>データに基づく時間範囲の自動選択</h3><p>ダッシュボードは、適切な期間のデータを表示してこそ役立ちます。エージェントは、ユーザーが特定の時間範囲を指定しない限り、クエリ対象のデータに適した時間範囲を選択するための改良されたロジックを適用するようになりました。固定の期間をデフォルトで使用するのではなく、データの時間分布を考慮し、進行中のインシデントであれば直近1時間、トレンド分析であれば過去90日間というように、適切な範囲へ調整します。</p><h3>AI生成ダッシュボードへのフィルターコントロールの自動追加</h3><p>ダッシュボード作成でコントロールがサポートされるようになりました。コントロールとは、基盤となるクエリを編集することなく、フィールド値に基づいてダッシュボードの表示内容を絞り込めるインタラクティブなフィルターです。ダッシュボードを生成する際、エージェントはフィルタリングに最も関連性の高いフィールドのコントロールを上部に自動的に追加します。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4a5520e66ae76001/6a719a218a155220ed6498e7/image3.png" alt="Kibana AI chat generating an ES|QL-backed host metrics dashboard with automatic filter controls in 71 seconds" /><h2>自然言語によるVega-Liteチャート：デフォルトを超えるチャートタイプと書式設定</h2><p><a href="https://vega.github.io/vega/">Vega</a>と<a href="https://vega.github.io/vega-lite/examples/">Vega-Lite</a>は、Kibanaで幅広いチャートタイプとカスタマイズをサポートしています。9.5では、自分でコードを書く代わりに、自然言語でこれらのチャートを作成できます。 </p><h3>散布図、箱ひげ図などのVega-Liteチャートタイプ</h3><p><a href="https://vega.github.io/vega-lite/examples/">Vega-Lite</a>は、散布図、箱ひげ図、ファセットを使用したスモールマルチプル、バブルチャート、複合チャート（ヒストグラムとヒートマップの組み合わせなど）をはじめ、さまざまなチャートタイプをサポートしています。「<em>応答時間とリクエストサイズの散布図をサービス名ごとに色分けして表示してください</em>」といったプロンプトを入力すると、適切なデータマッピングが設定されたVega-Liteパネルが生成されます。生成されたチャートにはKibanaのデフォルトのカラーパレットが使用されるため、ダッシュボードの他の部分と自然に調和します。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf1651fe7ac903d47/6a719a49f124649f746fc1b4/image5.png" alt="Kibana dashboard with four Vega-Lite charts: box plot, bubble chart, faceted small multiples, and heatmap." /><h3>標準チャートの条件付き書式、カスタムツールチップ、ラベル</h3><p>棒グラフ、折れ線グラフ、面グラフなど、ダッシュボードで標準的にサポートされているチャートタイプでも、デフォルト機能以上の制御が必要になる場合があります。チャットからVega-Liteを使用することで、そのギャップを埋められます。たとえば、次のようなことができます。</p><ul><li><p><strong>条件付きの色設定：</strong>しきい値を超えたデータポイントを異なる色で表示できます。たとえば、ある指標がサービスレベル目標（SLO）を超えた場合に、折れ線グラフのデータポイントや棒グラフの棒を赤色にできます。エージェントに「<em>折れ線グラフで500msを超えるポイントをすべて赤色にしてください</em>」と依頼できます。 </p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc1211784e9033557/6a719a6ab966e1736163d7d1/image1.png" alt="Vega-Lite line and bar charts in Kibana with conditional colour formatting showing data points above a threshold in red" /><p></p></li><li><p><strong>カスタムマークとラベル：</strong>データポイントに絵文字、記号、インラインテキストラベルを追加し、ステータスをひと目で確認できるようにします。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte3c59c3748484bc1/6a719aa02888394fdc07bac1/image2.png" alt="Lite horizontal bar chart in Kibana with emoji flag labels and custom tooltip showing requests by country" /><p></p></li><li><p><strong>カスタムツールチップ：</strong>チャートの軸には含まれない追加の指標、コンテキスト、計算値をホバー時に表示できます。たとえば、「<em>レコードの総数と各棒の割合を表示するツールチップを追加してください</em>」と依頼できます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt43f241f4382b5b90/6a719ab7ded0cf3367f49275/image4.png" alt="Vega-Lite stacked bar chart in Kibana with custom tooltip showing total records and percentage of total by extension" /><p></p></li></ul><p>この機能は、既存のVegaチャートの編集にも使用できます。カラースケールの変更、軸の調整、マークタイプの切り替えなど、Vega-Liteパネルを微調整する必要がある場合は、JSONコードを直接編集する代わりに、変更内容をチャットで伝えてください。</p><h2>Kibanaで自然言語によるVega-Lite生成を実現した仕組み</h2><p>文章からVega-Liteチャートを生成する処理は、単に<em>モデルに一度JSONの生成を依頼する</em>だけではありません。自然言語で表された意図を、検証済みのデータに基づくチャートへ変換する小規模なエージェント型パイプラインを構築しました。</p><p>リクエストを受け取ると、エージェントはまずVega-Liteが適しているかどうかを判断します。Vega-Liteのリクエストでは、Elasticsearchに対する実際のES|QLクエリに可視化の根拠を置き、その後、モデルを使用してVega-Liteコードを生成します。レンダリング前に、結果は正規化レイヤーを通過し、そこでスキーマが修正され、正準クエリが関連付けられます。また、安全にレンダリングするための変換も適用します。 </p><p>このワークフローの信頼性を高めるため、いくつかの設計上の工夫を取り入れています。</p><ul><li><p><strong>型指定されたツール呼び出し：</strong>チャート作成は、自由形式のVega-Liteを会話に貼り付けるのではなく、構造化されたツール呼び出しとして実行されます。</p></li><li><p><strong>制約付き生成</strong>：モデルは定義済みのスキーマ内でVega-Liteコードを生成するため、出力の予測可能性が高まり、検証も容易になります。</p></li><li><p><strong>厳選された例：</strong>ファセット、レイヤーマーク、ヒートマップなどの構造パターンが、基盤となるデータをコピーすることなくガイダンスを提供します。</p></li><li><p><strong>実行・検証ループ</strong>：チャート作成前にクエリが実行され、検証に失敗すると、ES|QL生成が修正されたうえで再試行されます。</p></li></ul><h2>KibanaでAIダッシュボード作成とVega-Liteチャートを試す</h2><p>自然言語によるダッシュボード作成とVega-Liteチャートを試すには、<strong>Elastic 9.5</strong>にアップグレードするか、<a href="https://cloud.elastic.co/registration">無料トライアル</a>を開始して、Kibanaで<strong>チャット</strong>を開きます。次に、データからダッシュボードを作成するようエージェントに依頼します。Vega-Liteでは、散布図やバブルチャートなど、これまで作りたいと思いながら作成したことのないチャートを依頼してみてください。結果が思いどおりでなければ、エージェントに変更したい内容を伝えてください。エージェントが対話しながら調整します。</p><p>この機能を使用するには、Enterpriseライセンスが必要です。<a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/chat#get-started">はじめに</a>。</p><p><em>本記事に記述されているあらゆる機能ないし性能のリリースおよびタイミングは、Elasticの単独裁量に委ねられます。現時点で提供されていないあらゆる機能ないし性能は、すみやかに提供されない可能性、または一切の提供が行われない可能性があります。</em></p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/ai-dashboards-kibana-vega-lite</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/ai-dashboards-kibana-vega-lite</guid>
    <category><![CDATA[Kibana]]></category>
    <category><![CDATA[ES|QL]]></category>
    <dc:creator><![CDATA[Marta Bondyra,Teresa Alvarez Soler]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt54406ad0378bc5fc/6a7199ffed03ccee0dac9d7c/image6.png" length="0" type="image/png"/>
    <pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[137,000人、人間の判断はゼロ：Elasticsearchによるエージェンティックな災害対応]]></title>
    <description><![CDATA[ハリケーンの襲来時に、ディスパッチャーを必要とせず、Kibana検出ルール、ワークフロー、AIエージェントを使用して、7か所の施設にいる137,000人の軍人を自動的に移動させた方法をご覧ください。]]></description>
    <content:encoded><![CDATA[<p>Elastic社は、7つの基地にまたがる13万7000人の軍関係者の自動避難を、人間の介入なしに調整しました。カテゴリー4のハリケーンがハンプトン・ローズの海岸線を直撃します。Elasticsearchの地理空間エンリッチメントにより、インデックス作成時に影響区域内のすべての施設が特定され、Kibanaの検出ルールがトリガーされ、ワークフローがAIエージェントの会話を開始します。エージェントは収容能力、距離、拠点の適合性を分析した上で、1回の処理で16件の避難および受け入れ通知を送信します。未加工のGDACSイベントから連携アクションまで、すべて自動で実行されます。</p><p>毎年、自然災害によって、緊急事態管理者、軍司令官、公安当局者は、限られた時間の中で重大な決断を迫られることになります。従来、こうした意思決定は、緊急連絡網やスプレッドシート、そして何十人もの人々に分散した組織的知識に依存しています。調整にかかる手間だけでも、貴重な時間が奪われます。</p><p>本記事では、脅威を検知し、ロジスティクスを推論して自動的にアクションを実行する災害対応向けの即応性に優れたエージェント型連携システムをElasticがどのように提供できるかをご紹介します。具体例として、シミュレーションを構築しました。ハンプトン・ローズの海岸線を脅かす架空のカテゴリー4のハリケーンによって、7つの軍事施設にわたる137,000人以上の要員の自動再配置がトリガーされるというものです。</p><p><strong>免責事項：</strong><strong>これはデモンストレーション目的で作成された完全に架空のシナリオです。 </strong>ハリケーンELARA-26は実在しません。施設の所在地は、公開されている実際の地理データ（米国国防総省［DoD］のMilitary Installations, Ranges, and Training Areas［MIRTA］データセット）に基づいたものですが、人員数、収容可能人数、資産、連絡先メールアドレス、ミッションプロファイルなどの運用データはすべて完全に架空のものです。このデモに含まれる内容は、実際の軍事的な即応態勢、能力、または運用手順を反映したものではありません。</p><h2>自動化された災害対応に地理空間とエージェント型の連携が必要な理由</h2><p>自然災害によって重要なインフラが脅かされると、次のような調整の課題が直ちに発生します。</p><ul><li><p>影響ゾーンにある施設はどれですか？</p></li><li><p>何人の人員を移動させる必要があるか？</p></li><li><p>どこに行けばいいのか、そしてそれらの施設には収容能力があるか？</p></li><li><p>今すぐ連絡する必要があるのは誰か？</p></li></ul><p>これらの質問は待ってくれません。 その答えも同様です。</p><h2>パイプラインのデプロイ：要件とセットアップ</h2><p><a href="https://github.com/tehbooom/elastic_natural_disaster/blob/main/README.md">サンプルリポジトリのこちら</a>にある手順に従って、<a href="https://www.elastic.co/docs/explore-analyze/elastic-inference/connect-self-managed-cluster-to-eis#set-up-eis-with-cloud-connect">Cloud Connect</a>を介してElastic Inference Service（EIS）を使用するローカルElasticクラスターをデプロイします。</p><h2>Elasticsearchのエージェント型災害対応パイプラインの仕組み</h2><p>このパイプラインには、エンドツーエンドで連携して機能する7つのレイヤーがあります。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf09bfae87ab35bec/6a4693ef31bdbbe3ef8b33ae/61814cddea0409162fb057c2113e0a496c105238-1999x275.png" alt="Pipeline flowchart Alt text: Horizontal flowchart with seven labeled boxes connected by arrows: GDACS feed, ingest pipeline, enrich (geo_shape), detection rule, workflow, AI agent, and email." /><ol><li><p><strong>データインジェスト：</strong>Elasticsearchに送信されたGlobal Disaster Alert and Coordination System（GDACS）の災害イベント。</p></li><li><p><strong>インジェストパイプライン</strong>：GeoJSONがインジェストされ、Elastic Common Schema（ECS）に正規化されます。</p></li><li><p><strong>地理空間エンリッチメント：</strong>イベントの影響エリアのポリゴンがインデックス登録された軍事施設の境界と照合されます。</p></li><li><p><strong>アラート：</strong>災害がいずれかのインストール環境と交差すると、Kibanaの検出ルールが作動します。</p></li><li><p><strong>ワークフローの自動化：</strong>アラートによってKibanaワークフローがトリガーされ、AIエージェントの会話が開始されます。</p></li><li><p><strong>AI推論：</strong>エージェントは、影響を受ける施設、その資産、および最寄りの支援施設をもとに推論を行い、すべての資産と人員の再配置を決定します。</p></li><li><p><strong>メール通知</strong>：エージェントは、出入りする人員や資産について、すべての受信者にメールを送信します。</p></li></ol><p>各レイヤーを見てみましょう。</p><h2>ステップ1：地理的境界に基づいて軍事施設をインデックス化</h2><p>基盤となるのは、<a href="https://source.coop/seerai/hifld/military-installations-ranges-and-training-areas-mirta-dod-sites---boundaries">source.coop/seerai/hifld</a>のDoD MIRTAデータセットです。このデータセットは、各施設に対してPointタイプのgeo_shapeを提供します。これは完全な境界ポリゴンではなく、重心座標となります。</p><p>mitra-facilitiesインデックス内の各インストールドキュメントは、MIRTAが提供する内容に加えて、運用プロファイルデータ（すべて架空のもの）でエンリッチされています。</p>{
  "entity_name": "Naval Station Norfolk",
  "branch_of_service": "Navy",
  "mission_function_type": "fleet_support",
  "personnel_count": 50000,
  "housing_capacity": 55000,
  "temporary_housing_capacity": 10000,
  "logistics_capabilities": ["fuel", "airlift", "sealift", "medical"],
  "available_assets": [
    { "type": "helicopters", "count": 24 },
    { "type": "transport_vehicles", "count": 150 }
  ],
  "contact_email": "norfolk.ops@navy.mil.gov.fake",
  "operational_status": "act",
  "is_joint_base": false,
  "entity_geo_location": { "type": "polygon", "coordinates": [...] }
}<p>このリッチなインデックスによって、AIエージェントは単に「近くに基地がある」というだけでなく、「収容能力があり、任務の種類が適合し、到着する資産を受け入れるための物流を備えた基地がある」という、インテリジェントな割り当て決定を下すことが可能になります。</p><h2>ステップ2：GDACSイベントの取り込みと正規化</h2><p>GDACSは、地震、熱帯低気圧、洪水、山火事、火山、干ばつに関するリアルタイムのGeoJSONを公開しています。このフィードをデータストリーム（logs-gdacs.events-*）に取り込み、生のGeoJSONをECSフィールドに正規化するカスタム取り込みパイプラインを使用します。</p><p>GDACS取り込みパイプラインは、注目すべきいくつかの処理を実行します。</p><p><strong>ジオメトリ抽出：</strong>重心はマップ表示用にgeo_pointとして格納され、影響ポリゴンはgdacs.affected_areaにgeo_shapeとして格納されます。これは、後で交差クエリに使用されるフィールドです。</p><p><strong>重大度の正規化：</strong>災害の種類ごとに、重大度のスケールが異なります。熱帯低気圧は風速（km/h）で、地震はリヒター・マグニチュードで測定されます。パイプラインはそれらすべてを正規化された0～100のスコアにマッピングします。</p>// 取り込みパイプラインからの簡単なスニペット
if (type == 'TC') {
  norm = Math.min(100.0, Math.max(0.0, (val - 40.0) / 2.6));
} else if (type == 'EQ') {
  norm = Math.min(100.0, Math.max(0.0, (val - 4.0) * 20.0));
}<p>正規化された深刻度スコアはその後、検出ルールのアラート深刻度マッピングで使用されるseverity_levelラベル（low、medium、high、critical）にマッピングされます。</p><p><strong>ECSとの整合性：</strong>event.kind: alert、event.category: threat、event.start/event.endにマッピングされたタイムスタンプ、重複排除のための安定したフィンガープリントベースの_id。</p><h2>ステップ3：地理空間エンリッチメント：インデックス作成時に影響を受ける施設を特定する</h2><p>Elasticsearchのgeo_matchエンリッチポリシーは、インデックス時に災害ポリゴンを各施設の境界と照合するため、クエリ時の結合は不要です。検索時にクエリを実行する代わりに、取り込みパイプラインで<strong>エンリッチプロセッサー</strong>を使用して、<em>ドキュメントのインデックス時に</em>災害の影響ポリゴンを各施設の境界と照合します。</p><p>エンリッチポリシーはgeo_matchポリシーです。</p>{
  "geo_match": {
    "indices": "mitra-facilities",
    "match_field": "entity_geo_location",
    "enrich_fields": [
      "entity_name",
      "entity_type",
      "entity_station_number",
      "entity_geo_city_name",
      "entity_geo_region_name"
    ]
  }
}<p>プロセッサーは取り込みパイプラインの最後で実行されます。</p>{
  "enrich": {
    "policy_name": "facilities-geo",
    "field": "gdacs.affected_area",
    "target_field": "affected_facilities",
    "shape_relation": "INTERSECTS",
    "max_matches": 128
  }
}<p>INTERSECTSは、境界線が災害ポリゴンに接しているか重複しているすべての施設や、部分的な交差さえも検出します。その結果、すべてのGDACSイベントドキュメントは、どの施設が影響区域内にあるかを正確に示すaffected_facilitiesネスト配列とともに格納されます。結合クエリは不要です。</p><h2>ステップ4：検出ルール：施設への影響に関するアラート</h2><p>Kibanaの検出ルールは、logs-gdacs.events-*データストリームを監視し、GDACSイベントが少なくとも1つの影響を受けた施設でエンリッチされたときにトリガーされます。</p>クエリ：affected_facilities: { entity_name: * }<p>このルールは1時間ごとのスケジュールで実行され（現在から1時間前までの期間を対象）、動的な重大度マッピングを使用します。取り込みパイプラインによって計算されるgdacs.severity_levelフィールドが、アラートの重大度を自動的に決定します。</p><p>アラートの深刻度も、フィールドマッピングを通じてリスクスコアに影響を与えます。</p>"risk_score_mapping": [
  {
    "field": "gdacs.normalized_severity",
    "operator": "equals",
    "value": ""
  }
]<p>ルールがトリガーされると、設置名、タイプ、場所を含むエンリッチされたaffected_facilities配列を含む完全なアラートコンテキストが、ダウンストリームのKibanaワークフローに渡されます。</p><h2>ステップ5：ワークフローの自動化：アラートからエージェントへの橋渡し</h2><p>Kibanaワークフローは、検出から対応への引き継ぎを処理します。自然災害対応ワークフローは、以下のアラートによって開始されます。</p>triggers:
  - type: alert
steps:
  - name: start_convo
    type: kibana.request
    with:
      method: "POST"
      path: "/api/agent_builder/converse"
      body:
        agent_id: "mitra.response"
        input: "New Natural Disaster Alert: {{ event.alerts | json }}"<p>アラートのペイロード全体（災害の種類、重大度、被災地域、影響を受けた設備の一覧）が、初期コンテキストとしてAIエージェントに転送されます。そこから先はエージェントが処理を引き継ぎます。</p><h2>ステップ6：AIエージェント：データから連携したアクションへ</h2><p>mitra.responseエージェントは、アラートペイロード全体を受け取り、単一のエージェントループで対象範囲を評価し、受け入れ施設を特定し、人員を割り当て、避難通知と受け入れ通知を送信します。これらはすべて、人間の介入なしで行われます。</p><p>エージェントには2つのツールが用意されています。</p><ul><li><p><strong>mitra.nearest_facility</strong>は、geo_shapeクエリを使用してmitra-facilitiesインデックスにクエリを実行し、指定された座標からの距離で並べ替えて、利用可能な収容能力を持つ周辺のアクティブな施設を最大50件返します。</p></li><li><p><strong>mitra.send_email</strong>は、施設オブジェクトのJSON配列を反復処理し、フォーマットされた避難通知または受入通知を送信します。</p></li></ul><p>エージェントの指示セットは、明確なワークフローを定義します。</p><ol><li><p><strong>状況を評価する。</strong>アラートをパースし、影響を受ける施設を特定して、災害の範囲を判断します。</p></li><li><p><strong>移行が必要な対象のインベントリを作成する。</strong>施設ごとの人員数、重要資産、住宅要件。</p></li><li><p><strong>再配置先施設を見つける。</strong>影響を受ける各施設に対してmitra.nearest_facilityを呼び出し、危険区域内にある施設を除外します。</p></li><li><p><strong>配分に関する決定を行う。</strong>単一施設ソリューションと複数施設ソリューションの比較検討、支店間の互換性、収容能力、資産サポートなどを考慮します。</p></li><li><p><strong>調整メールを送信する。</strong>避難元施設に避難指示を、受入施設に受入通知を送信します。</p></li><li><p><strong>サマリーレポートを作成する。</strong>影響を受けるすべての施設、総人員、移動した資産、再配置先施設、懸念事項の簡単なサマリーを作成し、確認のためにチャットに出力します。</p></li></ol><p>エージェントの割り当てロジックは、現実世界の制約に従います。住宅収容能力を超えないこと、可能な場合は同一部隊内での移転を優先すること、複数部隊にまたがる移転の場合は共同拠点を使用すること、そして移動時間を最小限に抑えるために距離を優先することなどが含まれます。</p><h3>最寄りの施設ツール</h3><p>基盤となるワークフロークエリでは、circleフィルター付きのgeo_shapeと_geo_distanceソートを使用します。</p>"query": {
  "bool": {
    "filter": [
      {
        "geo_shape": {
          "entity_geo_location": {
            "shape": {
              "type": "circle",
              "coordinates": [{{ inputs.lon }}, {{ inputs.lat }}],
              "radius": "5000km"
            },
            "relation": "intersects"
          }
        }
      },
      { "term": { "operational_status.keyword": "act" } }
    ]
  }
},
"sort": [
  {
    "_geo_distance": {
      "entity_geo_point": { "lat": {{ inputs.lat }}, "lon": {{ inputs.lon }} },
      "order": "asc",
      "unit": "km"
    }
  }
],
"script_fields": {
  "available_capacity": {
    "script": {
      "source": "Math.max(0, doc['housing_capacity'].value - doc['personnel_count'].value)"
    }
  }
}<p>利用可能な収容人数は、収容可能人数から現在の人員数を差し引くスクリプトフィールドを介して、クエリ実行時に計算されます。エージェントは、上限を超えないように、これを使用してデスティネーション間で人員を割り当てます。</p><h2>ハリケーンELARA-26：137,000人の人員をエンドツーエンドでエージェント的に調整</h2><p>ハリケーン「ELARA-26」は、バージニア州のハンプトン・ローズ地域に上陸すると予測されているカテゴリー4の暴風雨（最大風速213 km/h）です。GDACSイベントが取り込まれると、影響を受けるエリアのポリゴンは、この地域にある7つの主要な軍事施設と交差します。検出ルールがトリガーされます。ワークフローによってエージェントの会話が開始されます。</p><p>単一のエージェントループ内で、エージェントは以下を行いました。</p><ul><li><p>影響エリア内の7つの施設（合計137,372名の人員）を特定しました。</p></li><li><p>嵐の進路外にある受け入れ施設を見つけるために、mitra.nearest_facilityを呼び出しました。</p></li><li><p>利用可能な収容能力と距離に基づいて、9つの受入施設に人員を分散配置しました。</p></li><li><p>影響を受けた7つの施設すべてに避難指示を生成して送信しました。</p></li><li><p>受入通知を作成し、9件の受入施設すべてに送信した。</p></li><li><p>以下のような、調整に関する詳細な概要を作成しました。</p></li></ul><p><strong>避難対象施設：</strong></p><p>施設</p><p>人件費</p><p>ノーフォーク海軍基地</p><p>50,000</p><p>統合遠征基地リトルクリーク・フォートストーリー</p><p>18,000</p><p>オシアナ海軍航空基地</p><p>15,355</p><p>オシアナ海軍航空基地ダムネック別館</p><p>17,509</p><p>NG州立軍事基地キャンプ・ペンドルトン</p><p>9,707</p><p>ラングレー・ユースティス統合基地</p><p>15,000</p><p>ヨークタウン海軍兵器基地</p><p>11,801</p><p><strong>受入施設：</strong></p><p>施設</p><p>距離</p><p>避難受入人員</p><p>フォート・グレッグ・アダムズ</p><p>97 km</p><p>約40,000</p><p>クワンティコ海兵隊基地</p><p>148 km</p><p>約30,000</p><p>インディアン・ヘッド海軍支援施設</p><p>151 km</p><p>約30,000</p><p>アンドルーズ統合基地</p><p>180 km</p><p>約30,000</p><p>パタクセント・リバー海軍航空基地</p><p>141 km</p><p>約10,000</p><p>NG MTA キャンプ・バトナー</p><p>174 km</p><p>約5,000</p><p>NG Bethany Beach トレーニングサイト</p><p>209 km</p><p>約4,707</p><p>リバナステーション</p><p>140 km</p><p>約7,500</p><p>国防総合補給センター</p><p>22 km</p><p>約6,000</p><p>再配置された資産には、輸送車両、ヘリコプター、パトロール艇、医療ユニット、工作車両、発電機、給水トレーラー、シェルターキット、通信システムが含まれます。</p><h3>自動メール通知</h3><p>エージェントが割り当て計画を確定すると、mitra.send_emailを呼び出し、1回の処理で16通のメールを送信しました。つまり、影響を受けた7つの施設すべてへの避難指示と、受け入れ先となる9つの施設すべてへの受け入れ通知です。各メッセージには、受入先施設、到着する人員数、移動する資産、調整担当の連絡先が含まれていました。以前であれば電話連絡網に何時間もかかっていた作業が、エージェントによる推論が完了した瞬間に自動的に完了しました。</p><h3>RAGとポリシーグラウンディングによるエージェント型災害対応の拡張</h3><p>このデモは、収容能力の数値、距離、稼働状況などの構造化データのみに基づいています。Elasticのセマンティック検索およびRetrieval-Augmented Generation（RAG）機能に2つの要素を追加することで、エージェントを大幅にスマートにすることができます。</p><p><strong>過去の対応検索：</strong>過去の事後レポート、連邦緊急事態管理庁（FEMA）のインシデント概要、災害対応記録をベクトル埋め込みとしてインデックス化します。新しいイベントが発生すると、エージェントは類似のイベントがどのように対応されたかをセマンティックに検索し、単なるキャパシティの計算だけでなく組織の知識を活用して割り当ての意思決定を行うことができます。</p><p><strong>ポリシーとドクトリンの根拠付け：</strong>国防総省（DoD）の緊急事態管理指令、施設の業務継続計画（COOP）、司令官のガイダンスをインデックス化します。エージェントは対応を規定する実際のポリシーを取得して引用できるため、すべての決定が推論ではなくドクトリンに基づいていることを保証できます。</p><p>どちらも同じElasticネイティブのアプローチに従います。推論パイプラインがインデックス作成時に埋め込みを生成し、セマンティック検索ツールがエージェントに公開されます。 調整パイプラインは同じままです。エージェントはさらに賢くなります。</p><h2>公共部門のエージェント型対応にElasticsearchが最適なプラットフォームである理由</h2><p>これはチャットボットではなく、ダッシュボードでもありません。脅威を検知し、複雑なロジスティクス問題を推論して、人間の介在なしに137,000人の移転を調整した、応答性の高いエージェント型ワークフローシステムです。このような成果が可能になるのは、依存するすべての機能が単一の統合プラットフォームに集約されているからです。</p><p>Elasticsearchの地理空間サポート（geo_point、geo_shape、エンリッチメントポリシー、距離ベースの並べ替え）は、交差検出や施設検索の大規模な実行を可能にする空間推論を処理します。セマンティック検索とベクトル埋め込みによりエージェントを事実にグラウンディングさせ、AIの推論がハルシネーションによる推測ではなく、データに実際に存在する情報に基づくようにします。Kibanaの検出エンジン、Workflows、Agent Builder、Agent Builderツールにより、外部の連携コードを必要とすることなく、未加工のイベントから連携したアクションへと至るパイプラインとしてこれらすべてが統合されます。</p><p>Elasticのようにこれらを統合できるプラットフォームは他にありません。リアルタイムのインデキシング、地理空間の精度、セマンティック検索、エージェンティックオーケストレーションのすべてを1つのスタックに統合し、エンタープライズグレードのセキュリティとオブザーバビリティが組み込まれていることこそが、これらのうち1つには優れていても残りは自分たちでつなぎ合わせる必要があるツールと、Elasticを一線を画す存在にしている理由です。</p><h2>緊急事態管理、消防、法執行、公衆衛生のためのエージェント型地理空間対応</h2><p>人、施設、リアルタイムイベントが交差するあらゆる場所に、同じアーキテクチャーが適用されます。特定のデータは変更され、パイプラインは変わりません。</p><p><strong>緊急事態管理：</strong>FEMAや州の緊急事態管理局は、避難所の位置、集結地域、脆弱な人々を、到来する米国国立気象局（NWS）の悪天候ポリゴンと照らし合わせて地図化し、嵐が上陸する前にリソースの事前配置を自動的に開始できます。</p><p><strong>消防・救急医療サービス：</strong>消防署は、部隊の位置や対応ゾーンを山火事の境界線や建物火災のクラスターに重ね合わせ、適切な装備を備えた最も近くの対応可能な部隊へ相互応援要請を自動的にルーティングできます。</p><p><strong>法執行機関：</strong>機関は、進行中のインシデントの位置を学校区域、重要インフラ、警察官の位置と関連付け、手動でのトリアージを待たずに、位置情報を考慮したロックダウン通知やリソースの派遣をトリガーできます。</p><p><strong>公立学校の安全対策：</strong>学区は、キャンパスの敷地境界に対するリアルタイムの脅威フィードを監視できます。脅威が学校の敷地境界に差し掛かった場合、ディスパッチャーが電話を取る前に、エージェントは直ちに管理者に通知し、ロックダウンの連絡を開始し、法執行機関の対応を調整できます。</p><p><strong>公衆衛生：</strong>保健機関は、疾病監視データや環境有害区域を診療所の所在地、人口密度レイヤー、供給拠点の在庫と照合し、最も必要とされている場所にリソースを配分できます。</p><p>セクター</p><p>ユースケース</p><p>Elasticの機能</p><p>緊急管理</p><p>避難所の場所をNWSの悪天候ポリゴンと照合する</p><p>geo_shapeエンリッチメント+Kibanaワークフロー</p><p>消防およびEMS</p><p>山火事の境界線に部隊の位置を重ね合わせる</p><p>地理空間ルーティング+最寄り施設クエリ</p><p>法執行機関</p><p>事件と学校区域および警察官の配置を関連付ける</p><p>位置情報に基づくアラートルール + 担当者の派遣</p><p>公立学校の安全</p><p>キャンパス境界に対する脅威フィードを監視する</p><p>検出ルール+自動通知</p><p>公衆衛生</p><p>危険区域を診療所の場所や物資拠点と照合する</p><p>セマンティック検索 + 地理空間エンリッチメント</p><p>データはシナリオごとに異なります。取り込み、インデックス作成時のエンリッチメント、交差の検出、自律的な対応のトリガー、そしてアクションという根本的なパターンはすべて同じです。Elasticは、公共機関が一度構築すればどこでも適用できるプラットフォームを提供します。</p><p><em>本記事に記述されているあらゆる機能ないし性能のリリースおよびタイミングは、Elasticの単独裁量に委ねられます。現時点で提供されていないあらゆる機能ないし性能は、すみやかに提供されない可能性、または一切の提供が行われない可能性があります。</em></p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/elasticsearch-agentic-disaster-response</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/elasticsearch-agentic-disaster-response</guid>
    <category><![CDATA[エージェント型AI]]></category>
    <category><![CDATA[Kibana]]></category>
    <dc:creator><![CDATA[Alec Carpenter]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt969cad2694920de4/6a4693f37746672ad42675b5/cb292a501835472598dee30bef25c77afc54db6c-720x420.png" length="0" type="image/png"/>
    <pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[KibanaのAI Chatがダッシュボードをネイティブにレンダリングするように]]></title>
    <description><![CDATA[KibanaのElastic AI Chatでは、自然言語からダッシュボードを構築し、ビジュアルと分析を1つのスレッドに保持し、再利用可能なKibanaオブジェクトとして保存できるようになりました。]]></description>
    <content:encoded><![CDATA[<p>Kibanaの<a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/chat#get-started">Elastic AI Chat</a>では、平易な質問を<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql.html">ES|QL</a>に裏付けられた<strong>可視化</strong>や完全な<strong>ダッシュボード</strong>に変換し、<strong>会話</strong>の中で直接利用できます。必要な指標を定義し、必要に応じて修正し、ストーリーが成り立つようになったら保存できます。すべては<strong>会話の中に残り</strong>、<strong>保存</strong>の準備ができるころには、チームが開いて編集し再利用できる一流のKibanaオブジェクトになります。Elastic 9.4でテクニカルプレビューとして利用可能です。</p><p>エージェントはダッシュボードをゼロから構築しますが、既存のものも使用できます。ダッシュボードを表示中にAI Chatのサイドバーを開くと、<strong>自動的に</strong><strong>接続されます</strong>。指標が急上昇した理由を尋ねたり、地域別に分析したり、比較パネルを追加したりしてみましょう。既存のダッシュボードが単なる最終成果物ではなく<strong>出発点</strong>となります。</p><h2>舞台裏：AI Chatでダッシュボードを構築した方法</h2><p>私たちは、<a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-skills">スキル</a>（与えられた問題に対する操作方法の構造化された記述）を通じて、エージェントに特定のタスクを教えます。しかし、ダッシュボードスキルを構築するには、LLMに有効なKibanaダッシュボードを生成する方法を教える必要がありましたが、従来のSaved Object APIでは、深くネストされたJSON、微妙なバージョン間の変更、脆弱な参照など、多くの問題があり、非常に困難でした。別のアプローチが必要でした。</p><h3>プログラマティックダッシュボード専用に設計されたAPI</h3><p>新しい<a href="https://dashboardsapispec.kibana.dev/dashboards.html">Dashboards API</a>は、まさにこのシナリオのために構築されました。生の内部状態を公開する代わりに、パネルの種類ごとに型付けされ検証済みのスキーマを提供します。APIは、クリーンな外部構造とKibanaの内部表現間の変換を処理するため、エージェントはダッシュボードのフォーマット方法ではなく、ダッシュボードに含めるべき内容に集中できます。</p><h3>1つのスキル、1つのツール、多数の操作</h3><p><code>dashboard-management</code>スキルは、<strong>操作</strong>の順序付き配列を受け入れる単一の<code>manage_dashboard</code>ツールを公開します。各操作は個別のアクションです。メタデータの設定、マークダウンパネルの追加、自然言語からのES|QLベースの可視化の作成、既存パネルの編集、パネルの折りたたみ可能なセクションへのグループ化、グリッド上のアイテムの再配置などが可能です。</p><p>エージェントは、タイトル、説明、セクション、およびその中のすべてのパネルなど、ダッシュボード全体を1回の呼び出しで説明できます。</p>{
 "operations": [
   { "operation": "set_metadata", "title": "Checkout latency investigation" },
   {
     "operation": "add_section",
     "title": "Overview",
     "panels": [
       { "query": "p95 checkout latency over the last 24h", "chartType": "xy" },
       { "query": "checkout error rate by region", "chartType": "metric" }
     ]
   }
 ]
}<p>操作は順序通りに実行されるため、後のステップは前のステップを参照し、その上に構築できます。この設計により、議論は実装の詳細ではなく、意図に焦点を当てたものとなります。</p><h3>可視化パイプライン：自然言語からES|QL、そして可視化へ</h3><p></p><p>ダッシュボードを要求すると、エージェントはデータ（インデックス、フィールドマッピング、タイプ）を探索し、可視化を計画し、manage_dashboardを呼び出します。</p><p>各パネルは、グラフタイプの選択、ES|QL生成、可視化構成、検証という独自のパイプラインを通過します。これをメインのエージェントスレッドから分離しました。可視化の構築にはパネルごとに複数のモデル呼び出しが必要であり、それをメインのコンテキストに混ぜるとウィンドウが肥大化し、推論が不明瞭になるためです。</p><p>manage_dashboardの内部では、すべてのパネルが同時に組み立てられ、順番に組み立て直されます。結果として、埋め込みパネルを備えた完全なダッシュボードが得られます。孤立した可視化も、同期の問題もありません。</p><h3>ダッシュボードツール内に可視化作成機能を移動した理由</h3><p>最初のアプローチでは、個別のcreate_visualizationツールを使用しました。パネルごとに1回呼び出しを行い、各添付ファイルをダッシュボードツールに渡しました。うまくいきましたが、各可視化には独自のツール呼び出し、独自のライフサイクル、そして明示的なハンドオフが必要でした。さらに悪いことに、会話内で可視化を編集してもダッシュボードパネルが更新されず、ユーザーを混乱させる結果となりました。</p><p>視覚化の作成機能をmanage_dashboardに直接統合しました。同じ並行ワークフローが実行されますが、パネルは中間的な接続を介さずにダッシュボード構造に組み込まれます。呼び出し回数が減り、同期の問題も発生せず、ライフサイクルは1つに統合されます。</p><p>スタンドアロンの可視化は引き続き機能します。既存のチャートは添付参照を使ってダッシュボードに追加できますが、新規作成の場合はインライン作成のほうがより適切です。</p><h2>セキュリティチーム向け</h2><p>SOCアナリストや検出エンジニアには、調査中にダッシュボードエディターを往復する余裕はありません。AI Chatでは、ルールの種類、ホスト、MITREの戦術別にアラート量を尋ねると、約1分でスレッドに表示されます。ハンティングが進むにつれて、コンテキストを損なうことなく、プロセス実行の異常、ネットワーク接続、タイムラインの比較といったパネルを重ねていくことができます。</p><p>作業が終わったら保存します。ダッシュボードは、事後分析の参考資料となり、次のアナリストの出発点となり、週次の脅威ブリーフィングの資料にもなります。再説明は不要です。</p><p>セキュリティチームがダッシュボード作成や最近開始されたその他のAI Chat機能をどのように利用できるかについては、こちらの<a href="https://www.elastic.co/security-labs/skills-elastic-security-9-4">ブログ記事</a>をご覧ください。</p><h2>オブザーバビリティおよびサイト信頼性エンジニア（SRE）向け</h2><p>午前2時にサービスがダウンした場合、ダッシュボードを一から構築する時間はありません。AI Chatを使用すると、SREは必要なメトリクス（サービスごとのp99レイテンシ、導入イベントに対するエラー率、過去1時間のポッド再起動数）を記述し、約1分で調査スレッドに完全なダッシュボードを取得できます。エージェントは、全体像がはっきりしてくるにつれて、パネルを追加し、時間ウィンドウを変更し、地域ごとに細分化し、段階的に調整できます。</p><p>ダッシュボードを保存すると、インシデントブリッジに参加する全員が作戦室ですぐにそのダッシュボードを利用できるようになります（同じパネル、同じフレーム）。事件後、それは事後検証の基礎となります。</p><h2>次のステップ</h2><p>トークンの最適化、よりリッチな全画面表示、より幅広いパネルのサポート、そして継続的な品質の向上に取り組んでいます。テクニカルプレビューは、優先順位を決定する絶好の機会です。何か不足している点があれば、上部メニューの「<strong>フィードバックを送信</strong>」アイコンからお知らせください。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6783ac3a6540ba5b/6a17dd804b055d813e4320e0/1bb71a01a12641961134f2231778344a6249e8f4-1490x634.png" alt="「[OTel] Host Details — Overview」というタイトルのエントリが1つあるリストと、フィルター、検索バー、「ダッシュボードの作成」ボタン、フィードバックを送信するオプションが表示されているダッシュボード管理ページ。" /><h2>試してみる</h2><p><strong>Elastic 9.4</strong>にアップグレード（またはトライアルを開始）するか、<strong>AI Chat</strong>を全画面モードで開いて、実際の調査で試してみてください。エージェントに注目している指標のグラフを作成してもらい、その後、次の詳細な内訳を依頼します。ストーリーが成立したら、保存して共有してください。同じパネル、同じ構図で、再説明は不要です。エンタープライズライセンスが必要です（<a href="https://www.elastic.co/docs/explore-analyze/ai-features/agent-builder/chat#get-started">利用開始はこちら</a>）。<em>本記事に記述されているあらゆる機能または性能のリリースおよびタイミングは、Elastic単独の裁量に委ねられます。現時点で提供されていないあらゆる機能または性能は、すみやかに提供されない可能性、または一切の提供が行われない可能性があります。</em></p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/ai-dashboard-generation-elastic-agent-kibana</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/ai-dashboard-generation-elastic-agent-kibana</guid>
    <category><![CDATA[Kibana]]></category>
    <dc:creator><![CDATA[Teresa Alvarez Soler,Robert Jaszczurek]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc2ccc8f75d7cc972/6a17dd82577262f0831bcb21/f3c7ce5e05cabea693363616e62f5e30e0be2cd5-720x420.jpg" length="0" type="image/jpeg"/>
    <pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Kibanaはダッシュボードの読み込み時間を最大25％短縮 - その背後にあるポーリング戦略を紹介]]></title>
    <description><![CDATA[Kibanaが継続的なポーリングとブラウザ側のHTTP/2検出を使用して、ダッシュボードの読み込み時間を最大25％削減し、HTTP/1に自動的にフォールバックする仕組みをご覧ください。]]></description>
    <content:encoded><![CDATA[<p>継続的なポーリングにより、KibanaのダッシュボードとDiscoverの読み込みが最大25％速くなりました。Kibanaは、定期的なチェックの合間にスリープする代わりに、HTTP接続を開いたままに維持し、準備ができたらすぐにElasticsearchのクエリ結果を配信するようになりました。HTTP/2+（9.0以降のKibanaのデフォルト）では、自動的に有効になるため、設定は不要です。HTTP/1では、Kibanaは接続プールの枯渇を防ぐために従来のポーリングに戻ります。</p><h2>Kibanaがダッシュボードを読み込む際にデータを取得する方法</h2><p>ダッシュボードを開くと、ほとんどのパネル（内部的には、これらを<em>埋込</em>と呼びます）が1つ以上のElasticsearchクエリを開始します。しかし、同期検索の単純な呼び出しと応答の代わりに、非同期検索のパワーを使います（<a href="https://www.elastic.co/docs/solutions/search/async-search-api">ドキュメント</a>）。</p><p>非同期検索では、クエリ結果が特定のHTTPリクエスト外でもElasticsearch内で利用可能な状態に保たれます。これが重要な理由を以下に挙げます。</p><ul><li><p>ネットワークの不安定性に耐性が高く、データの読み込みを安定させます</p></li><li><p><a href="https://www.elastic.co/docs/explore-analyze/discover/background-search">バックグラウンド検索機能</a>により、ユーザーは長時間実行されるダッシュボードやDiscoverセッションを待つ間も、Kibanaで他の作業を行うことができます</p></li></ul><p>最初のクエリが送信された後、Kibanaは検索を監視して完了を検出し、結果のセットを取得します。</p><h3>従来のポーリングがKibanaのダッシュボードのロード時間に与える影響</h3><p>従来のポーリングでは、Kibanaはクエリを送信し、最初の接続を閉じてから、Elasticsearchの完了を定期的にチェックします。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt093ed1a718d2f2ed/6a1710c28b73cb568118a109/2f44064a2e627866e129eb626f68ddd62230a4e2-1999x719.png" alt="Kibanaでの従来のポーリングを示す図。Kibanaのタイムラインには、クエリ送信後の短い接続オープン期間、それに続く長いスリープ期間、ステータスの簡単なポーリング、そして結果が表示されます。Elasticsearchのタイムラインは、Kibanaのスリープ期間の途中で完了するクエリを実行します。これは、時間のロスの原因となっている調整ギャップを示しています。" /><p>Elasticsearchは、クエリ送信後に検索を完了して結果を返すまでの短い時間を設けています。もし検索がこれほど速く完了する場合、それは単純な呼び出しと応答のやり取りに相当します。しかし、長時間の検索の場合、最初の接続は切断され、Kibanaは検索の完了を定期的に確認し始めます。これは<em>ポーリング</em>と呼ばれます。</p><h4>従来のポーリングのパフォーマンス上の課題</h4><p>上の図をご覧いただくと、このアプローチのパフォーマンス上の欠点がお分かりいただけるかもしれません。検索はKibanaのスリープインターバルのいずれかで終了する可能性が最も高く、そのため時間の無駄につながります。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3685326f1aa90a1b/6a1710c30c4857892b01ab7a/ad8b80d9e8d6d774065d62e352aad47c3ddb4686-1999x719.png" alt="従来のポーリングのパフォーマンスコストを示すタイムライン図。Kibanaのタイムラインには、接続オープン期間、長いスリープ期間、ステータスのポーリング、そして結果の配信が表示されます。Elasticsearchのタイムラインには、Kibanaのスリープ中にクエリが完了し、その後に赤いロストタイムセグメント（Kibanaがスリープから復帰して結果を取得するまでの無駄な期間）が表示されます。" /><p>最悪のシナリオ（検索がスリープ期間の始めに完了する場合）では、ポーリングインターバルの全期間が無駄になります。</p><h4>バックオフ戦略の影響</h4><p>ポーリング時にはバックオフ戦略を適用するのが標準的な方法です。これは、検索の期間が長くなるほど、ポーリングの頻度が低くなることを意味します。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt37fb76cf22647ee5/6a1710c5a929cf6fcaae0abd/77665de4a0fd166b533a2c2c55f6f28e38cf37ce-1200x338.png" alt="クエリ期間別にKibanaのポーリング間隔のバックオフスケジュールを示す横棒グラフ。1.5秒未満のクエリは約0.5秒間隔、1.5～5秒のクエリは1秒、5～20秒のクエリは約2.5秒、20秒を超えるクエリは5秒のポーリング間隔を使用します。" /><p>しかし、これはまた、検索の期間に応じて潜在的な時間損失が比例して増加することを意味します。</p><h4>ポーリング間隔がノコギリ状のレイテンシパターンを作り出す仕組み</h4><p>これらの要素を合わせると、失われた時間は段階的なノコギリ状の関数となります。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd4e81306b0c9f259/6a1710c147d49c34c42d8aec/d5cd43366f62de628c3a054ffb7bf0b05d7a1390-1500x600.png" alt="秒単位のクエリ完了時間に対する秒単位のロスタイムを示す折れ線グラフで、ロスタイムが上昇してから繰り返しゼロに落ちる鋸歯状のパターンを形成し、クエリの持続時間が0秒から30秒に増加するにつれて、ピークが1秒未満から5秒まで大きくなります。" /><p>ここで、ピークは最悪のシナリオ、谷は最良のシナリオを表しています。これは、従来のポーリングコストが、検索期間（およびネットワーク条件）に応じて、ゼロからポーリング間隔の全期間まで変化することを示しています。</p><h2>継続的なポーリング：Kibanaが待ち時間を排除する仕組み</h2><p>従来のポーリングの問題は、KibanaとElasticsearchの間にある根本的な連携不足です。理想は、Kibanaが結果が利用可能になったことを即座に認識することです。では、ほぼすべての時間をElasticsearchのチェックに費やし、待機時間をまったく設けないポーリングパターンに逆転させたらどうなるでしょうか？</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4566eaaec79150c7/6a1710c78b73cb1df318a10d/7edc138528dfe1310df42f393ee7279fe3c4703b-1999x713.png" alt="Kibanaでの継続的なポーリングを示すタイムライン図。Kibanaのタイムラインは全体が青色で表示されています。クエリの送信から2回の接続更新まで、結果が表示されるまで、接続は開いたままです。スリープ期間はありません。Elasticsearchのタイムラインには、クエリが完了し、結果がすぐに配信されたことが表示されています。凡例にはロスタイムが取り消し線で示され、排除されたことを表しています。" /><p>長時間のポーリングとスリープ期間の廃止を組み合わせることで、結果は準備ができ次第すぐに提供されます。</p><h3>HTTP/1の陳腐化</h3><p>その理論は堅実なものです。では、継続的なポーリングをオンにすると、なぜこのKibana導入はそれほど陳腐化して見えるのでしょうか？</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltede864738a88e1cb/6a1710c947d49c178d2d8af2/517378a73d36bd95927b81b1f912ce465b7adf4c-800x412.gif" alt="Sample Logs Dataデータセットを読み込むKibanaのダッシュボードの動作画面録画で、複数のパネルが順番に表示されます。これには、レスポンスコードの時系列、米国の総リクエスト数を示す地図、ユニークビジター数、HTTPエラー率の指標、そしてマシンのOSと宛先データのサンキーダイアグラムが含まれます。" /><p>重要なのは、この導入がHTTP/1上で実行されていることです。HTTP/1では、HTTPリクエストはTCP接続に1:1でマップされます。そのため、複数の長時間にわたるポーリングリクエストがブラウザの限られた接続プールを占有し、他のリクエストがキューに溜まってしまいます。</p><p>一方、HTTP/2+では、ネットワークリクエストは多重化によってTCP接続を共有できるため、この問題は発生しません。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5cddb4d6767a1ccf/6a1710cb839dfa5056dcffcd/f60f3a37baf5ec16c9f1773f08855e7f9e3a7491-1536x1024.png" alt="Kibanaの継続的ポーリングにおけるHTTP/1とHTTP/2を比較した図。HTTP/1では、リクエストごとに1つのTCP接続が必要で、6つの接続でブラウザの接続プールを使い果たします。HTTP/2は、1つのTCP接続で複数のポーリングリクエストを多重化し、プールの枯渇を防ぎ、パフォーマンスを維持します。" /><p>つまり、HTTP/2+では継続的なポーリングは利点となりますが、HTTP/1では欠点となります。</p><p></p><p>HTTP/1</p><p>HTTP/2+</p><p>TCP接続</p><p>HTTPリクエストごとに1つ</p><p>多重化（多くのリクエストが接続を共有）</p><p>継続的なポーリング実行</p><p>パフォーマンスが低下（接続プールの枯渇）</p><p>最大の効果（結果をすぐに表示）</p><h4>KibanaがHTTPプロトコルを検出して最適なポーリングを行う方法</h4><p>HTTP/2は推奨されているプロトコルであり、Kibanaのデフォルトは9.0以降であるため、このパフォーマンス向上を実装しないのはもったいないでしょう。一方、HTTP/1のエクスペリエンスは非常に陳腐化しているため、プロトコルをまだアップグレードしていないオンプレミス導入でリスクを冒すことは許されません。答えは明確です。どのプロトコルが使用されているかを検出し、最適なポーリング戦略を適用する必要があります。</p><p>Kibanaサーバーがどのプロトコルを使用しているかを知ることは確かに可能です。しかし、そこには落とし穴があります：制限要因はブラウザの接続プールです。つまり、本当に重要なのは<em>ブラウザ</em>が何を使用しているかということです。</p><p>プロキシの関係で、これらは必ずしも同じではありません。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc61ff0abfe101eec/6a1710cd2867144b8893e412/13e38001fc4bd3fc60cfc69114fb9098fd745906-1970x786.png" alt="水平に連なる3つのコンポーネントを示すアーキテクチャ図。左側が Kibana Server、中央がオプションのProxy、右側がKibana Clientです。サーバーからプロキシへのホップは、kibana.yml の server.protocol でラベル付けされ、既知のプロトコルを示しています。プロキシからクライアントへのホップには3つの疑問符が付けられており、その最終ホップのプロトコルが不明であり、異なる可能性があることを示しています。" /><p>最適化をサーバープロトコルに基づいて行うと、2つの誤りのどちらかが起こり得ます。</p><ol><li><p>適用すべきでないのに継続的なポーリングを適用し、エクスペリエンスを低下させる。</p></li><li><p>継続的ポーリングを適用すべき場合に適用せず、最適化の機会を逃す。</p></li></ol><p>幸いなことに、最新のブラウザは <code>PerformanceObserver</code> を使用することで、完了したリクエストの最後のネットワークホップのプロトコルを検出する方法を提供しています。そこで、最初のクエリ送信のプロトコルを監視し、それに基づいて最適化します。</p>new PerformanceObserver((list) =&gt; {
  const entries = list.getEntries();
  const entry = entries.find(({ name }) =&gt; name.includes('/internal/search/'));
  if (entry) {
    this.protocolSupportsMultiplexing = ['h2', 'h3'].includes(entry.nextHopProtocol);
  }
});<h2>ラボでの結果：継続的ポーリングと従来のポーリングとの比較（Kibana）</h2><p>継続的なポーリングを検証するために、1秒から23秒の範囲でクエリが遅延するダッシュボードを作成し、最適化を有効にした状態と有効にしていない状態での読み込み時間を測定しました。次に、継続的なポーリングが有効なダッシュボードと有効でないダッシュボードを読み込み、その結果を（<a href="https://github.com/kertal/race-for-the-prize">賞品のかかったレース</a>のように楽しんで）測定しました。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltba4af840d8324923/6a1710ceb339d52fe076a0b6/5f19fb45c5307a7491037fe1ad1a302728793203-1200x742.png" alt="Kibanaの継続的ポーリングに関するラボテスト結果を示す棒グラフ：クエリ実行時間が1秒から23秒までの場合における、従来のポーリングと比較した時間短縮効果。節約時間は、クエリがポーリング間隔の境界に対してどこで完了するかによって、ほぼゼロから4.9秒まで変化し、バックオフスケジュールによって予測された鋸歯状のレイテンシーパターンが確認できます。" /><p>このパターンは、元のノコギリ型の図を踏襲しています。クエリの期間によっては、効果が小さい場合もあれば、数秒に及ぶ場合もあります。</p><h2>まとめ</h2><p>この最適化により、従来のポーリング方式に内在する遅延を、より効率的な継続的ポーリング方式に置き換えることに成功しました。主な課題は、HTTP/1環境でのパフォーマンス低下を防ぐために、この最適化を条件付きで実装することでした。私たちはこの課題を、ブラウザの <code>PerformanceObserver</code> を使って、最終ネットワークホップで使用されているプロトコルを確実に検出することで解決しました。</p><p>ラボでのテストによりこの理論が検証され、継続的なポーリングによって結果が準備でき次第すぐに得られることが示されました。平均して、これはユーザーエクスペリエンスの有意義な改善につながり、データの読み込みを最大25％高速化します。</p><p>この取り組みは、ユーザーが洞察を得るまでの時間を短縮するという私たちのコミットメントにおける、最新のステップです。KibanaをElasticsearchデータに対してより透明性の高いプロキシにすることで、私たちの影響が及ぶ範囲内でのパフォーマンスの限界を押し広げます。ぜひ今後の続報をお待ちください。</p><p>（2025年、トーマス・ナイリンクはKibanaのダッシュボードのパフォーマンスを向上させる方法と動機について<a href="https://www.elastic.co/search-labs/blog/kibana-dashboard-rendering-time">優れた概要</a>を紹介しました。これはその取り組みをアップデートしたものです。</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/kibana-dashboard-performance-continuous-polling</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/kibana-dashboard-performance-continuous-polling</guid>
    <category><![CDATA[Kibana]]></category>
    <dc:creator><![CDATA[Drew Tate,Matthias Wilhelm]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd4e81306b0c9f259/6a1710c147d49c34c42d8aec/d5cd43366f62de628c3a054ffb7bf0b05d7a1390-1500x600.png" length="0" type="image/png"/>
    <pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[描くのではなく、説明する：MCPとES|QLによるAIネイティブのKibanaダッシュボード]]></title>
    <description><![CDATA[プロンプトからダッシュボードへ。example-mcp-dashbuilderを使って、自然言語でKibanaダッシュボードを構築する方法を学びましょう。ES|QLクエリを書き、インタラクティブなグラフを作成し、全面的に機能するダッシュボードをKibanaに直接エクスポートするオープンソースのMCPアプリケーションです。]]></description>
    <content:encoded><![CDATA[<p>example-mcp-dashbuilderはオープンソースのMCPアプリケーションで、平易な英語のプロンプトをライブでインタラクティブなKibanaのダッシュボードに変換します。これらはすべて、エディタのチャット画面内で行われます。ダッシュボードの要望を記述すると、AIがインデックス構造を検出し、各可視化に適切なES|QLアグリゲーションを記述し、作業中にインラインでプレビューをレンダリングします。完了後、1つのコマンドで完全に機能するKibanaのダッシュボードがエクスポートされます。実際のLens可視化、正確なグリッドレイアウト、カスタムカラーもそのまま保持されます。現在、6種類のグラフがサポートされており、Kibana Lensの全機能がロードマップに設定されています。</p><h2>Kibanaダッシュボードビルダーとは？</h2><p>必要なダッシュボードをわかりやすい日本語で説明すると、インタラクティブなグラフ、ドラッグアンドドロップのレイアウト、Kibanaへのワンクリックエクスポートが表示・実行されるとしたらどうでしょうか。</p><p>それがまさに <a href="https://github.com/elastic/example-mcp-dashbuilder.git"><strong>example-mcp-dashbuilder</strong></a> の役割です。これはオープンソースのモデルコンテキストプロトコル（MCP）アプリケーションで、AIアシスタントをElasticsearchに接続し、会話を通じて総合的なKibanaのダッシュボードを作成できます。メニューをクリックしたり、手動で可視化設定を書く必要はありません。必要なものを説明するだけで、AIがデータを調査し、Elasticsearch Query Language（ES|QL）でクエリを書き、グラフを作成し、ライブかつインタラクティブなダッシュボードを提供します。これらはすべて、エディタのチャット画面内で行われます。</p><h2><strong>プロンプトからダッシュボードまでを数秒で</strong></h2><p>実際の様子を以下で紹介します。次のように入力します：</p><p>「「logstash-*」から、リクエストの合計数、時間の経過に伴う転送バイト数、上位の地理的ソース、対応コードの内訳を含むWebトラフィックダッシュボードを作成してください。」</p><p>AIは次のように動作します：</p><ol><li><p><strong>データを発見：</strong>インデックスを一覧表示し、フィールドマッピングを検査します。</p></li><li><p><strong>ES|QLのクエリを作成：</strong>スキーマに合わせ、適切なアグリゲーションを使用します。</p></li><li><p><strong>可視化を作成：</strong>棒グラフ、折れ線グラフ、スパークライン付きメトリクス、ヒートマップ、円グラフを作成できます。</p></li><li><p><strong>すべてを整理整頓：</strong>折りたたみ可能なセクション、わかりやすいタイトル、適切なレイアウト。</p></li><li><p><strong>インタラクティブなプレビューを表示：</strong>チャット内でツールチップ、時間選択機能、ドラッグ＆ドロップ機能を利用できます。</p></li></ol><p>各グラフは作成されると同時にインラインで表示されるため、リアルタイムで進捗状況を確認できます。次に<code>view_dashboard</code>は、Kibanaの48列グリッドにすべてのパネルが配置された完全なダッシュボードを表示します。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt75af5d9042d141b5/6a17e99dbe608675a4004792/dcbf47c4f17bf1a184fb0167408ebeb861ef6c9d-1404x1568.png" alt="example-mcp-dashbuilderインターフェースに2つのチャートが表示されます。1つ目は、「上位の地理的ソース」と題された縦棒グラフで、国コード別のリクエスト数を示しています。2つ目は、「HTTP応答コードの内訳」というタイトルの円グラフで、200、404、503の応答のセグメントを示しています。" /><p><em>単一のグラフを本文中にプレビュー表示します。</em></p><h2><strong>ES|QLで構築</strong></h2><p>すべてのデータ検索には、Elasticsearchのパイプ型クエリ言語である<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql.html">ES|QL</a>を使用しています。AIは単に未加工のクエリをそのまま渡すだけでなく、ES|QL構文に関して標準搭載された知識とお客様のデータ構造に関する情報を使用して、各可視化タイプに対して正確かつ効率的なクエリを作成します。</p><p>サーバーには包括的なES|QLリファレンスがMCPリソースとして含まれています。クエリを書く前に、AIはこのリファレンスを読み取り、利用可能なコマンド、関数、およびパターンを理解します。データ可視化のベストプラクティス・ガイド（リソースとしても機能）と組み合わせることで、AIはクエリの<em>方法</em>だけでなく、<em>何が</em>可視化を優れたものにするのかも知ることができます：</p><ul><li><p>時系列には <code>BUCKET(@timestamp, 1 day)</code> を使い、常に時間フィールドで <code>SORT</code> します。</p></li><li><p>円グラフは<code>| SORT value DESC | LIMIT 6</code>で6切れに制限します。</p></li><li><p>カテゴリー比較のための棒グラフ、トレンドを示す折れ線グラフ、主要業績評価指標（KPI）のためのメトリクスを選択します。</p></li></ul><h2><strong>オープンエンド分析によるAI主導のデータ探索</strong></h2><p>頭の中で既に設計したダッシュボードを、実際に作成することはまた別の作業です。「このインデックスの何が興味深いのか？」と尋ねること、そして有用な答えを得ることはより難しく、AIが単に描くのではなく、<em>探索</em>する方法を知る必要があります。</p><p>example-mcp-dashbuilder は、構造化された探索フローを定義する <code>analysis://guidelines</code> リソースを提供します。そのリソースとは、データのプロファイリング、ターゲットを絞ったアグリゲーションの実行、調査に値するパターンの抽出、最も興味深い発見のためのチャートの作成、ユーザーが次に望むかもしれないドリルダウンクエリの提案などです。トリガーフレーズ（例えば「ログを分析」や「このインデックス内のパターンを発見」）は、AIが何かを行う前にプレイブックを読み込むようにするため、オープンエンドなプロンプトはランダムなチャートの集合ではなく、一貫性のある調査を生成します。</p><p>結果：AIに馴染みのないインデックスを渡すと、開始点が返されます。開始点は、ダッシュボードと「以下に気づきました。これらの中に詳しく調べたいものはありますか？」というプロンプトと短いリストです。</p><h2><strong>Kibanaダッシュボードのエクスポートとインポート：完全な往復処理</strong></h2><p>エクスポート/インポートの往復処理は、既に Kibana を使用しているチームにとって example-mcp-dashbuilder が真に役立つ部分です。example-mcp-dashbuilder は独自の機能を持ち、エディタ内に存在する対話型のダッシュボード画面ですが、作業内容をエディタ内に閉じ込めることはありません。ここで構築されたダッシュボードは、必要に応じてKibanaに移動できます。既存のKibanaダッシュボードは、AI支援による編集のために逆方向に移動させることが可能です。</p><h3><strong>Kibanaにエクスポート</strong></h3><p>ダッシュボードにご満足いただけましたら、次のコマンド1つでエクスポートできます：</p><p>「このダッシュボードをKibanaにエクスポートしてください」</p><p>すべてのパネルは実際のKibana Lensの可視化に変換されます。変換後も以下は保持されます：</p><ul><li><p><strong>ES|QLクエリ：</strong>LensにおけるES|QLのデータソースとして直接転送されます。</p></li><li><p><strong>グリッド位置：</strong>Kibanaと同じ48列システムを使用しているため、レイアウトはKibanaと全く同じに見えます。</p></li><li><p><strong>カスタムカラー：</strong>シリーズパレット、メトリックの背景、ヒートマップのカラーランプ。</p></li></ul><p>その結果として、全面的に機能するKibanaのダッシュボードができます。スクリーンショットでも埋め込みでもありません。共有してKibanaで編集を続けることができるダッシュボードです。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1921c74c2833cabe/6a17e99f6864a4a712b687da/5e27777bc0a82cafb373943f65298bdb21d66176-1999x902.png" alt="2つのダッシュボードが並んで表示されています。「Webトラフィックの編集 — Logstash（Dashbuilder）」と題された左側のダッシュボードには、最近のトラフィック指標が、トラフィック量パネル、地理情報に関する棒グラフ、レスポンスコードの円グラフとともに表示されています。右側のダッシュボードには、より高い合計値を示す同様のレイアウトがあり、トラフィック量パネル、地理情報に関する棒グラフ、レスポンスコードの円グラフが含まれています。" /><p><em>Kibanaダッシュボードとカーソルチャットのダッシュボードを並べて表示します。</em></p><h3><strong>Kibanaからインポート</strong></h3><p>往復処理は逆方向でも機能します。</p><p>「ID abc-123でKibanaのダッシュボードをインポート」</p><p>これは既存のKibanaのダッシュボードを取得し、そのLensの可視化を編集可能なチャート構成に変換し、グリッドのレイアウトとセクションを保持して、すべてを example-mcp-dashbuilder に読み込みます。そこから自然言語で修正し、再エクスポートできます。</p><p>このように、AIは既存のKibanaワークフローにおける共同作業者となり、それを置き換えるものではありません。</p><h2><strong>カスタムテーマと色</strong></h2><p>ブランド化されたダッシュボードをご希望ですか？お問い合わせください：</p><p>「カスタムカラーを使用したピンクを基調としたダッシュボードを作成」</p><p>すべての可視化タイプはカスタムカラー設定をサポートしています：</p><ul><li><p><strong>チャート：</strong><code>palette</code> はシリーズとスライスに対して16進数の色の配列を指定できます。</p></li><li><p><strong>指標：</strong><code>color</code> が背景色を設定します。</p></li><li><p><strong>ヒートマップ：</strong> <code>colorRamp</code> は、低い値から高い値への勾配を定義します。</p></li></ul><p>AIはテーマのリクエストを自然に受け取ります。「海のテーマ」と伝えると、青やティールの色合いが選択されます。「自社のブランドカラーと一致させてください」と伝えて16進数の値を指定すると、エクスポート時にKibanaに引き継がれます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2bc7cddbdef81354/6a17e9a1ec0f89ee155a665e/4aceba013ac9cbb4a541109efd6acddf8a6ec47d-1562x1568.png" alt="カスタムピンクカラーの、テーマを使用したeコマースダッシュボード。レイアウトでは、上部に収益と注文のKPIが表示され、その下に折りたたみ式のトレンドセクション、さらにその下にカテゴリ別の2つのグラフ（カテゴリ別の収益を示す棒グラフと、カテゴリ別の注文数を示す円グラフ）が表示されています。" /><p><em>カスタムカラーの、テーマを使用したダッシュボード。</em></p><p><strong>example-mcp-dashbuilder の仕組み：MCPアーキテクチャ</strong></p><p>example-mcp-dashbuilderは、AIアシスタントを外部ツールやデータに接続するためのオープン標準である <a href="https://modelcontextprotocol.io/">MCP</a>に基づいて構築されています。アーキテクチャの概要は以下の通りです：</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6c0cd879646e9947/6a17e9a36864a4c408b687df/cbfeabe151ec1ee2b0655f4d17468c9bb358df7e-1024x559.png" alt="MCPサーバーに接続されたMCPホストを示すアーキテクチャ図で、ツール、リソース、手順の説明が含まれています。その下にあるMCPアプリボックスには、Elastic ChartsとKibanaのグリッドレイアウトが含まれています。ElasticsearchとKibanaが下部に表示され、それらをMCPアプリに接続する矢印があります。" /><p><strong>MCPサーバー</strong>は、AIが直接呼び出せる25のツールを公開しています。これには、ES|QLクエリの実行からダッシュボードのエクスポートまで、網羅的な内容が含まれています。さらに、インラインプレビューがデータの取得、レイアウト変更の永続化、時間フィールドの検出に使用する内部専用の「アプリのみ」ツールもいくつかあります。また、3つのリソースも提供しており、データ可視化のベストプラクティスガイド、ES|QLリファレンス、そしてオープンエンドのプロンプト（「ログを分析」、「このインデックスで何が興味深いのか」）に対応する深度分析プレイブックがあります。そして、stdioまたはHTTPのいずれかで実行されます。HTTPトランスポートはストリーム可能な対応とセッション管理をサポートしているため、複数のクライアントが1つのサーバーに接続できます。</p><p><strong>MCPアプリ</strong>は、インタラクティブなプレビューを表示します。React、<a href="https://elastic.github.io/elastic-charts">Elastic Charts</a>、<a href="https://eui.elastic.co/">Elastic UI</a>を組み合わせて構築されており、1つの独立したHTMLファイルにまとめられています。AIが <code>view_dashboard</code> を呼び出したり、チャートを作成したりすると、ホストはこのHTMLをサンドボックス化されたiframe内にレンダリングします。アプリ全体は<a href="https://modelcontextprotocol.io/extensions/apps/overview">MCP Appsのプロトコル</a>を通じてサーバーと通信し、postMessage上の <code>callServerTool()</code> を使ってデータの取得、レイアウトの保存、時間フィールドの検出を行います。localhostサーバーもなく、ポート設定も、外部ネットワーク依存もありません。</p><p>これは、あらゆるMCP互換のクライアント（Cursor、Claude Desktop、Claude.ai、VS CodeとCopilotの併用など）と動作することを意味します。</p><h2><strong>example-mcp-dashbuilder はどのようなチャートタイプをサポートしていますか？</strong></h2><p>執筆時点では、最も一般的なダッシュボードのシナリオをカバーする以下の6種類のチャートタイプがサポートされています。</p><p>タイプ</p><p>最適な用途</p><p>例</p><p>棒グラフ</p><p>カテゴリ比較</p><p>地理的ソース別のリクエスト</p><p>折れ線グラフ</p><p>一定期間におけるトレンドの変化</p><p>1時間あたりの転送バイト数</p><p>エリア</p><p>時間経過に伴うボリューム</p><p>時間経過に伴うリクエスト量</p><p>円グラフ</p><p>全体に占める割合（最大6切れ）</p><p>対応コードの分布</p><p>メトリック</p><p>スパークライン付きの単一KPI</p><p>時間別トレンド付きのリクエスト総数</p><p>ヒートマップ</p><p>二次元領域全体でのパターン</p><p>曜日・時間別リクエスト</p><p>ダッシュボードは、整理のための折りたたみ可能なセクション、自動時間フィールド検出を備えたタイムピッカー、および複数のダッシュボードを保存して切り替える機能をサポートしています。並行チャットセッションは、すべてのツールコールで<code>dashboardId</code>がスレッド化されているため、互いに分離された状態を維持します。</p><h2><strong>example-mcp-dashbuilder のインストールと実行方法</strong></h2><p>example-mcp-dashbuilder はオープンソースであり、すぐに利用可能です。Node.js 22+、Elasticsearchインスタンス（ローカルまたはElastic Cloud）、およびMCP互換のクライアントが必要です。</p><p><strong>Claude Desktop：</strong> <a href="https://github.com/elastic/example-mcp-dashbuilder/releases">GitHub Releases</a>から最新版<code>.mcpb</code>をダウンロードし、ダブルクリックします。Claude Desktopから、Elasticsearchの認証情報を入力するよう促されます。</p><p><strong>Cursor / Claude Code / VS Code Copilot：</strong>MCP設定をリリースされた tarball に指定します。クローンや <code>npm install</code> は不要です。</p>{
  "mcpServers": {
    "example-mcp-dashbuilder": {
      "type": "stdio",
      "command": "npx",
      "args": ["https://github.com/elastic/example-mcp-dashbuilder/releases/latest/download/example-mcp-dashbuilder.tgz"]
    }
  }
}<p>環境変数として <code>ES_NODE, ES_API_KEY</code>（または <code>ES_USERNAME / ES_PASSWORD</code>）と <code>KIBANA_URL</code> を設定します。ソースから作業したい場合は、リポジトリをクローンし、<code>npm run setup</code> を実行して、ローカルのElasticsearchとElastic Cloud（Cloud ID + APIキー）の両方を処理するインタラクティブウィザードを使用します。</p><p>次のように、構築を開始できます：</p><p>「ログのインデックスを探索し、可能な限り洞察に富むダッシュボードを作成してください」</p><p>AIがその後を引き継ぎます。😉</p><h2><strong>ロードマップ：example-mcp-dashbuilder の今後</strong></h2><p>これは初期リリースであり、現在も鋭意開発を進めています。以下の分野などに注力しています。</p><ul><li><p><strong>より多くのチャートタイプ：</strong>ゲージグラフ、ドーナツグラフ、ツリーマップ、データテーブル、タグクラウドなど、Lensの全機能に対応。</p></li><li><p><strong>ダッシュボードをGitにプッシュ：</strong>ダッシュボードの設定をリポジトリに書き込み、バージョン管理やコードレビューのワークフローを行います。</p></li><li><p><strong>優れたエラーUX：</strong>ES|QLクエリが失敗した場合、一般的な修正案を含むより詳細なフィードバックを提供します。</p></li><li><p><strong>より高度な分析フロー：</strong>詳細分析のプレイブックを拡張し、より多くのデータ形式（ログ、メトリクス、トレース）に対応します。</p></li></ul><p>お客様が構築されたものを、ぜひご紹介ください。お試しの後で問題があればご報告いただき、お客様のチームにとって最も役立つ可視化やワークフローはどのようなものかお知らせください。</p><p><a href="https://github.com/elastic/example-mcp-dashbuilder">GitHub: elastic/example-mcp-dashbuilder</a></p><h3>謝辞</h3><p><a href="mailto:walter.rafelsberger@elastic.co">ウォルター・ラフェルズバーガー</a>と<a href="mailto:tim.schnell@elastic.co">ティム・シュネル</a>の実装への貢献に感謝します。</p><h3>FAQ</h3><p><strong>example-mcp-dashbuilder とは？</strong>example-mcp-dashbuilder は、AIアシスタントをElasticsearchに接続するオープンソースのMCP（Model Context Protocol）アプリケーションです。Kibanaのダッシュボードを平易な日本語で説明し、ES|QLクエリを自動生成し、可視化を作成し、エディタのチャット画面内にライブかつインタラクティブなダッシュボードを表示できます。</p><p><strong>example-mcp-dashbuilder はデータ取得にどのようなクエリ言語を使っていますか？</strong>すべてのデータ取得には、Elasticsearchのパイプクエリ言語であるES|QLを使用しています。MCPサーバーには、クエリを書く前にAIが読み取るES|QLリファレンスが標準搭載されているため、各可視化タイプの正しい構文と効率的なアグリゲーションが確保されます。</p><p><strong>example-mcp-dashbuilder で作成したダッシュボードをKibanaにエクスポートできますか？</strong>はい。「このダッシュボードをKibanaにエクスポート」を実行すると、すべてのパネルが実際の Kibana Lens の可視化に変換され、ES|QLクエリ、48列のグリッドレイアウト、カスタムカラー、シリーズパレットが保持されます。結果は、スクリーンショットや埋め込みではなく、全面的に機能するKibanaのダッシュボードです。</p><p><strong>既存のKibanaのダッシュボードを example-mcp-dashbuilder にインポートして、AI支援型編集はできますか？</strong>はい。KibanaのダッシュボードIDを指定すると、既存のダッシュボードが取得され、Lensの可視化が編集可能なグラフ構成に変換され、example-mcp-dashbuilder に読み込まれます。その後、自然言語を使用してダッシュボードを変更し、Kibanaに再エクスポートできます。</p><p><strong>example-mcp-dashbuilder と互換性のあるMCPクライアントはどれですか？</strong>example-mcp-dashbuilder は、Cursor、Claude Desktop、Claude.ai、VS Code with Copilotなど、あらゆるMCP互換クライアントで動作します。stdioとHTTPトランスポートの両方をサポートしており、localhostサーバーやポートの設定は不要です。</p><p><strong>example-mcp-dashbuilder はどのチャートタイプをサポートしていますか？</strong>現在のリリースでは、棒グラフ、折れ線グラフ、面グラフ、円グラフ、メトリクス（スパークライン付き）、ヒートマップの6種類のグラフがサポートされています。Kibana Lensの全機能に合わせて、ゲージグラフ、ドーナツ、ツリーマップ、データテーブル、タグクラウドなどを追加する予定です。</p><p><strong>example-mcp-dashbuilder を実行するには何が必要ですか？</strong>Node.js 22以上、Elasticsearchインスタンス（ローカルまたはElastic Cloud）、およびMCP互換クライアントが必要です。環境変数 ES_NODE、ES_API_KEY（またはES_USERNAME/ES_PASSWORD）、KIBANA_URLを設定します。Claude Desktopの場合は、GitHub Releasesから.mcpbファイルをダウンロードし、ダブルクリックしてインストールします。</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/kibana-dashboard-builder-mcp-esql</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/kibana-dashboard-builder-mcp-esql</guid>
    <category><![CDATA[Kibana]]></category>
    <category><![CDATA[AI]]></category>
    <dc:creator><![CDATA[Stratoula Kalafateli]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2a69a35d6d51ff47/6a17e9a5b1e11339cd79f2b3/0d38385fd64c1445b2e955ba20532570f7f38679-1280x720.png" length="0" type="image/png"/>
    <pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[変数コントロールによるKibanaダッシュボードのインタラクション性の向上]]></title>
    <description><![CDATA[Kibana 8.18+の変数コントロールを使用して、個々の可視化をフィルタリングし、時間間隔を調整し、Kibanaダッシュボード内の異なるフィールドでグループ化する方法を学びます。]]></description>
    <content:encoded><![CDATA[<p>バージョン8.18以降および9.xシリーズすべての<strong>Kibanaダッシュボードで変数コントロールが利用できるようになりました</strong>。ダッシュボードユーザーから最も継続的にリクエストされていた追加機能の1つがついに導入されました 🎉 過去数か月間、変数コントロールの拡張と改良を続けてきたため、<a href="https://www.elastic.co/docs/explore-analyze/dashboards/add-controls#add-variable-control">変数コントロール</a>専用のブログ投稿を作成するのに絶好のタイミングとなりました。</p><h2>変数コントロールとは何ですか？</h2><p>Kibanaのダッシュボードを使用したことがある方なら、クラシックなダッシュボードコントロール（データの値を表示する便利なドロップダウン）をご存知でしょう。これにより、数回のクリックでフィルタリングできます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc7405fbff7584b1b/6a17ee5cfbc5f8aea1491b5d/b82c1b25a0b38661e5ce4552f763be487d5074aa-1600x701.png" alt="" /><p>変数コントロールは表面上では似ていますが、巧妙な工夫が施されています。ダッシュボード上のすべてのパネルを自動的にフィルター処理するのではなく、<a href="https://www.elastic.co/docs/explore-analyze/visualize/esorql">個々の可視化内の ES|QLクエリ</a>に直接プラグインすることができます。</p><p>つまり、各コントロールを適用する場所を<em>ユーザーが決定できる</em>ということです。さらに、時間間隔の調整、内訳フィールドの切り替え、可視化パラメーターの即時変更など、さまざまなクリエイティブなトリックに使用できます。基本的に、ダッシュボードに真のインタラクティブな体験を提供し、より速く、より簡単に洞察を得られるようにしています。</p><h2>変数コントロールのユースケース</h2><p>変数コントロールは便利そうですが、実際に何ができるのでしょうか？ダッシュボードをレベルアップさせる例をいくつかご紹介します。</p><h3>選択された可視化をフィルター</h3><p><em>一部の</em>可視化をフィルターし、他の可視化はそのままにしておきたい場合は、変数コントロールがまさに最適です。必要なパネルを選択して、可視化の背後にあるES|QLクエリでそれらを接続できます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfd014bba50a3a61e/6a17ee5e14d90c006d79b69a/efa367363830b03bc67028aceafe78c4b44e578f-1440x562.gif" alt="" /><h3>異なる時間間隔を選択</h3><p>ユーザーが「5分」、「1時間」、「1日」など、適切な時間枠を切り替えることができるようにします。事前定義された間隔で変数コントロールを構築し、それを時系列クエリに接続します。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt237797ddea95ce08/6a17ee602f4a5cfd65fa8996/62aa9f4e728036f8c70213b76b1cf131f36f5b4d-1440x606.gif" alt="" /><h3>機能を変更</h3><p>各操作ごとに複数のチャートを作成する代わりに、ダッシュボードユーザーが最大値、平均値、異なるパーセンタイル、またはその他のアグリゲーターを選択できるようにします。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt4c856460132fb604/6a17ee627b54f920838b3991/f6a2b4c73dc35efe462c2924a153d7b3fa3a7922-1436x606.gif" alt="" /><h3>異なるフィールドでグループ化</h3><p>調査中に、データをさまざまな次元で分類する必要がある場合があります。変数コントロールを使用すると、複数の「グループ化」フィールドを定義し、ダッシュボードユーザーが分析情報を明らかにするのに役立つフィールドを選択できるようにすることができます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbf1a24038dde55b8/6a17ee646864a413b6b6884c/fe8745a6fddccadba0666686b8ebc67fdaf64158-1438x606.gif" alt="" /><h2>作成方法</h2><p>変数コントロールを作成する最も簡単な（そしておそらく最も楽しい）方法は、可視化の<strong>ES|QLクエリエディタから</strong>直接作成することです。クエリを入力し始め、オートコンプリートメニューを使用すれば、Kibanaが役立つコントロールを自動的に作成します。</p><p>ただし、変数自体から開始したい場合は<strong>「パネルを追加」→「コントロール」→「変数コントロール」</strong>に進み、コントロールを作成した後で変数を可視化に追加することもできます。</p><h3>例1：複数値選択によるフィルタリングコントロール</h3><p>1. ES|QLクエリを利用した可視化を選択し、WHERE句内の「コントロールを作成」をクリックします。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1356c9ac1ffce732/6a17ee661d1b83104a93e4f3/46cb6f2a6775aee152d42eb5ee85170f1bdf26cb-1600x668.png" alt="" /><p>2. 自動的に変数作成のポップアップにリダイレクトされます。ここでは「クエリからの値」タイプが自動で選択され、変数の名前も既に入力されています。可視化クエリで動作するよう、コントロールの名前は常に「?...」で始める必要があります。</p><p>通常、フィールドから値を取得し、ダッシュボードで選択した時間範囲に応じて値を更新するには、次のようなクエリが必要になります。</p>FROM &lt;datasource_name&gt;
| WHERE @timestamp &lt;=?_tend and @timestamp &gt;?_tstart
| STATS BY &lt;field_name&gt;<img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb34ecc3303fda700/6a17ee68a2929914e3d02d23/a2a72d4e3159923c6207908da9b4172e27cd5f81-1600x716.png" alt="" /><p>3. コントロールを保存すると、それがダッシュボードのトップに表示され、可視化クエリが変数コントロール名で更新されます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte03c74e0c60bdb42/6a17ee6a0b0bed13cddd3636/5fc434c8951889e9769652b675191711d126a685-1600x653.png" alt="" /><p>4. コントロールに<a href="https://www.elastic.co/docs/explore-analyze/dashboards/add-controls#esql-multi-values-controls">多重選択</a>を追加したい場合は、ステップ2でクエリ内の <code>MV_CONTAINS</code> 関数を使用し、「複数選択を許可」を選択する必要があります（9.3以降で利用可能）。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt218a166f7a1dc52c/6a17ee6ca2929979a9d02d27/1f237cea0a37cb25a7917a2a683707a269adae8e-1600x670.png" alt="" /><h3>例 2: 時間間隔制御</h3><p>時系列を構築する場合は、日付ヒストグラム間隔に変数コントロールを簡単に追加できます。</p><p>1. 時系列のES|QLクエリを記述するときは、「コントロールを作成」をクリックします。変数を間隔用に作成する際は、<code>BUCKET</code> の代わりに <code>TBUCKET</code> を使用する方が良いです。これにより、「1 hour」、「1 day」などの見やすい間隔を受け入れることができます。<code>TBUCKET</code>には、時間範囲に自動的に適応できる自動オプションも近日中に導入される予定です。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta6f32acf5ed19697/6a17ee6e6864a4a32fb68850/b0ad53d790ff9bdd42db5e77477318319f423534-1600x664.png" alt="" /><p>2. ドロップダウンメニューでオプションを入力する間隔を定義します。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf08d6a75afe87314/6a17ee6f25daab58fe08a2fa/f3bd83f530cfa4698c1a3b1ae60d08d0414043b5-1600x757.png" alt="" /><p>3. ドロップダウンメニューで異なる間隔を選択し、可視化がどのように変化するかを確認します。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5ecd5f376b096063/6a17ee7196142a0f77eb1b9b/0f928d9c70929f64926e065059188d140cd48943-1600x671.png" alt="" /><h3>例3：関数の変数</h3><ol><li><p>「静的値」タイプのコントロールを使用して変数を作成し、ドロップダウン値に関数名を追加します。関数を置き換えるには、「??...」で始まる変数名を使用することが重要です。</p></li></ol><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6bdc0c817465f3f0/6a17ee73505ac3268cad8bea/531444237b7e152d3c8a6f3ca7e464f954f9e856-1600x663.png" alt="" /><p>2. ES|QLクエリに変数名を含めます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd631ad49bbb93c3e/6a17ee75e9ea87708ea9c6aa/9858442abb26d8d266d464852871b139fde63b89-1600x665.png" alt="" /><h3>例4：フィールドの変数</h3><ol><li><p>「静的値」タイプのコントロールを使用して、必要なフィールドの名前を書き留めることができます。フィールドで機能させるためには「??...」で始まる変数名を使用することが重要です。</p></li></ol><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt29079f2b85c7239c/6a17ee77b1e113328f79f30b/33534c3df2fae024b25c28b4aed5d742e54202a2-1600x710.png" alt="" /><p>2. 可視化クエリで任意の場所に変数を参照します。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6ca73c08dfa27319/6a17ee780b0bed31e8dd363a/71cdf3e9df72c59d957628a3aa6e4aa9bd60d6d5-1600x676.png" alt="" /><h2>Discoverの変数コントロール</h2><p>変数コントロールは単なるダッシュボードの特徴ではなく、DiscoverのES|QLエディターでも直接利用可能です。Discoverでより高速なデータ探索エクスペリエンスを実現するコントロールを構築し、それをダッシュボードに表示したり、その逆を行ったりすることができます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt40c9ce5eed7ded45/6a17ee7b420229747b29f684/fdddeec902d0bc746caed9276d01d7d48793dd85-1600x709.png" alt="" /><h2>技術的な詳細</h2><p>ここまでで、変数コントロールには、クエリのどの部分を参照できるか、使用すべき命名プレフィックス（値の場合は「?...」、フィールドまたは関数の場合は「??...」）などのいくつかのルールがあることに気付かれたでしょう。これは、変数がクライアント上で行われる単純な文字列置換ではなく、実際にはクエリ言語自体の第一級オブジェクトであるためです（<a href="https://www.elastic.co/docs/solutions/search/agent-builder/tools/esql-tools#parameter-types">ES|QL ではパラメーター</a>と呼ばれます）。</p><p></p><p>この設計にはいくつかの大きな利点があります。1つは、Kibanaが各変数のコンテキストを理解できるため、設定を自動的に生成して事前入力できることです。また、この言語が変数の入力を厳密に検証し、悪意のある挿入を防ぎ、何かおかしい点があれば適切にエラーを出力するため、安全性もはるかに高くなります。さらに、複雑な検証とエラー処理をクライアントではなくサーバー側に移動することで、パフォーマンスと安定性が向上します。パフォーマンスに関する注意点として、ベストプラクティスは、高速クエリを含む変数を構築することです。これにより、ダッシュボードよりも先に読み込まれ、遅いクエリがダッシュボード全体のパフォーマンスに影響を与えることを防ぎます。</p><p>もちろん、このアーキテクチャーにも（現時点では）いくつかの<a href="https://www.elastic.co/docs/solutions/search/agent-builder/limitations-known-issues#esql-limitations">制限</a>があります。変数はまだフィルタリング用の「任意」オプションをサポートしておらず、現在、<code>LIKE</code>や<code>FROM</code>（データソースの切り替え用）のような特定の演算子では使用できません。幸い、当社はこれらの機能を追加するために積極的に取り組んでいます。</p><h2>コントロールの今後</h2><p>この機能はまだ完成ではありません。以下のような改善を予定しています。</p><p>✨ ダッシュボードのどこにでもコントロールを配置できる機能</p><p>✨ コントロールの連鎖（一つのコントロールの出力が次のコントロールのインプットになるよう）</p><p>✨ 変数の「任意」選択のようなより良い選択オプション</p><p>✨ 新しいコントロールタイプ（検索するタイプのコントロールとデータソースの変数）</p><p>✨ さらに、ユーザーの皆様のご要望に応え、通常コントロールの事前フィルタリングなどの操作性の改善</p><p>アイデアやご意見があれば、ぜひお聞かせください。</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/kibana-dashboard-interactivity-variable-controls-overview</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/kibana-dashboard-interactivity-variable-controls-overview</guid>
    <category><![CDATA[Kibana]]></category>
    <category><![CDATA[分析]]></category>
    <dc:creator><![CDATA[Teresa Alvarez Soler]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltddeea5af6d4f9884/6a17ee7ddbb4ff3aa8fb5781/59aa3adffc8c759e42b961ef7d63719ce232893a-1348x830.png" length="0" type="image/png"/>
    <pubDate>Thu, 04 Dec 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[AI搭載ダッシュボード：ビジョンからKibanaへ]]></title>
    <description><![CDATA[LLM を使用してイメージを処理し、Kibana ダッシュボードに変換してダッシュボードを生成します。
]]></description>
    <content:encoded><![CDATA[<p><a href="https://www.elastic.co/kibana/kibana-lens">Kibana Lens を</a>使用するとダッシュボードのドラッグ アンド ドロップが非常に簡単になりますが、数十個のパネルが必要な場合はクリック回数が増えてしまいます。ダッシュボードをスケッチし、スクリーンショットを撮り、LLM にプロセス全体を任せることができたらどうでしょうか?</p><p>この記事では、それを実現します。ダッシュボードのイメージを取得し、マッピングを分析し、Kibana にまったく触れることなくダッシュボードを生成するアプリケーションを作成します。</p><p><strong>手順</strong>:</p><ol><li><p><a href="https://www.elastic.co/search-labs/blog/ai-powered-dashboards#background-&amp;-application-workflow">背景とアプリケーションのワークフロー</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/ai-powered-dashboards#prepare-data">データを準備する</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/ai-powered-dashboards#llm-configuration">LLM構成</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/ai-powered-dashboards#application-functions">アプリケーション機能</a></p></li></ol><h2>背景とアプリケーションのワークフロー</h2><p>最初に思いついたのは、LLM に NDJSON 形式の Kibana<a href="https://www.elastic.co/docs/explore-analyze/find-and-organize/saved-objects">保存オブジェクト</a>全体を生成させて、それを Kibana にインポートさせることでした。</p><p>私たちはいくつかのモデルを試しました:</p><ul><li><p>ジェミニ 2.5 プロ</p></li><li><p>GPT o3 / o4-ミニハイ / 4.1</p></li><li><p>クロード 4つのソネット</p></li><li><p>グロク3</p></li><li><p>ディープシーク（ディープシンク R1）</p></li></ul><p>プロンプトについては、次のように単純なものから始めました。</p>You are an Elasticsearch Saved-Object generator (Kibana 9.0).
INPUTS
=====
1. PNG screenshot of a 4-panel dashboard (attached).
2. Index mapping (below) – trimmed down to only the fields present in the screenshot.
3. Example NDJSON of *one* metric visualization (below) for reference.

TASK
====
Return **only** a valid NDJSON array that recreates the dashboard exactly:
* 2 metric panels (Visits, Unique Visitors)
* 1 pie chart (Most used OS)
* 1 vertical bar chart (State Geo Dest)
* Use index pattern `kibana_sample_data_logs`.
* Preserve roughly the same layout (2×2 grid).
* Use `panelIndex` values 1-4 and random `id` strings.
* Kibana version: 9.0<p><a href="https://www.elastic.co/search-labs/blog/function-calling-with-elastic#:~:text=Few%2Dshot%20prompting%20involves%20providing%20examples%20of%20the%20types%20of%20queries%20you%20want%20it%20to%20return%2C%20which%20helps%20in%20increasing%20consistency.">いくつかのショットの例</a>と、各視覚化の構築方法に関する詳細な説明を確認したにもかかわらず、うまくいきませんでした。この実験に興味がある方は、<a href="https://gist.github.com/TomasMurua/a78dc283e115624731beffc98984b70b">こちらで</a>詳細をご覧ください。</p><p>このアプローチの結果、LLM によって生成されたファイルを Kibana にアップロードしようとしたときに、次のメッセージが表示されました。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9ea005966a783057/6a1707d266c4f90e4ef8bf88/2b599443b5613c9f0fc3235581614add5b4b3900-891x98.png" alt="" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5e5632d6d95b998c/6a1707d3a6c2b9441de79661/d87ccfc033bc00ee8188c5cae18043fbca22784c-741x233.png" alt="" /><p>これは、生成された JSON が無効であるか、形式が間違っていることを意味します。最も一般的な問題は、LLM が不完全な NDJSON を生成したり、パラメータを幻覚させたり、あるいは、どれだけ強制しようとしても NDJSON ではなく通常の JSON を返したりすることでした。</p><p><a href="https://www.elastic.co/search-labs/blog/llm-functions-elasticsearch-intelligent-query">この記事</a>（<a href="https://www.elastic.co/docs/solutions/search/search-templates">検索テンプレートが</a>LLM フリースタイルよりもうまく機能した）に触発され、完全な NDJSON ファイルを生成するように要求するのではなく、テンプレートを LLM に提供し、コード内で LLM によって提供されたパラメータを使用して適切な視覚化を作成することにしました。このアプローチは期待を裏切らず、予測可能で拡張可能です。LLM ではなくコードが重い処理を実行するようになったためです。</p><p>アプリケーションのワークフローは次のようになります。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9f7738a4c7ddd0cd/6a1707d52b835f0a25f4b166/52c587cf0cf3517fdd4ee7ab95581dd4f2bce030-725x668.png" alt="" /><p></p><p><em>簡潔にするために一部のコードは省略しますが、完全なアプリケーションの動作コードは</em><a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/from-image-idea-to-kibana-dashboard-using-ai/from-image-idea-to-kibana-dashboard-using-ai.ipynb"><em><strong>この</strong></em></a><em>ノートブックに記載されています。</em></p><h2>要件</h2><p>開発を始める前に、次のものが必要です。</p><ol><li><p>Python 3.8以上</p></li><li><p><a href="https://docs.python.org/3/library/venv.html">Venv</a> Python環境</p></li><li><p>実行中のElasticsearchインスタンス、そのエンドポイント、APIキー</p></li><li><p>環境変数名 OPENAI_API_KEY に保存された OpenAI API キー:</p></li></ol>export OPENAI_API_KEY="your-openai-api-key"<h2>データを準備する</h2><p>データについては、シンプルさを保ち、Elastic のサンプル Web ログを使用します。<a href="https://www.elastic.co/docs/manage-data/ingest/sample-data#add-sample-data-sets">ここで、</a>そのデータをクラスターにインポートする方法を学習できます。</p><p>各ドキュメントには、アプリケーションにリクエストを発行したホストの詳細と、リクエスト自体とその応答ステータスに関する情報が含まれています。以下にサンプル文書を示します。</p>{
    "agent": "Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24",
    "bytes": 8509,
    "clientip": "70.133.115.149",
    "extension": "css",
    "geo": {
        "srcdest": "US:IT",
        "src": "US",
        "dest": "IT",
        "coordinates": {
            "lat": 38.05134111,
            "lon": -103.5106908
        }
    },
    "host": "cdn.elastic-elastic-elastic.org",
    "index": "kibana_sample_data_logs",
    "ip": "70.133.115.149",
    "machine": {
        "ram": 5368709120,
        "os": "osx"
    },
    "memory": null,
    "message": "70.133.115.149 - - [2018-08-30T23:35:31.492Z] \"GET /styles/semantic-ui.css HTTP/1.1\" 200 8509 \"-\" \"Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24\"",
    "phpmemory": null,
    "referer": "http://twitter.com/error/john-phillips",
    "request": "/styles/semantic-ui.css",
    "response": 200,
    "tags": [
        "success",
        "info"
    ],
    "@timestamp": "2025-07-03T23:35:31.492Z",
    "url": "https://cdn.elastic-elastic-elastic.org/styles/semantic-ui.css",
    "utc_time": "2025-07-03T23:35:31.492Z",
    "event": {
        "dataset": "sample_web_logs"
    },
    "bytes_gauge": 8509,
    "bytes_counter": 51201128
}<p>ここで、先ほどロードしたインデックス<code>kibana_sample_data_logs</code>のマッピングを取得しましょう。</p>INDEX_NAME = "kibana_sample_data_logs"

es_client = Elasticsearch(
    [os.getenv("ELASTICSEARCH_URL")],
    api_key=os.getenv("ELASTICSEARCH_API_KEY"),
)

result = es_client.indices.get_mapping(index=INDEX_NAME)
index_mappings = result[list(result.keys())[0]]["mappings"]["properties"]<p>後で読み込むイメージと一緒にマッピングを渡します。</p><h2>LLM構成</h2><p><a href="https://python.langchain.com/docs/concepts/structured_outputs/">構造化出力</a>を使用して画像を入力し、JSON オブジェクトを生成するために関数に渡す必要がある情報を含む JSON を受け取るように LLM を構成しましょう。</p><p>依存関係をインストールします。</p>pip install elasticsearch pydantic langchain langchain-openai -q<p>Elasticsearch は<a href="https://www.elastic.co/docs/manage-data/data-store/mapping">インデックス マッピングの</a>取得に役立ちます。Pydantic を使用すると、Python でスキーマを定義して LLM に従うように要求することができ、 <a href="https://www.elastic.co/search-labs/integrations/langchain">LangChain は</a>LLM と AI ツールの呼び出しを容易にするフレームワークです。</p><p>LLM から必要な出力を定義するために、Pydantic スキーマを作成します。画像からわかる必要があるのは、グラフの種類、フィールド、視覚化タイトル、ダッシュボード タイトルです。</p>class Visualization(BaseModel):
    title: str = Field(description="The dashboard title")
    type: List[Literal["pie", "bar", "metric"]]
    field: str = Field(
        description="The field that this visualization use based on the provided mappings"
    )


class Dashboard(BaseModel):
    title: str = Field(description="The dashboard title")
    visualizations: List[Visualization]<p>画像入力には、先ほど描いたダッシュボードを送信します。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7870f6421986d11d/6a1707d78b73cb3408189fa3/36441d7b5dc1f3ff2ac2a30710208d57ad41c716-1600x898.jpg" alt="" /><p>ここで、LLM モデルの呼び出しとイメージの読み込みを宣言します。この関数は、Elasticsearch インデックスのマッピングと、生成するダッシュボードの画像を受け取ります。</p><p><code>with_structured_output</code>を使用すると、Pydantic <code>Dashboard</code>スキーマを LLM が生成する応答オブジェクトとして使用できます。<a href="https://docs.pydantic.dev/latest/">Pydantic</a>を使用すると、検証付きのデータ モデルを定義できるため、LLM 出力が期待される構造と一致することが保証されます。</p><p>画像を base64 に変換して入力として送信するには、<a href="https://www.base64-image.de/">オンライン コンバーターを</a>使用するか、<a href="https://www.geeksforgeeks.org/python-convert-image-to-string-and-vice-versa/">コードで</a>実行します。</p>prompt = f"""
    You are an expert in analyzing Kibana dashboards from images for the version 9.0.0 of Kibana.

    You will be given a dashboard image and an Elasticsearch index mapping.

    Below are the index mappings for the index that the dashboard is based on.
    Use this to help you understand the data and the fields that are available.

    Index Mappings:
    {index_mappings}

    Only include the fields that are relevant for each visualization, based on what is visible in the image.
    """

message = [
    {
        "role": "user",
        "content": [
            {"type": "text", "text": prompt},
            {
                "type": "image",
                "source_type": "base64",
                "data": image_base64,
                "mime_type": "image/png",
            },
        ],
    }
]


try:
    llm = init_chat_model("gpt-4.1-mini")
    llm = llm.with_structured_output(Dashboard)
    dashboard_values = llm.invoke(message)

    print("Dashboard values generated by the LLM successfully")
    print(dashboard_values)
except Exception as e:
    print(f"Failed to analyze image and match fields: {str(e)}")<p>LLM にはすでに Kibana ダッシュボードに関するコンテキストがあるため、プロンプトですべてを説明する必要はなく、Elasticsearch と Kibana で動作していることを忘れないようにするための詳細のみを説明します。</p><p>プロンプトを分解してみましょう:</p><p>セクション</p><p>理由</p><p>あなたは、Kibana バージョン 9.0.0 の画像から Kibana ダッシュボードを分析するエキスパートです。</p><p>これを Elasticsearch と Elasticsearch バージョンで強化することで、LLM が古い/無効なパラメータを幻覚する可能性を減らします。</p><p>ダッシュボード イメージと Elasticsearch インデックス マッピングが提供されます。</p><p>LLM による誤った解釈を避けるために、この画像はダッシュボードに関するものであることを説明します。</p><p>以下は、ダッシュボードのベースとなるインデックスのインデックス マッピングです。これを使用すると、使用可能なデータとフィールドを理解するのに役立ちます。インデックス マッピング: {index_mappings}</p><p>LLM が有効なフィールドを動的に選択できるようにマッピングを提供することが重要です。そうしないと、ここでのマッピングをハードコードすることになり、厳しすぎることになります。あるいは、正しいフィールド名を含むイメージに依存することになりますが、これは信頼できません。</p><p>画像に表示されている内容に基づいて、各視覚化に関連するフィールドのみを含めます。</p><p>画像に関係のないフィールドを追加しようとすることがあるため、この強化を追加する必要がありました。</p><p>これにより、表示する視覚化の配列を含むオブジェクトが返されます。</p>"Dashboard values generated by the LLM successfully
title=""Client, Extension, OS, and Response Keyword Analysis""visualizations="[
   "Visualization(title=""Count of Client IP",
   "type="[
      "metric"
   ],
   "field=""clientip"")",
   "Visualization(title=""Extension Keyword Distribution",
   "type="[
      "pie"
   ],
   "field=""extension.keyword"")",
   "Visualization(title=""Most Used OS",
   "type="[
      "bar"
   ],
   "field=""machine.os.keyword"")",
   "Visualization(title=""Response Keyword Distribution",
   "type="[
      "bar"
   ],
   "field=""response.keyword"")"
]<h2>LLM応答の処理</h2><p>私たちはサンプルの 2x2 パネル ダッシュボードを作成し、 <a href="https://www.elastic.co/docs/api/doc/kibana/operation/operation-get-dashboards-dashboard">Get a dashboard API を</a>使用して JSON 形式でエクスポートしました。その後、パネルを視覚化テンプレート (円グラフ、棒グラフ、メトリック) として保存し、いくつかのパラメータを置き換えて、質問に応じて異なるフィールドを持つ新しい視覚化を作成できます。</p><p>テンプレート JSON ファイルは<a href="https://github.com/Delacrobix/elasticsearch-labs/tree/supporting-blog-content/from-image-idea-to-kibana-dashboard-using-ai/supporting-blog-content/from-image-idea-to-kibana-dashboard-using-ai/templates"><strong>ここで</strong></a>確認できます。後で置き換えたいオブジェクトの値を {<code>variable_name</code>} に変更したことに注意してください。
</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc55d69d84a08e668/6a1707d8a2929903acd00fb8/ec7e1ac0cd8b470df13e60940162b56778acb386-315x234.png" alt="" /><p>LLM が提供した情報を使用して、どのテンプレートを使用し、どの値を置き換えるかを決定できます。</p><p><code>fill_template_with_analysis</code> 視覚化の JSON テンプレート、タイトル、フィールド、グリッド上の視覚化の座標など、単一のパネルのパラメータを受け取ります。</p><p>次に、テンプレートの値を置き換えて、最終的な JSON 視覚化を返します。</p>def fill_template_with_analysis(
    template: Dict[str, Any],
    visualization: Visualization,
    grid_data: Dict[str, Any],
):
    template_str = json.dumps(template)
    replacements = {
	 "{visualization_id}": str(uuid.uuid4()),
        "{title}": visualization.title,
        "{x}": grid_data["x"],
        "{y}": grid_data["y"],
    }

    if visualization.field:
        replacements["{field}"] = visualization.field

    for placeholder, value in replacements.items():
        template_str = template_str.replace(placeholder, str(value))

    return json.loads(template_str)<p>簡単にするために、LLM が作成することを決定したパネルに割り当てる静的座標があり、上の画像のように 2x2 グリッド ダッシュボードが生成されます。</p># Filling templates fields
panels = []    
grid_data = [
    {"x": 0, "y": 0},
    {"x": 12, "y": 0},
    {"x": 0, "y": 12},
    {"x": 12, "y": 12},
]


i = 0

for vis in dashboard_values.visualizations:
    for vis_type in vis.type:
        template = templates.get(vis_type, templates.get("bar", {}))
        filled_panel = fill_template_with_analysis(template, vis, grid_data[i])
        panels.append(filled_panel)
        i += 1<p>LLM によって決定された視覚化タイプに応じて、JSON ファイル テンプレートを選択し、 <code>fill_template_with_analysis</code>を使用して関連情報を置き換え、後でダッシュボードを作成するために使用する配列に新しいパネルを追加します。</p><p>ダッシュボードの準備ができたら、<a href="https://www.elastic.co/docs/api/doc/kibana/operation/operation-post-dashboards-dashboard-id">ダッシュボードの作成 API</a>を使用して新しい JSON ファイルを Kibana にプッシュし、ダッシュボードを生成します。
</p>try:
    dashboard_id = str(uuid.uuid4())

    # post request to create the dashboard endpoint
    url = f"{os.getenv('KIBANA_URL')}/api/dashboards/dashboard/{dashboard_id}"

    dashboard_config = {
        "attributes": {
            "title": dashboard_values.title,
            "description": "Generated by AI",
            "timeRestore": True,
            "panels": panels,  # Visualizations with the values generated by the LLM
            "timeFrom": "now-7d/d",
            "timeTo": "now",
        },
    }

    headers = {
        "Content-Type": "application/json",
        "kbn-xsrf": "true",
        "Authorization": f"ApiKey {os.getenv('ELASTICSEARCH_API_KEY')}",
    }

    requests.post(
        url,
        headers=headers,
        json=dashboard_config,
    )

    # Url to the generated dashboard
    dashboard_url = f"{os.getenv('KIBANA_URL')}/app/dashboards#/view/{dashboard_id}"

    print("Dashboard URL: ", dashboard_url)
    print("Dashboard ID: ", dashboard_id)

except Exception as e:
    print(f"Failed to create dashboard: {str(e)}")<p>スクリプトを実行してダッシュボードを生成するには、コンソールで次のコマンドを実行します。</p>python &lt;file_name&gt;.py<p>最終結果は次のようになります。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5ceffed004153a4f/6a1707d9a929cf9147ae0901/e909afbf0e47d9a6e0f7bd07dfb2efcfa5cf06ac-921x715.png" alt="" /><h2>まとめ</h2><p>LLM は、テキストをコード化したり、画像をコード化したりするときに、強力な視覚機能を発揮します。ダッシュボード API を使用すると、JSON ファイルをダッシュボードに変換することも可能で、LLM といくつかのコードを使用して、画像を Kibana ダッシュボードに変換することもできます。</p><p>次のステップは、さまざまなグリッド設定、ダッシュボードのサイズ、位置を使用して、ダッシュボードのビジュアルの柔軟性を向上させることです。また、より複雑な視覚化と視覚化タイプのサポートを提供することも、このアプリケーションにとって便利な追加機能となるでしょう。</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/ai-powered-dashboards</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/ai-powered-dashboards</guid>
    <category><![CDATA[Kibana]]></category>
    <category><![CDATA[AI]]></category>
    <dc:creator><![CDATA[Jeffrey Rengifo,Tomás Murúa]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt41727cbee6155a68/6a1707dbb0367dd2fd72bc86/eb60ceb2fbc3941745b21ae3357cbb6ea8fab18c-1443x811.png" length="0" type="image/png"/>
    <pubDate>Wed, 16 Jul 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Spotify Wrapped パート2: データ分析と視覚化]]></title>
    <description><![CDATA[Spotify データをこれまで以上に深く掘り下げて、存在すら知らなかったつながりを探ります。]]></description>
    <content:encoded><![CDATA[<p>Iulia Feroli が執筆したこのシリーズの<a href="https://www.elastic.co/search-labs/blog/spotify-wrapped-create-in-kibana">最初の部分</a>では、Spotify Wrapped データを取得して Kibana で視覚化する方法について説明しました。パート 2 では、データをさらに深く掘り下げて、他に何がわかるかを調べます。これを実現するために、少し異なるアプローチを活用し、 <a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/spotify-to-elasticsearch">Spotify から Elasticsearch を</a>使用してデータを Elasticsearch にインデックスします。このツールは少し高度で、もう少しセットアップが必要ですが、その価値はあります。データがより構造化され、より複雑な質問をすることができます。</p><h2>最初のSpotify Wrapped分析との違い</h2><p>最初のブログでは、Spotify エクスポートを直接使用し、正規化タスクやその他のデータ処理は実行しませんでした。今回も同じデータを使用しますが、データをより使いやすくするためにデータ処理を行います。これにより、次のようなより複雑な質問に答えることができるようになります。</p><ul><li><p>トップ 100 の曲の平均再生時間はどれくらいですか?</p></li><li><p>トップ 100 の曲の平均的な人気はどれくらいですか?</p></li><li><p>曲の平均視聴時間はどれくらいですか?</p></li><li><p>最もスキップされたトラックは何ですか?</p></li><li><p>いつトラックをスキップしたいですか?</p></li><li><p>一日のうち特定の時間帯に他の時間帯よりも多く音楽を聴いていますか?</p></li><li><p>特定の曜日に他の曜日よりも多く聴いていますか?</p></li><li><p>特に興味のある月ですか？</p></li><li><p>最も長い聴取時間を持つアーティストは誰ですか?</p></li></ul><p>Spotify Wrapped は、今年何を聴いたかを示してくれる、毎年楽しい体験です。前年比の変化は表示されないため、かつてはトップ 10 に入っていたものの、現在は消えてしまったアーティストを見逃してしまう可能性があります。</p><h2>Spotify Wrapped データを分析用に処理する</h2><p>最初の投稿と 2 番目の投稿では、データの処理方法に大きな違いがあります。最初の投稿のデータを使用して作業を継続する場合は、いくつかのフィールド名の変更を考慮する必要があり、また、ES|QL に戻って<code>hour of day</code>などの特定の抽出をオンザフライで実行する必要があります。</p><p>それでも、皆さんはこの投稿を追うことができるはずです。<a href="https://github.com/elastic/elasticsearch-labs/tree/main/supporting-blog-content/spotify-to-elasticsearch">Spotify から Elasticsearch リポジトリへの</a>データ処理では、Spotify API に曲の長さや人気度を問い合わせ、いくつかのフィールドの名前を変更したり、強化したりします。たとえば、Spotify エクスポートの<code>artist</code>フィールド自体は単なる文字列であり、フィーチャーや複数のアーティストのトラックを表すものではありません。</p><h2>ダッシュボードでSpotify Wrappedデータを視覚化する</h2><p>データを視覚化するために Kibana でダッシュボードを作成しました。ダッシュボードは<a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/spotify-to-elasticsearch/kibana/dashboard.ndjson">ここから</a>入手でき、Kibana インスタンスにインポートできます。ダッシュボードは非常に広範囲にわたっており、上記の質問の多くに答えてくれます。</p><p>いくつかの質問とその答え方を一緒に見ていきましょう。</p><h3>トップ 100 の曲の平均再生時間はどれくらいですか?</h3><p>この質問に答えるには、Lens または ES|QL を使用できます。3つのオプションをすべて検討してみましょう。この質問を Elasticsearch のやり方で正しく表現してみましょう。上位 100 曲を見つけて、それらの曲すべてを合わせた平均時間を計算します。Elasticsearch の用語では、これは 2 つの集約になります。</p><ol><li><p>トップ100曲を調べる</p></li><li><p>100 曲の平均再生時間を計算します。</p></li></ol><p><strong>Lens</strong></p><p>Lens では、これはかなり簡単です。新しい Lens を作成し、テーブルに切り替えて、 <code>title</code>フィールドをテーブルにドラッグ アンド ドロップします。次に、 <code>title</code>フィールドをクリックしてサイズを 100 に設定し、 <code>accuracy</code>モードを設定します。次に、 <code>duration</code>フィールドをテーブルにドラッグ アンド ドロップし、 <code>last value</code>を使用します。実際に必要なのは、各曲の長さの最後の値だけだからです。同じ曲の長さは 1 つだけです。この<code>last value</code>集計の下部には要約行のドロップダウンがあり、 <code>average</code>を選択すると要約行が表示されます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5df1d7f36de5e2ae/6a17e5df0b0beddd57dd355c/a56f6e48e6b53af3ca3d38d67ce0916d0621ef16-2910x1058.png" alt="Spotify WrappedデータにLensを使用する" /><p><strong>ES|QL</strong></p><p>ES|QL は、DSL や集約と比較するとかなり新しい言語ですが、非常に強力で使いやすいです。ES|QL で同じ質問に答えるには、次のクエリを記述します。</p><p>この ES|QL クエリを段階的に説明します。</p><ol><li><p><code>from spotify-history</code> - これは私たちが使用しているインデックス パターンです。</p></li><li><p><code>stats duration=max(duration), count=count() by title</code> - これは最初の集計であり、各曲の最大継続時間と各曲の数を計算しています。Lens で使用されている<code>last value</code>の代わりに<code>max</code>を使用します。これは、ES|QL には現在 first または last がないためです。</p></li><li><p><code>sort count desc</code> - 曲は各曲のカウントで並べ替えられるため、最も多く聴かれた曲が一番上に表示されます。</p></li><li><p><code>limit 100</code> - 結果は上位 100 曲に制限されます。</p></li><li><p><code>stats Average duration of the songs=avg(duration)</code> - 曲の平均再生時間を計算します。</p></li></ol><h3>私にとって特に興味深い月はありますか?</h3><p>この質問に答えるには、ランタイム フィールドと ES|QL の助けを借りて Lens を使用できます。すぐに気づくのは、データ内に<code>month</code>を直接示すフィールドがないため、代わりに<code>@timestamp</code>フィールドから計算する必要があるということです。これを行うには複数の方法があります。</p><ol><li><p>ランタイムフィールドを使用してレンズに電力を供給する</p></li><li><p>ES|QL</p></li></ol><p>個人的には、ES|QL の方がすっきりして素早いソリューションだと思います。</p><p>これで完了です。特別なことは何も必要ありません。 <code>DATE_EXTRACT</code>関数を利用して<code>@timestamp</code>フィールドから月を抽出し、それを集計することができます。ES|QL 視覚化を使用すると、それをダッシュボードにドロップできます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2c221ad4446cfb09/6a17e5e03e9e45076eba144c/7f942cf38fbe0fecec1d741e7df922196f4e9483-1878x722.png" alt="Spotify Wrapped 月次内訳の視覚化" /><h3>アーティストごとの年間視聴時間はどのくらいですか?</h3><p>その背後にある考え方は、アーティストが単なる一回限りのものなのか、それとも再発するものなのかを確認することです。私の記憶が正しければ、Spotify では年間ラップのトップ 5 アーティストのみが表示されます。おそらく、6 位のアーティストはずっと同じままでしょうか、それとも 10 位以降は大きく変わるのでしょうか?</p><p>これを最も簡単に表現したものの 1 つは、パーセンテージ棒グラフです。これには Lens を使用できます。次の手順に従ってください:</p><p><code>listened_to_ms</code>フィールドをドラッグ アンド ドロップします。このフィールドは、曲を聴いた時間をミリ秒単位で表します。デフォルトでは、Lens は<code>median</code>集約を作成しますが、これは不要なので、 <code>sum</code>に変更します。上部の棒グラフの種類として、 <code>stacked</code>ではなく<code>percentage</code>選択します。内訳については、 <code>artist</code>選択し、トップ 10 を選択してください。<code>Advanced</code>ドロップダウンでは必ず<code>accuracy mode</code>を選択してください。各カラーブロックは、このアーティストをどれだけ聴いたかを表します。タイムピッカーに応じて、バーは日、週、月、年などの値を表す場合があります。週ごとの内訳が必要な場合は、 <code>@timestamp</code>を選択し、 <code>mininum interval</code>を<code>year</code>に設定します。私の場合、最もよく聴いたアーティストは<code>Fred Again..</code>であり、総聴取時間の約 12% が<code>Fred Again..</code>に費やされたことがわかります。また、2024年には<code>Fred Again..</code>若干減少しましたが、 <code>Jamie XX</code>大幅に増加しました。バーの大きさだけを比較してみましょう。また、 <code>Billie Eilish</code>が 2024 年に継続的に再生されている間、バーの幅が広くなっていることもわかります。これは、2023 年よりも 2024 年に<code>Billie Eilish</code>多く聴いたことを意味します。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blteb0c11b909be859f/6a17e5e2e8fbce239a3a18ee/61a5bcc6b7385ed0a11b67c9c6bab32d27f4a49b-2942x1354.png" alt="Kibana を使った Spotify Wrapped 履歴の可視化" /><h3>全体の視聴時間に対するアーティストごとのトップトラックはどうですか?</h3><p>それは長い質問ですね。私が何を言いたいのか、それで説明してみたいと思います。Spotify では、特定のアーティストのトップソング、または全体のトップ 5 曲を教えてくれます。それは確かに興味深いですが、アーティストの内訳はどうですか?私の時間はすべて、何度も繰り返し再生する 1 つの曲に費やされているのでしょうか、それとも均等に分散されているのでしょうか?</p><p>新しいレンズを作成し、タイプとして<code>Treemap</code>を選択します。<code>metric</code>については、前と同じように、 <code>sum</code>を選択し、フィールドとして<code>listened_to_ms</code>を使用します。<code>group by</code>には 2 つの値が必要です。最初は<code>artist</code>で、次に 2 番目に<code>title</code>を追加します。中間結果は次のようになります。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9aa0e4877472123f/6a17e5e44b055d6dcf43218e/2dea389664a0d3d13fff03c6337bff3ce740f9b1-2922x1430.png" alt="Kibana を使った Spotify Wrapped 履歴の可視化" /><p>これをトップ 100 アーティストに変更し、詳細ドロップダウンで<code>other</code>を選択解除し、精度モードを有効にしましょう。タイトルをトップ 10 に変更し、精度モードを有効にします。最終結果は次のようになります。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt070bf745be1d3f92/6a17e5e66864a43a0fb6875b/7e99a15c69801e58302af4c12b500242a7e8bc9d-2640x1622.png" alt="Kibana を使用した Spotify Wrapped の視覚化" /><p>これは具体的に何を意味するのでしょうか?時間要素を見なくても、Spotify での私の全視聴履歴のうち、5.67% を<code>Fred Again..</code>視聴に費やしたことがわかります。特に、その時間のうち 1.21% を<code>Delilah (pull me out of this)</code>視聴に費やしました。アーティストが占める曲が 1 曲だけなのか、それとも他の曲もあるのかどうかを見るのは興味深いです。ツリーマップ自体は、このようなデータ分布を表すのに適した形式です。</p><h3>特定の時間と曜日に聞きますか?</h3><p>そうですね、 <code>Heat Map</code>を活用した Lens 視覚化を使えば、非常に簡単に答えることができます。新しいレンズを作成するには、 <code>Heat Map</code>を選択します。<code>Horizontal Axis</code>では<code>dayOfWeek</code>フィールドを選択し、トップ 3 ではなく<code>Top 7</code>に設定します。<code>Vertical Axis</code>の場合は<code>hourOfDay</code>を選択し、 <code>Cell Value</code>の場合は単純な<code>Count of records</code>選択します。これで次のパネルが生成されます:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2d08e4f4d0a90550/6a17e5e7e8fbce1af43a18f2/c83ec13a3c7d1b71b8a6b110ed2b74e691d868e6-3538x1720.png" alt="Spotify Wrapped のダッシュボードを使った視聴習慣の視覚化" /><p>このレンズには、解釈するときに邪魔になる厄介な点がいくつかあります。少し整理してみましょう。まず、凡例はあまり気にしないので、上部の三角形、四角形、円の記号を使用して無効にします。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltce46c47addd91c61/6a17e5e94b055d15d5432192/84f51d6c885b929bf47ac05edd32ca149ad2e651-1040x298.png" alt="Spotify Wrapped の視覚化 " /><p>さて、2番目に面倒なのは、日付の並べ替えです。指定した値に応じて、月曜日、水曜日、木曜日などになります。<code>hourOfDay</code>は正しくソートされています。日をソートする方法は面白いハックであり、 <code>Top Values</code>の代わりに<code>Filters</code>使用すると言われています。<code>dayOfWeek</code>をクリックして<code>Filters</code>を選択すると、次のようになります。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0e9c6005a917d4de/6a17e5eb4b055d6e10432196/2498a66098d40a1ba44d3f88464a9888dca204af-3574x1294.png" alt="Kibana ダッシュボードで Spotify Wrapped の履歴を視覚化" /><p>さあ、日付を入力し始めましょう。1 日につき 1 つのフィルター。<code>"dayOfWeek" : Monday</code>にしてラベル<code>Monday</code>を付け、これを繰り返します。</p><p>ただし、1 つの注意点は、Spotify がタイムゾーン情報なしで UTC+0 でデータを提供していることです。もちろん、IP アドレスと視聴した国も提供されており、そこからタイムゾーン情報を推測することはできますが、これは不正確になる可能性があり、米国のように複数のタイムゾーンがある国では面倒すぎる可能性があります。これは重要です。Elasticsearch と Kibana はタイムゾーンをサポートしており、 <code>@timestamp</code>フィールドに正しいタイムゾーンを指定すると、Kibana は自動的に時間をブラウザの時間に合わせて調整します。</p><p>完成するとこのようになり、私は勤務時間中は非常に積極的に聞き手であり、土曜日と日曜日はそれほどではないことがわかります。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd8eaab83c8c9c7f2/6a17e5ed6df7315e250a0ec5/c664c90ff8e852e1766e8101afc20c58e110f09c-3582x2030.png" alt="Kibana ダッシュボードを使用した Spotify Wrapped の視覚化" /><h2>まとめ</h2><p>このブログでは、Spotify データが提供する複雑な点について、もう少し詳しく説明します。いくつかの視覚化を実現するためのシンプルで簡単な方法をいくつか紹介しました。自分の視聴履歴をこれほど細かく制御できるのは、本当に素晴らしいことです。シリーズの他の部分もご覧ください:</p><ul><li><p><a href="https://www.elastic.co/search-labs/blog/spotify-wrapped-create-in-kibana">パート1：KibanaでSpotify Wrappedを作成する方法</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/elasticsearch-anomaly-detection-jobs">パート3：異常検出人口ジョブ</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/find-relationships-in-data">パート4: データ内の関係性の検出</a></p></li><li><p><a href="https://www.elastic.co/search-labs/blog/vectors-spotify-wrapped-part-05">パート5：ベクトルを使って最高の音楽仲間を見つける</a></p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/spotify-wrapped-data-analysis-visualization</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/spotify-wrapped-data-analysis-visualization</guid>
    <category><![CDATA[Kibana]]></category>
    <category><![CDATA[分析]]></category>
    <dc:creator><![CDATA[Philipp Kahr]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7f8cddbca1a54cd5/6a17e5efe9ea87717ba9c585/e04f85e87b5b4e69b6e2df9367840a56985b96a1-1792x1024.png" length="0" type="image/png"/>
    <pubDate>Tue, 25 Feb 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[OllamaとKibanaを使用して、RAG用にDeepSeek R1をローカルでテストします。]]></title>
    <description><![CDATA[DeepSeekのローカルインスタンスを実行し、Kibana内から接続する方法を学びましょう。]]></description>
    <content:encoded><![CDATA[<p>中国のヘッジファンドHigh-Flyerの新しい大規模言語モデルDeepSeek R1が話題になっています。オープンウェイトの有能で思考の連鎖的推論法が導入された今、業界にとってこれが何を意味するのかについての憶測が飛び交っています。RAGとElasticsearchのすべてのベクトルデータベース機能を使用してこの新しいモデルを試してみたい方のために、ローカル推論を使用してDeepSeek R1を使い始めるための簡単なチュートリアルを以下に示します。その過程で、ElasticのPlayground機能を使用し、RAGに対するDeepseek R1の良い点と悪い点も発見します。</p><p>このチュートリアルで設定する内容の図を以下に示します。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3214cc505e3d4d06/6a17df98dbb4ff12bafb55da/8aafec9011e986cd85b10958544a4d77be81e518-739x419.png" alt="ElasticsearchとOllamaを使用したDeepseekの構成" /><h2>Ollamaを使用したローカル推論の設定</h2><p><a href="https://ollama.com/">Ollama</a>は、ローカル推論用に厳選されたオープンソースモデルのセットを迅速にテストするための優れた方法であり、AI開発者に人気のツールです。</p><h3>Ollamaをベアメタルで実行</h3><p>Mac、Linux、またはWindowsでの<a href="https://github.com/ollama/ollama/tree/main?tab=readme-ov-file#ollama">ローカルインストール</a>は、特にMシリーズのAppleチップを使用しているユーザーにとって、ローカルのGPU機能を活用する最も簡単な方法です。Ollamaをインストールしたら、次のコマンドを使用してDeepSeek R1をダウンロードして実行できます。</p><p>ハードウェアに適したパラメータサイズに調整することをお勧めします。利用可能なサイズは<a href="https://ollama.com/library/deepseek-r1">こちら</a>でご確認いただけます。</p>ollama run deepseek-r1:7b<p>ターミナルでモデルとチャットできますが、CTL+dでコマンドを終了するか「/bye」と入力しても、モデルは実行されたままです。モデルがまだ実行中であることを確認するには、次のように入力します。</p>ollama ps<h3>Ollamaをコンテナ内で実行</h3><p>最も簡単な方法としては、OllamaをDockerのようなコンテナエンジンを利用して実行することもできます。ローカルマシンのGPUの使用は、環境によっては必ずしも簡単ではありませんが、コンテナに数GBモデルに適合するRAMとストレージがあれば、簡単なテストセットアップを行うことは難しくありません。</p><p>OllamaをDockerで起動して実行するには、次のコマンドを実行するだけです。</p>mkdir ollama_deepseek
cd ollama_deepseek
mkdir ollama
docker run -d -v ./ollama:/root/.ollama -p 11434:11434 \
--name ollama ollama/ollama
<p>これにより、現在のディレクトリに「ollama」というディレクトリが作成され、コンテナ内にマウントされ、Ollamaの設定とモデルを格納します。使用するパラメータの数によって、数GBから数十GBまでの範囲になるため、十分な空き容量があるボリュームを選択してください。</p><p>注意：マシンにNvidia GPUが搭載されている場合は、必ず<a href="https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#installation">Nvidia コンテナツールキット</a>をインストールし、上記のdocker 実行コマンドに「--gpus=all」を追加してください。</p><p>Ollamaコンテナがマシン上で起動したら、deepseek-r1のようなモデルを次のコマンドでプルできます。</p>docker exec -it ollama ollama pull deepseek-r1:7b<p>ベアメタルアプローチと同様に、ハードウェアに合ったサイズにパラメーターサイズを調整したい場合があります。利用可能なサイズについては、<a href="https://ollama.com/library/deepseek-r1">https://ollama.com/library/deepseek-r1</a>をご覧ください。</p><p>モデルのプルが終了したら、「/bye」と入力してプロンプトを終了できます。モデルがまだ実行中であることを確認するには以下の手段を実行します。</p>docker exec -it ollama ollama ps<h2>curlを使用したローカル推論のテスト</h2><p>curlを使用してローカル推論をテストするには、次のコマンドを実行します。JSONナラティブ応答を簡単に読み取れるように、stream:falseを使用しています。</p>curl http://localhost:11434/api/generate -d '{
  "model": "deepseek-r1:7b",
  "stream": false,
  "prompt":"Why is Elastic so cool?"
}'<h2>「OpenAI互換」のOllamaとRAGプロンプトをテスト</h2><p>便利なことに、OllamaはKibanaを含む幅広いツールとの互換性のために、OpenAIの動作を模倣するRESTエンドポイントも提供しています。</p>curl http://localhost:11434/v1/chat/completions -d '{
  "model": "deepseek-r1:7b",
  "stream": false,
  "messages": [
    { 
      "role": "system", 
      "content": "You are a helpful AI Assistant that uses the following context to answer questions only use the following context. \n\nContext:  The color of the sky today is purple. "},
    { "role": "user", 
      "content": "What does the sky look like today?" 
    }
  ]
}'<p>このより複雑なプロンプトをテストすると、&lt;think&gt;セクションを含むコンテンツが生成されます。このセクションでは、モデルが問題を推論するようにトレーニングされています。</p>&lt;think&gt; 
Okay, so I need to figure out what the user is asking for here. They provided a context where the sky is described as purple today and then asked about how the sky looks. At first glance, it seems straightforward—maybe they just want confirmation or more details on why the sky is that color.
Wait, but maybe there's something deeper. Purple skies aren't something I encounter every day. It usually happens at certain times of the year, like during sunrise or sunset with the sun setting in pink or orange. Could this be a hint about the time of day? Or perhaps it's just an unusual natural phenomenon? 
I should consider if \"purple\" is a typo. Maybe they meant something else like blue or gray. But since they specifically said purple, I'll go with that. Purple skies can happen when there are atmospheric conditions that scatter light differently, maybe due to pollution or cloud cover affecting the sunset.

So, putting it all together, the user might be looking for an explanation of why today's sky is purple and what that implies about the weather or time of day. Alternatively, they could just want a simple statement confirming that the sky looks purple today.
&lt;/think&gt;

The color of the sky today is described as purple. This unusual shade can occur due to atmospheric conditions affecting light scattering, such as during sunrise/sunset with pollution or cloud cover influencing the sunset's hues.<h2>OllamaをKibanaに接続する</h2><p>Elasticsearchを使用する優れた方法は、「<a href="https://github.com/elastic/start-local?tab=readme-ov-file#-try-elasticsearch-and-kibana-locally">start-local</a>」開発スクリプトを使うことです。</p><p>KibanaとElastisearchがネットワーク上でOllamaにアクセスできることを確認します。Elastic Stackのローカルコンテナ設定を使用している場合は、「localhost」を「host.docker.internal」または「host.containers.internal」に置き換える必要があるかもしれません。これは、ホストマシンへのネットワークパスを取得するためです。</p><p>Kibanaで、[Stack Management] &gt; [アラートと洞察] &gt; [コネクタ]に移動します。</p><h3>この一般的な設定の警告が表示された場合の対処方法</h3><p>xpack.encryptedSavedObjects.encryptionKeyが<a href="https://www.elastic.co/guide/en/kibana/current/xpack-security-secure-saved-objects.html">正しく設定されている</a>ことを確認する必要があります。これは、KibanaのローカルDockerインストールを実行する際によく見落とされる手順であるため、Docker構文で修正する手順をリストします。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta4f7b7be2e04afae/6a17df9a1d1b8391e293e393/b70b4b810bcac1d1599b07da90a98c5c744a38de-497x223.png" alt="" /><p>コンテナのシャットダウン時に変更が保存されるように、kibana/configディレクトリを永続化してください。私のKibanaコンテナのボリュームは、docker-compose.ymlで次のようになります。</p>services:
  kibana:
...
   volumes:
      - certs:/usr/share/kibana/config/certs
      - kibanadata:/usr/share/kibana/data
      - kibanaconfig:/usr/share/kibana/config
...
volumes:
  certs:
    driver: local
  esdata01:
    driver: local
  kibanadata:
    driver: local
  kibanaconfig:
    driver: local<p>これで、キーストアを作成し、値を入れて、コネクタのキーが平文で格納されないようにすることができます。</p>## generate some new keys for me and print them to the terminal
docker exec -it kibana_1 bin/kibana-encryption-keys generate

## create a new keystrore
docker exec -it kibana_1 bin/kibana-keystore create
docker exec -it kibana_1 bin/kibana-keystore add xpack.encryptedSavedObjects.encryptionKey

## You'll be prompted to paste in a value<p>変更を確実に有効にするには、クラスター全体を完全に再起動してください。</p><h3>コネクタの作成</h3><p>コネクタ構成画面（Kibana では、[Stack Management] &gt; [アラートと洞察] &gt; [コネクタ] に移動）からコネクタを作成し、[OpenAI] タイプを選択します。</p><p>コネクタを次の設定で構成します。</p><ul><li><p>コネクタ名：Deepseek（Ollama）</p></li><li><p>OpenAIプロバイダーを選択：その他（OpenAI互換サービス）</p></li><li><p>URL: <a href="http://localhost:11434/v1/chat/completions">http://localhost:11434/v1/chat/completions</a></p><ul><li><p>ollamaへの正しいパスを調整してください。コンテナ内から呼び出す場合は、host.docker.internalまたは同等のものに置き換えてください。</p></li></ul></li><li><p>デフォルトモデル：deepseek-r1:7b</p></li><li><p>APIキー：何か適当に入力してください。入力は必要ですが、値は重要ではありません。</p></li></ul><p>コネクタセットアップでのOllamaへのカスタムコネクタのテストは現在8.17では機能しませんが、Kibanaの今後の8.18ビルドでは修正される予定です。</p><p>コネクタは次のようになります。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt774e0793eb110f9d/6a17df9c445de981014d004d/4ce214aa953b4090ed112fbde40b01c01fb8f5c7-786x836.png" alt="" /><h2>Elasticsearchにベクトル埋め込みデータを取り込む</h2><p>すでにPlaygroundに精通していてデータが設定されている場合は以下のPlaygroundの手順にスキップできますが、簡単なテストデータが必要な場合は、_inference APIが設定されていることを確認する必要があります。8.17以降、機械学習の割り当ては動的であるため、e5多言語高密度ベクトルをダウンロードして有効にするには、Kiban Devツールで次のコマンドを実行する必要があります。</p>GET /_inference


POST /_inference/text_embedding/.multilingual-e5-small-elasticsearch
{
   "input": "are internet memes about deepseek sound investment advice?"
}<p>まだダウンロードしていない場合は、Elasticのモデルリポジトリからe5モデルのダウンロードが開始されます。</p><p>次に、RAGのコンテキストとしてパブリックドメインの書籍を読み込みましょう。こちらの<a href="https://www.gutenberg.org/cache/epub/11/pg11.txt">リンク</a>から、プロジェクト・グーテンベルクで「不思議の国のアリス」をダウンロードできます。これを.txtファイルとして保存してください。</p><p>[Elasticsearch] &gt; [ホーム] &gt; [ファイルのアップロード] に移動します。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt45c594487844ecb4/6a17df9dfaa9137edb93c786/649042271f34a5e66789b17c39bfe95971c7f4ce-1360x629.png" alt="" /><p>テキストファイルを選択またはドラッグアンドドロップし、インポートボタンを押します。</p><p>「データのインポート」画面で「詳細設定」タブを選択し、インデックス名を「book_alice」に設定します。</p><p>「自動的に作成されたフィールド」のすぐ下にある小さな「追加フィールドを追加」オプションを選択します。「セマンティックテキストフィールドの追加」を選択し、推論エンドポイントを「.multilingual-e5-small-elasticsearch」に変更します。[追加] を選択し、[インポート] を選択します。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt9d9c22ccdaee8590/6a17df9f3e03d731f94f2b8e/e58d5c9a2d406d8e62eb96cab9ac98ca89414346-507x602.png" alt="" /><p></p><p>ロードと推論が完了したら、Playgroundに向かう準備が整います。</p><h2>PlaygroundでのRAGのテスト</h2><p>Kibanaで [Elasticsearch] &gt; [Playground] に移動します。</p><p>Playground画面には、コネクタが存在することを示す緑色のチェックマークと「LLM接続済み」と表示されます。これは、上記で作成したOllamaコネクタです。Playgroundのより詳しいガイドについては、<a href="https://www.elastic.co/guide/en/kibana/current/playground.html">こちら</a>をご覧ください。</p><p>青色の [データソースを追加] をクリックし、以前に作成したbook_aliceインデックス、または埋め込みに推論APIを利用する以前に構成した別のインデックスを選択します。</p><p>Deepseekは、強力なアライメント特性を備えた思考連鎖モデルです。これはRAGの観点から見ると良い点と悪い点の両方があります。思考連鎖のトレーニングは、Deepseekが引用文の中で一見矛盾しているように見える記述を合理化するのに役立つかもしれませんが、トレーニング知識への強力な整合性により、コンテキストの根拠よりも独自の世界の事実を優先する可能性があります。善意ではありますが、この強固な整合性により、LLMが個人的な知識が一致しないトピックや、トレーニングデータセットで十分に表現されていないトピックについて話し合う際に、指導が困難になることが知られています。</p><p>Playgroundのセットアップでは、「You are an assistant for question-answering tasks using relevant text passages from the book Alice in wonderland」というシステムプロンプトを入力し、他のデフォルトを受け入れました。</p><p>「Who was at the tea party?」という質問に対する答えはこうです。「Answer: The March Hare, the Hatter, and the Dormouse were at the tea party. [Citation: position 1 and 2]」これは正しいです。
</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0ce6a0facd972fdd/6a17dfa03e03d79aaa4f2b92/e8af3ff93a72e1f02de8e73f6c2606cbc19970e5-1296x813.png" alt="" /><p>&lt;think&gt;タグを見ると、Deepseekが質問に答えるために引用の内容をしっかりと検討したことがわかります。</p><h2>アライメントの限界をテスト</h2><p>Deepseekのために知的に挑戦的なシナリオをテストとして作成しましょう。Deepseekのトレーニングデータが真実ではないと知っている陰謀論のインデックスを作成します。</p><p>Kibana開発ツールで、次のインデックスとデータを作成しましょう。</p>PUT /classic_conspiracies
{
   "mappings": {
       "properties": {
           "content": {
               "type": "text",
               "copy_to": "content_semantic"
           },
           "content_semantic": {
               "type": "semantic_text",
               "inference_id": ".multilingual-e5-small-elasticsearch"
           }
       }
   }
}




POST /classic_conspiracies/_doc/1
{
   "content": "birds aren't real, the government replaced them with drones a long time ago"
}
POST /classic_conspiracies/_doc/2
{
   "content": "tinfoil hats are necessary to prevent our brains from being read"
}
POST /classic_conspiracies/_doc/3
{
   "content": "ancient aliens influenced early human civilizations, this explains why things made out of stone are marginally similar on different continents"
}<p>
これらの陰謀論は、LLMの基礎となるでしょう。積極的にシステムプロンプトを出したにもかかわらず、Deepseekは私たちが説明した事実を受け入れません。自分の個人データの方が信頼性が高く、根拠があり、組織のニーズに合っていることがわかっている状況だったら、これは受け入れられないでしょう。</p><p>「are birds real?」というテストの質問（説明は<a href="https://knowyourmeme.com/memes/birds-arent-real">know your meme</a>）に対して、次の答えが得られます。「In the provided context, birds are not considered real, but in reality, they are real animals. [Context: position 1]」。このテストにより、DeepSeek R1は7Bパラメータレベルでも強力であることが証明されました。ただし、データセットによっては、RAGにとって最適な選択ではない可能性があります。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5e8dabf65ea200e1/6a17dfa2ec0f8982135a6541/67d5f6cdb97bfd3adb926cbd588c768f9d6730ae-1277x737.png" alt="" /><h2>今回学んだ内容</h2><p>まとめると以下のようになります。</p><ul><li><p>Ollamaなどのツールでモデルをローカルで実行することは、モデルの動作を確認するのに最適なオプションです。</p></li><li><p>DeepSeek R1は推論モデルであるため、RAGのようなユースケースには利点と欠点があります。</p></li><li><p>Playground は、AIホスティングの初期の時代にデファクトスタンダードになりつつあるOpenAIのようなREST APIを介してOllamaなどの推論ホスティングフレームワークに接続できます。</p></li></ul><p>全体として、ローカルの「エアギャップ」RAGがここまで進歩したことに感銘を受けました。Elasticsearch、Kibana、そして利用可能なオープンウェイトモデルのツールは、2023年に<a href="https://www.elastic.co/search-labs/blog/privacy-first-ai-search-langchain-elasticsearch">プライバシー重視のAI検索</a>について初めて記事を書いたときから大幅に進歩しました。</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/deepseek-rag-ollama-playground</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/deepseek-rag-ollama-playground</guid>
    <category><![CDATA[AI]]></category>
    <category><![CDATA[Kibana]]></category>
    <dc:creator><![CDATA[Dave Erickson,Jakob Reiter]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2a4b2ae6bd97850b/6a17dfa4be6086558f00464c/1bd853bfdfa2710e44cc4c08dede6bd21b35c4b8-1542x860.png" length="0" type="image/png"/>
    <pubDate>Thu, 30 Jan 2025 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Kibana を使用して地理空間データを Elasticsearch に取り込み、ES|QL で使用できるようにする]]></title>
    <description><![CDATA[Kibana と csv 取り込みプロセッサを使用して、Elasticsearch に地理空間データを取り込んで、Elasticsearch クエリ言語 (ES|QL) で検索する方法。Elasticsearch には強力な地理空間検索機能があり、これが ES|QL にも導入され、使いやすさと OGC への親しみやすさが大幅に向上しました。ただし、これらの機能を使用するには、地理空間データが必要です。]]></description>
    <content:encoded><![CDATA[<p>最近、Elasticsearch の新しい強力な<a href="https://www.elastic.co/search-labs/blog/esql-geospatial-search-part-one"> パイプ</a><a href="https://www.elastic.co/search-labs/blog/esql-piped-query-language-goes-ga"> クエリ言語</a><a href="https://www.elastic.co/search-labs/blog/esql-geospatial-search-part-one"> である ES|QL の 新しい</a><a href="https://www.elastic.co/search-labs/blog/esql-geospatial-search-part-one"> 地理空間検索 機能</a> の使用方法を説明するブログを公開しました。これらの機能を使用するには、Elasticsearch に地理空間データが必要です。そこでこのブログでは、地理空間データを取り込む方法と、それを ES|QL クエリで使用する方法を紹介します。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfc041ebca11476c6/6a16f70560084b31b93c4344/01fde3b1d714f12bf8673140c9f2f940d443de31-1440x823.jpg" alt="ESQL 地理空間検索" /><h2>Kibanaを使用した地理空間データのインポート</h2><p>前回のブログの例に使用したデータは、統合テストのために社内で使用しているデータに基づいています。便宜上、Kibana を使用して簡単にインポートできるいくつかの CSV ファイルの形式でここに含めました。データには空港、都市、都市境界が混在しています。データは以下からダウンロードできます:</p><ul><li><p><a href="https://raw.githubusercontent.com/elastic/elasticsearch-labs/refs/heads/main/supporting-blog-content/geospatial-data-ingest/airports/airports.csv">空港.csv</a></p><ul><li><p>これには 3 つのデータセットの結合が含まれます。</p><ul><li><p><a href="https://www.naturalearthdata.com/downloads/10m-cultural-vectors/airports/">Natural Earth</a>の空港（名称、場所、関連データ）</p></li><li><p><a href="https://simplemaps.com/data/world-cities">SimpleMaps</a>からの都市の位置</p></li><li><p><a href="https://www.partow.net/miscellaneous/airportdatabase/">世界の空港データベース</a>からの空港標高</p></li></ul></li></ul></li><li><p><a href="https://raw.githubusercontent.com/elastic/elasticsearch-labs/refs/heads/main/supporting-blog-content/geospatial-data-ingest/airports/airport_city_boundaries.csv">空港都市境界.csv</a></p><ul><li><p>これには、上記の空港名と都市名が 1 つの新しいソースと結合されたものが含まれています。</p><ul><li><p><a href="https://www.openstreetmap.org/">OpenStreetMap</a>の都市境界</p></li></ul></li></ul></li></ul><p>ご想像のとおり、私たちは ES|QL の地理空間機能をテストできるようにすることを目的として、これらのデータ ソースを上記の 2 つのファイルに結合するのに時間を費やしました。これは、特定のデータ ニーズとまったく同じではないかもしれませんが、これによって、何が可能かについてのアイデアが得られると思います。特に、いくつかの興味深い点について説明したいと思います。</p><ul><li><p>地理空間フィールドを含むデータを他のインデックス可能なデータと一緒にインポートする</p></li><li><p><code>geo_point</code>と<code>geo_shape</code>両方のデータをインポートし、クエリで一緒に使用します</p></li><li><p>空間関係を使用して結合できる 2 つのインデックスにデータをインポートする</p></li><li><p>将来のインポートを容易にするための取り込みパイプラインの作成（Kibana 以外）</p></li><li><p><code>csv</code> 、 <code>convert</code> 、 <code>split</code></p></li></ul><p>このブログでは CSV データの操作について説明しますが、<a href="https://www.elastic.co/guide/en/kibana/current/import-geospatial-data.html"> Kibana</a><a href="https://www.elastic.co/guide/en/kibana/current/import-geospatial-data.html"> を使用して地理データを追加する</a><a href="https://www.elastic.co/guide/en/kibana/current/import-geospatial-data.html"> </a><a href="https://www.elastic.co/guide/en/kibana/current/import-geospatial-data.html">方法はいくつかある こと</a> を理解することが重要です。マップ アプリケーション内では、CSV、GeoJSON、ESRI ShapeFiles などの区切りデータをアップロードでき、マップ内に直接図形を描画することもできます。このブログでは、Kibana ホームページから CSV ファイルをインポートすることに焦点を当てます。</p><h3>空港の輸入</h3><p>最初のファイル、 <a href="https://raw.githubusercontent.com/elastic/elasticsearch-labs/refs/heads/main/supporting-blog-content/geospatial-data-ingest/airports/airports.csv">airports.csv</a> 、対処する必要がある興味深い癖がいくつかあります。まず、列を区切る追加の空白がありますが、これは CSV ファイルでは一般的ではありません。次に、 <code>type</code>フィールドは複数値フィールドであるため、個別のフィールドに分割する必要があります。最後に、一部のフィールドは文字列ではないため、適切な型に変換する必要があります。これらはすべて、Kibana の CSV インポート機能を使用して実行できます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt393bc416bf425301/6a16f707839dfa1e86dcfca9/b1afd8c95973bec32f229a9adfaef14680b09a8e-1944x478.png" alt="Kibana アップロード - プレビュー" /><p>Kibana のホームページから始めましょう。「統合を追加して開始する」というセクションがあり、そこに「ファイルをアップロードする」というリンクがあります。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte12fc741edab20d3/6a16f709acf088600fbe98bf/996372bb3a52859cc840bd1d8f984a33a0e7ada3-1180x410.png" alt="Kibanaホーム - ファイルをアップロード" /><p>このリンクをクリックすると、「ファイルのアップロード」ページに移動します。ここで<code>airports.csv</code>ファイルをドラッグ アンド ドロップすると、Kibana がファイルを分析し、データのプレビューを表示します。区切り文字がコンマであること、最初の行がヘッダー行であることが自動的に検出されるはずです。ただし、すべてのフィールドが<code>text</code>または<code>keyword</code>であると想定すると、列間の余分な空白が削除されず、フィールドの種類も判別されなかった可能性があります。これを修正する必要があります。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf65a09ec0c7a61ad/6a16f70ad7c0227aedde626f/1d9ffa6cdbc0d67a228be1a747ec1ebda6a63099-1800x538.png" alt="Kibana アップロード - プレビュー" /><p><code>Override settings</code>をクリックし、 <code>Should trim fields</code>のチェックボックスをオンにして、 <code>Apply</code>クリックして設定を閉じます。ここで、フィールドのタイプを修正する必要があります。これは次のページでご覧いただけますので、 <code>Import</code>をクリックしてください。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltda9a5f85d8e693dc/6a16f70c60084b72f53c4348/a97aceffb1858eae26a213336913505ae9923b03-1800x526.png" alt="Kibanaアップロード - インポート" /><p>まずインデックス名を選択し、次に<code>Advanced</code>を選択してフィールド マッピングと取り込みプロセッサ ページに移動します。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt56705083cdd9eb18/6a16f70d66c4f93350f8bdbb/058b0fb09da0b8d7f9c9b0a9c83b8b485ce43925-1440x629.png" alt="Kibana アップロード - フィールドマッピング" /><p>ここでは、インデックスのフィールド マッピングと、データをインポートするための取り込みパイプラインの両方に変更を加える必要があります。まず、Kibana は<code>scalerank</code>フィールドを<code>long</code>として自動検出したと思われますが、 <code>location</code>フィールドと<code>city_location</code>フィールドを<code>keyword</code>として誤って認識しました。これらを<code>geo_point</code>に編集すると、マッピングは次のようになります。</p>{
  "properties": {
    "abbrev":        { "type": "keyword" },
    "city":          { "type": "keyword" },
    "city_location": { "type": "geo_point" },
    "country":       { "type": "keyword" },
    "elevation":     { "type": "double" },
    "location":      { "type": "geo_point" },
    "name":          { "type": "text" },
    "scalerank":     { "type": "long" },
    "type":          { "type": "keyword" }
  }
}<p>ここではある程度の柔軟性がありますが、選択したタイプによって、フィールドのインデックス作成方法や、可能なクエリの種類が影響を受けることに注意してください。たとえば、 <code>location</code> <code>keyword</code>のままにしておくと、地理空間検索クエリを実行することはできません。同様に、 <code>elevation</code> <code>text</code>のままにしておくと、数値範囲のクエリを実行することはできません。</p><p>ここで、取り込みパイプラインを修正します。Kibana が上記の<code>scalerank</code> <code>long</code>として自動検出した場合、フィールドを<code>long</code>に変換するプロセッサも追加されます。<code>elevation</code>フィールドに同様のプロセッサを追加して、今回は<code>double</code>に変換する必要があります。この変換が確実に実行されるようにパイプラインを編集します。これを保存する前に、 <code>type</code>フィールドを複数のフィールドに分割する変換をもう 1 つ実行する必要があります。次の構成で、パイプラインに<code>split</code>プロセッサを追加します。</p>{
  "split": {
    "field": "type",
    "separator": ":",
    "ignore_missing": true
  }
}<p>最終的な取り込みパイプラインは次のようになります。</p>{
  "description": "Ingest pipeline created by text structure finder",
  "processors": [
    {
      "csv": {
        "field": "message",
        "target_fields": [
          "abbrev",
          "name",
          "scalerank",
          "type",
          "location",
          "country",
          "city",
          "city_location",
          "elevation"
        ],
        "ignore_missing": false,
        "trim": true
      }
    },
    {
      "convert": {
        "field": "scalerank",
        "type": "long",
        "ignore_missing": true
      }
    },
    {
      "convert": {
        "field": "elevation",
        "type": "double",
        "ignore_missing": true
      }
    },
    {
      "split": {
        "field": "type",
        "separator": ":",
        "ignore_missing": true
      }
    },
    {
      "remove": {
        "field": "message"
      }
    }
  ]
}<p><code>location</code>フィールドと<code>city_location</code>フィールドには変換プロセッサを追加していないことに注意してください。これは、フィールド マッピングの<code>geo_point</code>タイプが、これらのフィールドのデータのWKT形式をすでに理解しているためです。<code>geo_point</code>型は、 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/geo-point.html">WKT、GeoJSON など、</a>さまざまな形式を理解できます。たとえば、CSV ファイルに<code>latitude</code>と<code>longitude</code>の 2 つの列がある場合、これらを 1 つの<code>geo_point</code>フィールドに結合するには、 <code>script</code>または<code>set</code>プロセッサを追加する必要がありました (例:<code>"set": {"field": "location", "value": "{{lat}},{{lon}}"}</code> ）。</p><p>これでファイルをインポートする準備が整いました。<code>Import</code>をクリックすると、定義したマッピングと取り込みパイプラインを使用してデータがインデックスにインポートされます。データの取り込み中にエラーが発生した場合は、Kibana によってここで報告されるので、ソース データまたは取り込みパイプラインを編集して再試行できます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blte81621425c7289c5/6a16f70f839dfaf608dcfcad/55dde2940c7aba66ce8257d15007ef797b8a5107-1440x415.png" alt="Kibanaアップロード - インポート" /><p>新しい取り込みパイプラインが作成されたことに注意してください。これは、Kibana の<code>Stack Management</code>セクションに移動し、 <code>Ingest pipelines</code>を選択すると表示されます。ここで、作成したパイプラインを確認し、必要に応じて編集できます。実際、 <code>Ingest pipelines</code>セクションは取り込みパイプラインの作成とテストに使用できます。これは、さらに複雑な取り込みを行う予定がある場合に非常に便利な機能です。</p><p>このデータをすぐに調べたい場合は後のセクションに進んでください。ただし、都市の境界もインポートしたい場合は読み続けてください。</p><h3>都市境界のインポート</h3><p><a href="https://raw.githubusercontent.com/elastic/elasticsearch-labs/refs/heads/main/supporting-blog-content/geospatial-data-ingest/airports/airport_city_boundaries.csv">airport_city_boundaries.csv</a>で利用可能な都市境界ファイルは、前の例よりもインポートが少し簡単です。これには、都市の境界を<code>POLYGON</code>として WKT で表現した<code>city_boundary</code>フィールドと、都市の位置を<code>geo_point</code>表現した<code>city_location</code>フィールドが含まれています。このデータは空港データと同様の方法でインポートできますが、いくつか違いがあります。</p><ul><li><p>自動検出されなかったため、オーバーライド設定<code>Has header row</code>を選択する必要がありました</p></li><li><p>データにはすでに余分な空白が除去されていたため、フィールドをトリミングする必要はありませんでした。</p></li><li><p>すべての型が文字列または空間型であったため、取り込みパイプラインを編集する必要はありませんでした。</p></li><li><p>ただし、フィールドマッピングを編集して、 <code>city_boundary</code>フィールドを<code>geo_shape</code>に設定し、 <code>city_location</code>フィールドを <code>geo_point</code></p></li></ul><p>最終的なフィールド マッピングは次のようになります。</p>{
  "properties": {
    "abbrev":        { "type": "keyword" },
    "airport":       { "type": "keyword" },
    "city":          { "type": "keyword" },
    "city_boundary": { "type": "geo_shape" },
    "city_location": { "type": "geo_point" },
    "region":        { "type": "text" }
  }
}<p>以前の<code>airports.csv</code>インポートと同様に、 <code>Import</code>をクリックするだけでデータがインデックスにインポートされます。データは、編集したマッピングと Kibana が定義した取り込みパイプラインを使用してインポートされます。</p><h3>開発ツールで地理空間データを探索する</h3><p>Kibana では、インデックス化されたデータを「Discover」で探索するのが一般的です。ただし、ES|QL クエリを使用して独自のアプリを作成することが目的である場合は、生の Elasticsearch API にアクセスしてみる方が興味深いかもしれません。Kibana には、クエリの記述を試すための便利なコンソールがあります。これは<code>Dev Tools</code>コンソールと呼ばれ、Kibana サイドバーにあります。このコンソールは Elasticsearch クラスターと直接通信し、クエリの実行、インデックスの作成などに使用できます。</p><p>次のことを試してください。</p>POST /_query?error_trace=true&amp;format=txt
{
  "query": """
FROM airports
| EVAL distance = ST_DISTANCE(city_location, TO_GEOPOINT("POINT(12.565 55.673)"))
| WHERE distance &lt; 1000000 AND scalerank &lt; 6 AND distance &gt; 10000
| SORT distance ASC
| KEEP distance, abbrev, name, location, country, city, elevation
| LIMIT 10
  """
}<p>これにより、次の結果が得られます。</p><p>距離</p><p>略語</p><p>名前</p><p>場所</p><p>国</p><p>市</p><p>標高</p><p>273418.05776847183</p><p>ハム</p><p>ハンブルク</p><p>ポイント (10.005647830925 53.6320011640866)</p><p>ドイツ</p><p>ノルダーシュテット</p><p>17.0</p><p>337534.653466062</p><p>テキサス</p><p>ベルリン・テーゲル国際空港</p><p>ポイント (13.2903090925074 52.5544287044101)</p><p>ドイツ</p><p>ホーエン・ノイエンドルフ</p><p>38.0</p><p>483713.15032266214</p><p>OSL</p><p>オスロ・ガーデモエン</p><p>ポイント (11.0991032762581 60.1935783171386)</p><p>ノルウェー</p><p>オスロ</p><p>208.0</p><p>522538.03148094116</p><p>BMA</p><p>ブロンマ</p><p>ポイント (17.9456175406145 59.3555902065112)</p><p>スウェーデン</p><p>ストックホルム</p><p>15.0</p><p>522538.03148094116</p><p>アーン</p><p>アーランダ</p><p>ポイント (17.9307299016916 59.6511203397372)</p><p>スウェーデン</p><p>ストックホルム</p><p>38.0</p><p>624274.8274399083</p><p>ダス</p><p>デュッセルドルフ国際空港</p><p>ポイント (6.76494446612174 51.2781820420774)</p><p>ドイツ</p><p>デュッセルドルフ</p><p>45.0</p><p>633388.6966435644</p><p>PRG</p><p>ルジン</p><p>ポイント (14.2674849854076 50.1076511703671)</p><p>チェコ</p><p>プラハ</p><p>381.0</p><p>635911.1873311149</p><p>アムス</p><p>スキポール</p><p>ポイント (4.76437693232812 52.3089323889822)</p><p>オランダ</p><p>ホーフトドルプ</p><p>-3.0</p><p>670864.137958866</p><p>フランス</p><p>フランクフルト国際空港</p><p>ポイント (8.57182286907608 50.0506770895207)</p><p>ドイツ</p><p>フランクフルト</p><p>111.0</p><p>683239.2529970079</p><p>ワウ</p><p>オケシー国際空港</p><p>ポイント (20.9727263383587 52.171026749259)</p><p>ポーランド</p><p>ピアセチュノ</p><p>111.0</p><h2>Kibana Maps で地理空間データを視覚化する</h2><p>Kibana Maps は、地理空間データを視覚化するための強力なツールです。これを使用すると、各レイヤーが異なるデータセットを表す複数のレイヤーを持つマップを作成できます。データはさまざまな方法でフィルタリング、集計、スタイル設定できます。このセクションでは、前のセクションでインポートしたデータを使用して、Kibana Maps でマップを作成する方法を説明します。</p><p>Kibana メニューで、 <code>Analytics</code> -&gt; <code>Maps</code>に移動して新しいマップ ビューを開きます。<code>Add Layer</code>をクリックして<code>Documents</code>を選択し、データ ビュー<code>airports</code>を選択して、レイヤー スタイルを編集し、 <code>elevation</code>フィールドを使用してマーカーに色を付けます。これにより、各空港の高さが簡単にわかります。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdcc4736d88c1abc9/6a16f7102b835f7353f4afca/9e63726d7c059331e6e20e474f8abee53dc2cbb4-840x388.png" alt="Kibanaマップ - 空港レイヤースタイル" /><p>マップを保存するには、「変更を保持」をクリックします。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8ec3cc535b5c21d8/6a16f71375879ec091fe15dc/32ad1dadb5d341a2b66662c58638b781122fc22c-2852x1528.png" alt="Kibanaマップ - 空港" /><p>次に、 <code>airport_city_boundaries</code>データ ビューを選択して、2 番目のレイヤーを追加します。今回は、 <code>city_boundary</code>フィールドを使用してレイヤーのスタイルを設定し、塗りつぶしの色を薄い青に設定します。これにより、地図上に都市の境界が表示されます。空港マーカーが最上部になるようにレイヤーの順序を変更してください。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2932d7ff4a7206c9/6a16f7156f7f0409f09145c7/53dd65026f9a98c13f2cc4f9328a79242f0b70de-2854x1510.png" alt="Kibanaマップ - 都市境界レイヤースタイル" /><h2>空間結合</h2><p>ES|QL は<code>JOIN</code>コマンドをサポートしていませんが、 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql-commands.html#esql-enrich"><code>ENRICH</code></a><a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/esql-commands.html#esql-enrich">コマンド</a>を使用して特殊な結合を実現できます。このコマンドは SQL の「左結合」に似た動作をし、2 つのデータセット間の空間関係に基づいて、1 つのインデックスの結果を別のインデックスのデータで強化することができます。</p><p>たとえば、空港の場所を含む都市の境界を見つけることで、空港のテーブルからの結果に、空港がサービスを提供する都市に関する追加情報を付加し、結果に対していくつかの統計を実行してみましょう。</p>FROM airports
| ENRICH city_boundaries ON city_location WITH airport, region, city_boundary
| STATS
    centroid = ST_CENTROID_AGG(location),
    count = COUNT(city_location)
    BY region
| SORT count DESC
| LIMIT 10<p>最初にエンリッチインデックスを準備せずにこのクエリを実行すると、次のようなエラー メッセージが表示されます。</p>cannot find enrich policy [city_boundaries]<p>これは、前述したように、ES|QL が真の<code>JOIN</code>コマンドをサポートしていないためです。その重要な理由の 1 つは、Elasticsearch が分散システムであり、結合はスケーリングが難しい高コストの操作であることです。ただし、 <code>ENRICH</code>コマンドは、クラスター全体に複製された特別に準備されたエンリッチ インデックスを利用し、各ノードでローカル結合を実行できるため、非常に効率的です。</p><p>これをよりよく理解するために、上記のクエリの<code>ENRICH</code>コマンドに注目してみましょう。</p>FROM airports
| ENRICH city_boundaries ON city_location WITH airport, region, city_boundary<p>このコマンドは、Elasticsearch に、 <code>airports</code>インデックスから取得された結果を強化し、元のインデックスの<code>city_location</code>フィールドと、前のいくつかの例で使用した<code>airport_city_boundaries</code>インデックスの<code>city_boundary</code>フィールドの間で<code>intersects</code>結合を実行するように指示します。しかし、この情報の一部はこのクエリでは明確に表示されません。表示されるのはエンリッチポリシーの名前<code>city_boundaries</code>であり、不足している情報はそのポリシー定義内にカプセル化されています。</p>{
  "geo_match": {
    "indices": "airport_city_boundaries",
    "match_field": "city_boundary",
    "enrich_fields": ["city", "airport", "region", "city_boundary"]
  }
}<p>ここでは、 <code>geo_match</code>クエリ ( <code>intersects</code>がデフォルト) が実行され、照合するフィールドが<code>city_boundary</code>であり、 <code>enrich_fields</code>が元のドキュメントに追加するフィールドであることがわかります。これらのフィールドの 1 つである<code>region</code>は、実際には<code>STATS</code>コマンドのグループ化キーとして使用されていましたが、これはこの「左結合」機能がなければ実行できませんでした。エンリッチ ポリシーの詳細については、<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/enrich-setup.html">エンリッチのドキュメント</a>を参照してください。</p><p>Elasticsearch のエンリッチ インデックスとポリシーは、もともと、別の準備されたエンリッチ インデックスのデータを使用して、インデックス作成時にデータをエンリッチするために設計されました。ただし、ES|QL では、 <code>ENRICH</code>コマンドはクエリ時に機能し、取り込みパイプラインを使用する必要はありません。これは実質的に SQL <code>LEFT JOIN</code>と非常に似ていますが、2 つのインデックスを結合することはできず、左側の通常のインデックスと、右側の特別に準備されたエンリッチ インデックスのみを結合できます。</p><p>どちらの場合でも、取り込みパイプライン用でも ES|QL で使用する場合でも、エンリッチ インデックスとポリシーを設定するためにいくつかの準備手順を実行する必要があります。上記ですでに<code>airport_city_boundaries</code>インデックスをインポートしましたが、これを<code>ENRICH</code>コマンドのエンリッチ インデックスとして直接使用することはできません。まず、次の 2 つの手順を実行する必要があります。</p><ul><li><p>上記のエンリッチ ポリシーを作成して、ソース インデックス、照合するソース インデックス内のフィールド、一致した場合に返されるフィールドを定義します。</p></li><li><p>このポリシーを実行して、エンリッチ インデックスを作成します。これにより、元のソース インデックスをより効率的なデータ構造に読み取り、クラスター全体にコピーすることで、特別な内部インデックスが構築されます。</p></li></ul><p>エンリッチ ポリシーは、次のコマンドを使用して作成できます。</p>PUT /_enrich/policy/city_boundaries
{
  "match": {
    "indices": "airport_city_boundaries",
    "match_field": "city_boundary",
    "enrich_fields": ["city", "airport", "region", "city_boundary"]
  }
}<p>そして、次のコマンドを使用してポリシーを実行できます。</p>POST /_enrich/policy/city_boundaries/_execute<p><code>airport_city_boundaries</code>インデックスの内容を変更した場合は、エンリッチ インデックスに反映された変更を確認するためにこのポリシーを再実行する必要があることに注意してください。ここで、元の ES|QL クエリをもう一度実行してみましょう。</p>FROM airports
| ENRICH city_boundaries ON city_location WITH airport, region, city_boundary
| STATS
    centroid = ST_CENTROID_AGG(location),
    count = COUNT(city_location)
    BY region
| SORT count DESC
| LIMIT 10<p>これは、空港が最も多い上位 5 つの地域と、一致する地域を持つすべての空港の重心、およびそれらの地域内の都市境界の WKT 表現の長さの範囲を返します。</p><p>重心</p><p>カウント</p><p>地域</p><p>ポイント (-12.13908685930073331.024386116624648)</p><p>126</p><p>ヌル</p><p>ポイント (-83.1039831787347842.300230911932886)</p><p>3</p><p>デトロイト</p><p>ポイント (39.74537850357592 47.21613017376512)</p><p>3</p><p>городской округ Батайск</p><p>ポイント (-156.8098678719252320.476673701778054)</p><p>3</p><p>ハワイ</p><p>ポイント (-73.9451533276587740.70366442203522）</p><p>3</p><p>ニューヨーク市</p><p>ポイント (-83.1039831787347842.300230911932886)</p><p>3</p><p>デトロイト</p><p>ポイント (-76.6687301918864324.306286952923983)</p><p>2</p><p>ニュープロビデンス</p><p>ポイント (-3.0252167768776417 51.39245774131268)</p><p>2</p><p>カーディフ</p><p>ポイント (-115.4099348466843432.73126147687435）</p><p>2</p><p>メヒカリ市</p><p>ポイント (41.790108773857355 50.302146775648)</p><p>2</p><p>Центральный район</p><p>ポイント (-73.8890273217111845.57078813901171)</p><p>2</p><p>モントリオール</p><p>また、最も頻繁に見つかった地域は<code>null</code>であったことにも気付くでしょう。これは何を意味するのでしょうか?このコマンドを SQL の「左結合」に例えたことを思い出してください。つまり、空港に一致する都市境界が見つからない場合でも、その空港は返されますが、 <code>airport_city_boundaries</code>インデックスのフィールドには<code>null</code>値が含まれます。一致する<code>city_boundary</code>が見つからなかった空港が 125 か所あり、 <code>region</code>フィールドが<code>null</code>である一致する空港が 1 か所あることがわかりました。これにより、結果に<code>region</code>が含まれない空港が 126 件見つかりました。ユースケースですべての空港を都市の境界に一致させる必要がある場合は、ギャップを埋めるために追加のデータを入手する必要があります。次の 2 つの点を決定する必要があります。</p><ul><li><p><code>airport_city_boundaries</code>インデックス内のどのレコードに<code>city_boundary</code>フィールドがありませんか</p></li><li><p><code>airports</code>インデックス内のどのレコードが<code>ENRICH</code>コマンドを使用しても一致しないか (つまり、交差しない）</p></li></ul><h2>Kibana Maps の地理空間データに ES|QL を使用する</h2><p>Kibana は、マップ アプリケーションに Spatial ES|QL のサポートを追加しました。つまり、ES|QL を使用して Elasticsearch で地理空間データを検索し、その結果をマップ上に視覚化できるようになりました。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt91922eb4ef43d290/6a16f7161949f737bfe7a7b5/bd78470bd8a4bc60f0db7006bd804b8fe87e2fea-1440x683.png" alt="Kibana レイヤー ES|QL" /><p>レイヤー追加メニューに、「ES|QL」という新しいレイヤー オプションがあります。これまで説明したすべての地理空間機能と同様に、これは「技術プレビュー」段階です。このオプションを選択すると、ES|QL クエリの結果に基づいてマップにレイヤーを追加できます。たとえば、世界中のすべての空港を表示するレイヤーをマップに追加できます。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt5185ef7461d7e81d/6a16f718839dfa1559dcfcb1/1dd28d3d0509f92d26b0bb5320a2925f7a54c5d9-1440x736.png" alt="キバナ ES|QL - 空港" /><p>または、 <code>airport_city_boundaries</code>インデックスからポリゴンを表示するレイヤーを追加することもできます。さらに良い方法として、各地域に空港がいくつあるかという統計を生成する、上記の複雑な<code>ENRICH</code>クエリはどうでしょうか。</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt51ee3543bb811d98/6a16f71a8b73cbbe63189df1/679a0a401faa613c7cedddd07c64f614ac2b7144-1440x727.png" alt="Kibana ES|QL - 地域統計" /><h2>新しいエクスペリエンス</h2><p>前回の<a href="https://www.elastic.co/search-labs/blog/esql-geospatial-search-part-one">地理空間検索</a>ブログでは、Elasticsearch 8.14 以降で利用可能な<code>ST_INTERSECTS</code>などの関数を使用して検索を実行することに焦点を当てました。このブログでは、これらの検索に使用したデータをインポートする方法を説明します。ただし、Elasticsearch 8.15 には特に興味深い関数<code>ST_DISTANCE</code>が搭載されており、これを使用して効率的な空間距離検索を実行できます。これが次のブログのトピックになります。</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/geospatial-data-ingest-for-esql</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/geospatial-data-ingest-for-esql</guid>
    <category><![CDATA[Kibana]]></category>
    <category><![CDATA[ES|QL]]></category>
    <dc:creator><![CDATA[Craig Taverner]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfc041ebca11476c6/6a16f70560084b31b93c4344/01fde3b1d714f12bf8673140c9f2f940d443de31-1440x823.jpg" length="0" type="image/jpeg"/>
    <pubDate>Fri, 25 Oct 2024 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>