TECH PLAY

サむオステクノロゞヌ((DXSL))

サむオステクノロゞヌ((DXSL)) の技術ブログ

å…š77ä»¶

Elasticsearch は、ログやメトリクスの怜玢・分析に広く䜿われおいる分散型怜玢゚ンゞンです。これたでの怜玢には Lucene ベヌスの DSL が広く䜿われおきたしたが、2023幎に登堎した新しいク゚リ蚀語「ES|QLElasticsearch Query Language」によっお、より柔軟で匷力な分析が可胜になりたした。 目次 抂説 ES|QL ずは ES|QL の䞻な特城 ナヌスケヌス ES|QL を䜿うには サンプル実行 1. 準備環境 2. サンプルデヌタの準備 3. 基本のク゚リ 4. 条件で絞り蟌む 5. 集蚈しおみる 6. 時系列での分析 7. ダッシュボヌドぞのグラフの远加 7.1. Discover からダッシュボヌドぞ远加する方法 7.2. ダッシュボヌドから盎接远加する方法 8. Dev Tools からの実行 たずめ 抂説 ES|QL ずは ES|QL は、Elasticsearch に特化した新しいク゚リ蚀語で、パむプ構文を䜿っお耇数の凊理を盎感的に蚘述できるのが特城です。UNIX のパむプ|のように、ク゚リの各ステップを぀なげおデヌタを倉換・敎圢・集蚈しおいくスタむルは、ログ分析やセキュリティ監芖においお非垞に有効です。 䟋 FROM kibana_sample_data_logs | STATS count = COUNT() by clientip | SORT count DESC | LIMIT 10 このように、clientip ごずのアクセス数を集蚈し、降順に䞊べる凊理をシンプルに蚘述できたす。 ※ES|QLの文法の詳现に぀いおは、 公匏ドキュメント を参照しおください。 ES|QL の䞻な特城 パむプ構文耇数の凊理を盎列に぀なげお蚘述できる 高速実行Elasticsearch の分散凊理ず統合されおおり、倧量デヌタでも高速 盎感的な構文SQL に䌌た構文で孊習コストが䜎い 䞀貫した操䜜フィルタ・集蚈・倉換が䞀貫しお可胜WHERE、STATS、KEEP など ナヌスケヌス ES|QL は特に以䞋のようなナヌスケヌスで嚁力を発揮したす セキュリティログの異垞怜知 アプリケヌションログの゚ラヌパタヌン分析 メトリクスの時系列集蚈ず可芖化 Kibana でのダッシュボヌド䜜成やアラヌト蚭定 ES|QL を䜿うには ES|QL は、Elasticsearch 8.11 以降で正匏に利甚可胜です。Kibana の Discover や Dev Tools から盎接ク゚リを実行できるほか、API 経由でも利甚できたす。 POST /_query { "query": "FROM kibana_sample_data_logs | STATS count = COUNT() by clientip | SORT count DESC | LIMIT 10" } サンプル実行 ここからは、実際に ES|QL を詊しおみたしょう。 1. 準備環境 Elasticsearch 8.11 以降 (筆者は、Elasticsearch 9.1.4 で怜蚌) ES|QLを利甚可胜な堎所 Kibana の Discover Kibana の Dev Tools Kibana の Dashboard API 経由 ※Elastic Security の detection rule でも利甚可胜ですが、本蚘事では割愛したす。詳しく知りたい方は 公匏ドキュメント を参照しおください。 2. サンプルデヌタの準備 Kibana には、3皮類のサンプルデヌタが甚意されおいたす。今回は、そのうちの kibana_sample_data_logs を利甚したす。 手順 2.1. Kibana にログむンし、Home 画面を衚瀺したす。 2.2. Home 画面から Try sample data をクリックしたす。 2.3. Sample data タブの > Other sample data sets を展開したす。 2.4. Sample web logs の [Add data] をクリックしたす。 2.5. しばらく埅ちたす。 2.6. [View data] ず衚瀺されれば、サンプルデヌタの取り蟌み完了です。 3. 基本のク゚リ たずは kibana_sample_data_logs むンデックスからデヌタを取埗しおみたしょう。 3.1. Analytics / Discover 画面に遷移したす。 3.2. 画面䞊郚の [Try ES|QL] をクリックしたす。 ES|QL を入力する画面に切り替わりたす。 3.3. ク゚リヌの入力欄に次の ES|QL ク゚リヌを入力し、 [▶ Run] を抌したす。 FROM kibana_sample_data_logs | LIMIT 5 3.4. 最初の5件がリストに衚瀺されたす。 衚瀺されない堎合は、察象ずなる期間を調節しおみおください。(Last 1 year など) 4. 条件で絞り蟌む response が “200” でないドキュメントだけを抜出するには WHERE を䜿いたす。 FROM kibana_sample_data_logs | WHERE response != "200" | KEEP @timestamp, response, clientip, url | LIMIT 10 KEEP を䜿うず必芁なフィヌルドだけを残せるため、ログの可読性が向䞊したす。 5. 集蚈しおみる clientip ごずのアクセス数を集蚈しおみたしょう。 FROM kibana_sample_data_logs | STATS count = count() BY clientip | SORT count DESC | LIMIT 10 アクセス数の倚い clientip を簡単に特定できたす。 6. 時系列での分析 時間ごずのアクセス数を確認するには DATE_TRUNC(), STATS, BY を組み合わせたす。 FROM kibana_sample_data_logs | EVAL hour = DATE_TRUNC(1h, timestamp) | STATS count = count() BY hour | SORT hour ASC これで「1時間ごずのアクセス数」をグラフ化でき、ピヌク時間垯を把握できたす。 7. ダッシュボヌドぞのグラフの远加 ES|QL の結果をグラフずしおダッシュボヌドぞ远加するには、2぀の方法がありたす。 7.1. Discover からダッシュボヌドぞ远加する方法 7.1.1. Discover 画面のグラフの右䞊のフロッピヌディスクアむコンをクリックしたす。 7.1.2. Save Lens visualization ダむアログが開くので、Title, 远加先のダッシュボヌド名などを入力しお、[Save and go to Dashboard] をクリックしたす。 ※泚 将来的には倉わるかもしれたせんがv9.1.4 の時点では、library に远加するこずはできたせん。 7.1.3. ダッシュボヌドぞグラフが远加されたす。 7.2. ダッシュボヌドから盎接远加する方法 7.2.1. ダッシュボヌドを新芏䜜成したす。あるいは、既存のダッシュボヌドを開きたす。 7.2.2. [ (+) Add panel ] をクリックしたす。 7.2.3. Visualizations から ES|QL をクリックしたす。 7.2.4. ク゚リヌの入力欄が衚瀺されるので、そこに実行したい ES|QL のク゚リヌを入力し、[ ▷ Run query ] をクリックしたす。 7.2.5. 巊偎にグラフが衚瀺されるので、それで問題なければ [Apply and close] をクリックしたす。 7.2.6. ダッシュボヌドぞグラフが远加されたす。 8. Dev Tools からの実行 Dev Tools の Console から ES|QL で問い合わせを行うには、 POST /query { "query": "..." } ずいう圢匏を利甚したす。 Dev Tools の Console を開いお、䞋蚘を実行しおみおください。 POST /_query { "query": """ FROM kibana_sample_data_logs | WHERE @timestamp >= NOW() - 10d | STATS count = COUNT() by clientip | SORT count DESC | LIMIT 10 """ } レスポンス { "took": 11, "is_partial": false, "documents_found": 14024, "values_loaded": 0, "columns": [ { "name": "count", "type": "long" }, { "name": "clientip", "type": "ip" } ], "values": [ [ 100, "30.156.16.164" ], [ 29, "164.85.94.243" ], [ 26, "50.184.59.162" ], [ 26, "236.212.255.77" ], [ 25, "16.241.165.21" ], [ 25, "246.106.125.113" ], [ 24, "111.237.144.54" ], [ 24, "81.194.200.150" ], [ 23, "56.28.213.27" ], [ 23, "26.131.108.13" ] ] } POST /query の構文に぀いおは、 公匏ドキュメント を参照しおください。 たずめ ES|QL の特城は以䞋の通りです。 パむプ構文で盎感的に曞ける フィルタ・集蚈・倉換を䞀貫しお実行できる ログ分析やセキュリティ監芖に最適 たずはシンプルなク゚リから詊し、埐々に耇雑な分析ぞず広げおいくのがおすすめです。Kibana の可芖化機胜ず組み合わせれば、リアルタむムに「気づき」を埗られる匷力な歊噚になりたす。 The post Elasticsearch ES|QL 入門ログ分析をもっずスマヌトに first appeared on Elastic Portal .
「AIアシスタントに任せよう」、そんな蚀葉が日垞的に䜿われる時代がやっおきたした。 䟋えば、PerplexityずPayPalが提携し、AIが「探す→比べる→支払う」たでを぀なぐ゚ヌゞェント型コマヌスを実装するずされ、個人の買い物䜓隓がチャット完結に近づいおいたす。たた、2024幎には䌁業のAI導入率が70%を超え、AIは単なる䟿利ツヌルから共に考え働くパヌトナヌ、同僚ずいう䜍眮にぞず倉化しおいたす。 その背景には「LLM」「RAG」「Agentic」「MCP」「A2A」ずいった進化の階段がありたす。本蚘事では、それぞれがどのように繋がり、未来を圢䜜っおいるのかを敎理したす。 埌半に、Elasticが、AI時代の波にどのように察応し、進化しおきたのかに぀いお軜く芋おいきたす。 目次 発射台「LLM倧芏暡蚀語モデル」 意味を扱う「ベクトルセマンティック怜玢」 倖郚知識を統合する「RAG」 自埋的に動く「゚ヌゞェント」 連携を統䞀する「MCP」 MCPを䜿う意味 AI同士が協力する「A2Aプロトコル」 なぜA2Aが重芁 Elastic ず AI たずめ 発射台「LLM倧芏暡蚀語モデル」 LLMは、䞎えられた文脈から統蚈的に「次に来そうな単語」を遞ぶこずで文章を生成したす。぀たり、「理解しおいる」のではなく、膚倧な孊習デヌタの䞭から最も自然な応答を遞び出しおいる仕組みなのです。 GPT‑4o、Claude 3.5 Sonnet、Gemini 1.5 Proなど最新のモデルは、テキストに加えお画像や音声にも察応するマルチモヌダル機胜を備えおいたす。この進化により、人ず自然に察話でき、耇雑な状況や文脈も鋭く捉えるようになりたした。 ただし、LLMには限界がありたす。単䜓では垞に最新情報を持぀わけではなく、ハルシネヌション誀情報を出すこずもありたす。それでも、「すぐに答えが欲しい」「シンプルなチャットやQ&Aで十分」「リアルタむム性やコストを最優先にしたい」ずいった堎面には、非垞に頌りになる存圚です。 意味を扱う「ベクトルセマンティック怜玢」 LLMの力を支えるのは、「ベクトル化」によっお埗られる怜玢粟床です。文章や画像、音声などを倚次元の数倀ベクトルに倉換し、それらの意味的な「近さ」で関連性を刀断できるようにしたす。たずえば「AIの最新動向」ずいう怜玢語でも、単語の䞀臎に瞛られず、意味的に近い論文や蚘事を高い粟床で抜出できる、これが「セマンティック怜玢」の肝です。぀たり、キヌワヌドが違っおも“意味が近ければ芋぀かる”ずいう䟡倀があり、䌁業のグロヌバル知識探玢や倚蚀語察応の内郚デヌタ怜玢で特に嚁力を発揮したす。 しかし、KNNによるベクトル怜玢自䜓はそこたで新しい話でもありたせん。では、なぜこれが゚ヌゞェントの進化に重芁な貢献をしたのでしょうか。 セマンティック怜玢の抂念は90幎代埌半に遡りたすが、実甚化ぞの道のりは長いものでした。2012幎のGoogleによるナレッゞグラフの導入で泚目を集め、2013幎にはWord2Vecがニュヌラルネットワヌクを甚いた初の単語埋め蟌み技術ずしお登堎したした。この頃からビッグデヌタの掻甚が本栌化し、倧量のデヌタで蚀語モデルを蚓緎できるようになったのです。そしお珟代的なセマンティック怜玢は、BERTやTransformerの登堎により2018幎頃から実甚レベルに到達したした。぀たり、アルゎリズム的基盀KNNは数十幎前から存圚しおいたものの、意味理解に必芁な高品質な埋め蟌み技術ずコンピュヌティング胜力が揃ったのは比范的最近のこずなのです。 倖郚知識を統合する「RAG」 LLMの匱点を補完するのが「RAG」です。RAGRetrieval‑Augmented Generationでは、モデルに答えを生成させる前に、倖郚デヌタベヌスから関連情報を怜玢Retrievalし、その内容を螏たえお応答Generationを構築したす。これにより、回答に根拠が加わり、誀情報ハルシネヌションのリスクを枛らすこずができたす。 さらに進化した「マルチモヌダルRAG」では、文章だけでなく画像や音声、動画なども察象に含めお怜玢・生成ができたす。たずえば画像をCLIPでベクトル化し、テキストや映像ず䞀緒に最適な情報を取り出すこずが可胜です。 こうしたRAGは、専門知識が必芁で、垞に最新情報を参照したい堎合や、回答の品質ず信頌性が特に重芁な堎面で真䟡を発揮したす。぀たり、単なるチャットではなく、内容の正確さず根拠を重芖する「珟堎の頌れるAIアシスタント」ずしお掻躍したす。 自埋的に動く「゚ヌゞェント」 RAGが「正確に答える力」を䞎える䞀方、゚ヌゞェントには「自ら行動する力」が䞎えられたす。぀たり、ナヌザヌの意図を読み取り、最適なツヌルを遞び出し、耇数の手順を組み合わせおタスクを自埋的に実行する存圚です。さらに高床な圢ずしお、Agentic RAGでは「怜玢→生成」ずいう静的な流れにずどたらず、AI自身が動的に怜玢戊略を立お、文脈を芋ながら知識を取埗・掻甚しお応答を進化させたす。 䟋えば、 GitHub Copilot の「Agent mode」VS Codeは、自然蚀語の指瀺からコヌド理解・テスト・修正のルヌプを支揎する“自埋的な盞棒”ずしお進化しおいる。 さらに Copilot agent mode では、VS Code䞊でコヌドベヌスの読み取り、テストの自動実行、゚ラヌ修正をルヌプで進行し、自埋的なピア・プログラマヌずしお動䜜したす。 珟状では、ツヌルや仕組みの呌び方が乱立しおおり、統䞀された定矩がありたせん。 ここから瀺すのは、 あくたでも私自身の理解に基づいた敎理 です。 AI Agent LLMをコアに、利甚可胜なツヌルを呌び出しお凊理を自動で進める自埋的システム。比范的「静的」で、あらかじめ蚭定された動䜜に埓う存圚。 Agentic AI 耇数の゚ヌゞェントがチヌムのように協力し、異なるLLMや倖郚リ゜ヌスず぀ないで耇雑な目暙を達成する仕組み。 連携を統䞀する「MCP」 ここたで、「LLM × 怜玢」で知識を補匷し、「゚ヌゞェント × ツヌル」でタスクを自埋的に遂行する進化を芋おきたした。しかし、珟堎では“どのツヌルに、どう぀なぐのか”が統䞀されおいないずいう課題がありたす。そこで登堎したのが、MCPModel Context Protocolです。 MCPは、゚ヌゞェントがツヌルやデヌタ゜ヌスに接続するための暙準的な「接続口」を提䟛する、Microsoft Build 2025でも、MCPが「゚ヌゞェント時代のHTTPのようなプロトコル」ずしお玹介されたした。ツヌルやサヌビスごずに専甚むンテグレヌションを曞かなくおも、共通仕様で぀なげるようにしたす。 MCPを䜿う意味 開発・保守の効率化 䜿甚するLLMやツヌルの数が増えるに぀れお発生する、倧量のカスタム接続を蚘述する必芁がなくなるため、N×M問題が解消されたす。結果ずしお、開発コストを倧幅に削枛できたす。 再利甚可胜な゚コシステム 䞀床぀なげたツヌルは、他の゚ヌゞェントやプロゞェクトでもそのたた䜿えたす。曎新の波及もスムヌズです。 サヌドパヌティずの接続も容易 OAuthや認蚌仕組みを備えた安党で柔軟な接続蚭蚈がしやすくなり、導入障壁が䞋がりたす AI同士が協力する「A2Aプロトコル」 今や、゚ヌゞェントがツヌルに接続する方法が「MCP」で暙準化された䞀方で、゚ヌゞェント同士の“察話”や“協調”には別の基盀が必芁です。そこで泚目されるのが、 A2AAgent‑to‑Agentプロトコル 。これは、゚ヌゞェント間の「共通蚀語」ずなる通信ルヌルを定めた仕組みです。 A2Aの䞻な機胜は以䞋の通りです Discovery発芋 各゚ヌゞェントが自分の圹割やスキルを“Agent Card”ずしお公開し、他の゚ヌゞェントから芋぀けられるようになりたす。 Negotation亀枉 どの通信圢匏テキスト、フォヌム、音声などや認蚌方匏を䜿うかを、お互いにすり合わせられたす。 TaskState Managementタスク状態管理 タスクの進捗や状態送信枈み・実行䞭・完了などをJSON‑RPCやSSEを甚いおリアルタむムに共有できたす。 Collaboration協力 必芁に応じお他の゚ヌゞェントに凊理を䟝頌し、結果を取埗するこずで、連携した凊理が可胜になりたす。 たずえば、旅行手配゚ヌゞェントが、スケゞュヌル確認を担圓する゚ヌゞェントを芋぀けおやり取りし、空き時間を確認した䞊で予玄を自動的に確定するような流れが、人の介圚なしに完結できるようになりたす。 なぜA2Aが重芁 暙準化された協調蚭蚈 各瀟・各フレヌムワヌクで別々に組たれる゚ヌゞェント連携を、統䞀された仕様で実珟できたす。 マルチ゚ヌゞェントの未来が芋通せる AccentureなどはすでにA2Aをベヌスに、耇数の゚ヌゞェントが協働する仕組みを導入し始めおいたす。 このように、MCPが「ツヌルぞの接続口を揃える」圹割ずすれば、A2Aは「゚ヌゞェント同士の䌚話や協調を可胜にする土台」。それぞれの匷みを掻かすこずで、「ツヌルを䜿う゚ヌゞェント」から「互いに話し合いながらタスクを完遂できる゚ヌゞェント」ぞず進化する蚭蚈が実珟できたす。 Elastic ず AI 2022幎 Elasticsearch 8.0がリリヌスされ、近䌌最近傍怜玢機胜ず最新自然蚀語凊理モデルのネむティブサポヌトを搭茉。2022幎を通しお、ベクトル怜玢はテクニカルプレビュヌの段階でした。 Elasticsearch 8.4で kNN怜玢を _search API に統合するなど実運甚に向けた倧きな前進になり、フィルタリング、再ランキング、レキシカル怜玢ずセマンティック怜玢を組み合わせたハむブリッド怜玢が可胜になりたした。 2023幎 Elasticが孊習枈みスパヌスモデルELSERを公開。远加孊習なしで”意図”に基づくセマンティック怜玢を実珟し、同幎の8.9ではRRFReciprocal Rank Fusionによるハむブリッド怜玢を導入しおBM25ベクトルセマンティックを安定統合。 2024幎 Open/Inference APIを拡充し、OpenAI・Azure・Anthropic・Mistral・Hugging Faceなど倖郚掚論埋め蟌み・リランクを公匏に統合。RAG実装の柔軟性が倧きく向䞊。 Elastic AI Ecosystemを発衚。Elasticsearchベクタヌデヌタベヌスず䞻芁AI䌁業の事前統合モデル、クラりド、MLOps、デヌタ準備などにより、RAGアプリ開発の立ち䞊げず運甚投入を加速。Google CloudMicrosoftHugging FaceLangChainなどず連携。 2025幎 瀟内向けゞェネレヌティブAIアシスタントElasticGPTを公開。Elasticsearchを䞭栞にしたRAGず芳枬基盀の組み合わせで、安党で文脈を螏たえた知識探玢を埓業員に提䟛。プラットフォヌム䞀䜓運甚の実䟋に。 セキュリティ領域での゚ヌゞェント掻甚を匷化。Elastic AI Assistant for Securityによる自然蚀語ク゚リ生成や調査支揎、Attack Discoveryによる倧量アラヌトの芁玄・優先床付けなど、Search AI × RAG × ゚ヌゞェントの実運甚を具䜓化。 珟圚のポゞション: Elasticsearchは2022幎8月のバヌゞョン8.4で本栌的なベクトルデヌタベヌスずしお名乗りを䞊げたした。セマンティック怜玢が䞻流になっおから3-4幎遅れでの参入でしたが、既存の倧芏暡ナヌザヌベヌスず、埓来のBM25怜玢ずベクトル怜玢を組み合わせたハむブリッド怜玢機胜を歊噚に、この分野で確固たる地䜍を築きたした。珟圚、Elasticは「Search AI Platform」ずしお、ベクタヌDBハむブリッド怜玢RRFリランクInference APIを統合し、「芋぀かる・根拠づける・守る」を土台に、RAGや゚ヌゞェント実装を本番氎準で支える䜍眮づけを確立しおいたす。 たずめ AIアシスタントの進化は、 LLM 蚀語を扱う力 セマンティック怜玢 意味を捉える力 RAG 倖郚知識を統合する力 ゚ヌゞェント 自埋的に行動する力 MCPずA2A 連携ず協力の力 これらの芁玠が順に積み重なるこずで、AIは「人に呜什される存圚」から「人ず䞀緒に考え、動く存圚」ぞず進化したした。この倉化のスピヌドは早すぎお、今埌どんな技術が珟れ、私たちの仕事や生掻がどう倉わるかは、ただ芋通しが立ちたせん。 The post 2025幎のAIアシスタントLLMからAI゚ヌゞェントAgentic AIぞ first appeared on Elastic Portal .
キャプションやタグがなくおも、テキストで近い画像を怜玢できる。そんな仕組みを、ElasticsearchずAIを組み合わせ詊䜜したした。画像資産の敎理や業務効率化に圹立ちたす。 Elasticsearch を遞んだ理由はシンプルです。 ベクトル怜玢に匷い 画像やテキストを CLIP で 512 次元ベクトルに倉換し、それをそのたた保存しお KNN 怜玢できる。 スケヌルに匷い 最初は手元の16枚の画像でも、将来的に䜕千・䜕䞇枚に増えおも同じ仕組みで動かせる。 怜玢をカスタマむズできる 近䌌怜玢速さず再ランク粟床を組み合わせたり、メタデヌタで絞り蟌みしたりが簡単。 ※動䜜環境 Elasticsearch: 8.19.0 Python: 3.11 実装コヌドずデヌタセット⇚ 2025-08-image-search ダりンロヌド 目次 やりたかったこず モデル遞びでの倱敗ず気づき 日本語翻蚳の工倫 動かしおみる むンデックス䜜成 デヌタセットの写真 コヌドの準備 1. 基本蚭定ず䟝存ラむブラリ 2. CLIPのロヌド 3. 日本語→英語の翻蚳 4. ESのむンデックス蚭蚈 5. 既存の画像をチェック 6. 画像をむンデックス 7. 画像怜玢 なぜ“正芏化”が必須 コマンドラむンから実行 怜玢䟋ず結果 日本語ク゚リ「池ず山」 日本語ク゚リ「猫ずメガネ」 英語ク゚リ「man and sea」 日本語ク゚リ「動物園」 たずめ やりたかったこず 画像怜玢 テキストを入力するず、それに近い画像を探せる 日本語サポヌト 日本語で怜玢しおも正しく動く シンプル構成 䜙蚈な仕組みは極力排陀しお、わかりやすくする モデル遞びでの倱敗ず気づき 詊したモデル 最初に詊したのは 倚蚀語察応のCLIPモデル ( clip-ViT-B-32-multilingual-v1 ) でした。 CLIP は「画像」ず「テキスト」を同じベクトル空間に倉換するモデルで、これにより「テキストで画像を探す」「画像に合う説明文を探す」が自然にできたす。 ざっくり仕組みを説明するず 画像゚ンコヌダ画像を入力しお、512次元ほどの数列埋め蟌みに倉換 テキスト゚ンコヌダ文章も同じ次元の埋め蟌みに倉換 同じ空間で距離を枬る䞡者が近いほど「意味が䌌おいる」ずみなす 問題点 たずえば「ヒマワリ」ず「時蚈」を怜玢しおも、ほが同じ結果が返っおきおしたい、 埋め蟌みの類䌌床も 0.95〜0.99 ず高すぎお区別が぀きたせん。 改善 ず課題 粟床が䜎すぎたため、別のモデルを詊すこずにしたした。そこで改めお OpenAIオリゞナルのCLIP ( clip-vit-base-patch32) を詊しおみたずころ、こちらであれば玍埗できる結果が埗られそうでした。 物䜓やシヌンを正しく区別しおくれる 安定しお動䜜する 日本語は7割皋床は理解できない 課題  日本語翻蚳の工倫 次の課題は 日本語ク゚リをどう扱うか でした。 CLIPだけで日本語怜玢を行うず、正しい結果が返る堎合もあれば、倖れおしたう堎合もありたした。これではプロダクション環境で䜿うには䞍安定です。 そこで、いく぀か方法を詊したした。 倚蚀語CLIPをそのたた䜿う → うたくいかない 手䜜りの和英蟞曞を远加 → 手間がかかりすぎる Elasticsearchに翻蚳パむプラむンを組み蟌む → 䜜り蟌みすぎお保守が倧倉 最終解決策 LLMを䜿っお日本語ク゚リを翻蚳させる 結果的に、この最埌の方法が最もシンプルで、しかも粟床が良かった。さらに、 gpt-3.5-turbo の 利甚コストは非垞に䜎く 、実運甚でも十分珟実的です。 動かしおみる むンデックス䜜成 画像を data/images/ に入れお次を実行 python smart_clip_search.py index CLIP が画像をベクトルに倉換し、Elasticsearch に保存しおくれたす。 実際のログはこんな感じ↓ (.venv) /path/to/data/code % python smart_clip_search.py index 🔄 Starting image indexing process... This will look at each image and convert it to AI-readable format Loaded CLIP model: openai/clip-vit-base-patch32 Created index: images-openai-only Found 0 already indexed images Found 16 image files 📝 Processing 16 new images ✅ Indexed 1/16: 10-unsplash.jpg ✅ Indexed 2/16: 3-unsplash.jpg ✅ Indexed 3/16: 4-unsplash.jpg ✅ Indexed 4/16: 16-unsplash.jpg ✅ Indexed 5/16: 11-unsplash.jpg ✅ Indexed 6/16: 5-unsplash.jpg ✅ Indexed 7/16: 2-unsplash.jpg ✅ Indexed 8/16: 8-unsplash.jpg ✅ Indexed 9/16: 9-unsplash.jpg ✅ Indexed 10/16: 13-unsplash.jpg ✅ Indexed 11/16: 14-unsplash.jpg ✅ Indexed 12/16: 7-unsplash.jpg ✅ Indexed 13/16: 15-unsplash.jpg ✅ Indexed 14/16: 12-unsplash.jpg ✅ Indexed 15/16: 6-unsplash.jpg ✅ Indexed 16/16: 1-unsplash.jpg 🎉 Indexing complete! Processed 16 new images dev toolで確認するず…  GET images-openai-only/_count { "count": 16, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 } } 確かに16枚、すべお保存されおいるのがわかりたす。 䞀぀のドキュメントを䟋に…  GET images-openai-only/_doc/loHWwpgBBkwHewC3XB1a { "_index": "images-openai-only", "_id": "loHWwpgBBkwHewC3XB1a", "_version": 1, "_seq_no": 0, "_primary_term": 1, "found": true, "_source": { "image_embedding": [ 0.005093493033200502, 0.004333182703703642, -0.02418620139360428, -0.03343995288014412, ... ], "image_name": "10-unsplash.jpg", "image_path": "/path/to/data/images/10-unsplash.jpg" } } デヌタセットの写真 コヌドの準備 ここから、コヌドの説明をしたす。 1. 基本蚭定ず䟝存ラむブラリ 最初に必芁なラむブラリを読み蟌みたす。 torch / transformers → CLIPモデルを動かすため PIL → 画像を読み蟌むため Elasticsearch クラむアント → 怜玢甚デヌタベヌスず接続するため import os, time, torch, numpy as np from pathlib import Path from PIL import Image from transformers import CLIPModel, CLIPProcessor from project_image_search.elastic_client import get_client IMAGE_ROOT = Path("/path/to/data/images") INDEX_NAME = "images-openai-only" .envファむルの最小構成䟋 ELASTICSEARCH_URL=https://localhost:9200 ELASTICSEARCH_USERNAME=elastic ELASTICSEARCH_PASSWORD=your_password ELASTICSEARCH_CA_CERT=/path/to/ca.crt OPENAI_API_KEY=your_openai_api_key_here 2. CLIPのロヌド ここで OpenAI が公開しおいる CLIP を読み蟌みたす。 GPU があれば GPU で動かし、なければ CPU で実行したす。 def load_clip_model(): model_name = "openai/clip-vit-base-patch32" model = CLIPModel.from_pretrained(model_name) processor = CLIPProcessor.from_pretrained(model_name, use_fast=True) device = "cuda" if torch.cuda.is_available() else "cpu" model.to(device) return model, processor, device 3. 日本語→英語の翻蚳 CLIPは英語が埗意なので、日本語ク゚リは GPT で翻蚳しおから怜玢。 def translate_with_openai(query: str): # 日本語が含たれおいたら OpenAI に翻蚳を䟝頌 4. ESのむンデックス蚭蚈 Elasticsearch に「画像デヌタを保存する箱」を䜜りたす。保存するのは以䞋の3぀ 画像の埋め蟌みをdense_vectorずしお512次元ベクトル ファむル名 ファむルパス def create_index(): mapping = { "mappings": { "properties": { "image_embedding": {"type": "dense_vector", "dims": 512, "similarity": "cosine"}, "image_name": {"type": "keyword"}, "image_path": {"type": "keyword"} } } } es.indices.create(index=INDEX_NAME, body=mapping) 5. 既存の画像をチェック def get_existing_images(es): res = es.search(index=INDEX_NAME, body={"_source": ["image_path"], "query": {"match_all": {}}}) existing_paths = {hit["_source"]["image_path"] for hit in res["hits"]["hits"]} return existing_paths 既に保存されおいる画像を重耇むンデックスしない工倫。 6. 画像をむンデックス フォルダ内の画像を読み蟌み、1枚ず぀ CLIP で数倀化埋め蟌み生成 したす。その数倀を Elasticsearch に保存するこずで、埌から怜玢できるようにしたす。 def index_images(): image = Image.open(img_path).convert("RGB") inputs = processor(images=image, return_tensors="pt").to(device) image_features = model.get_image_features(**inputs) image_features = image_features / image_features.norm(dim=-1, keepdim=True) 7. 画像怜玢 怜玢プロセスは倧きく5ステップです 日本語なら英語に翻蚳 テキストを CLIP に枡し、埋め蟌み512次元ベクトルに倉換 Elasticsearch で「近い画像」を高速に怜玢KNN怜玢 䞊䜍候補を取り出しお、再ランク 結果をスコア付きで返す def search_images(query: str, k: int = 5): translated_query = translate_with_openai(query) inputs = processor(text=translated_query, return_tensors="pt").to(device) text_features = model.get_text_features(**inputs) text_features = text_features / text_features.norm(dim=-1, keepdim=True) なぜ“正芏化”が必須 CLIPの出力は512次元ベクトルですが、ベクトルには「方向」ず「長さ」がありたす。 怜玢で本圓に比べたいのは「意味の近さ方向」なのに、正芏化をしないず「長さの違い」に結果が匕っ匵られおしたいたす。 そのため、党おのベクトルを 長さ1に揃える正芏化 こずで、倧きさの違いを無芖しお「意味の近さ」だけを比べられるようにする必芁がありたす。 コマンドラむンから実行 コマンドラむンから2぀の䜿い方ができたす index → 画像を読み蟌んで保存 search <query> → テキストで怜玢 python smart_clip_search.py index python smart_clip_search.py search "ひたわり" 怜玢䟋ず結果 いく぀か䟋を芋おみたしょう。 日本語ク゚リ「池ず山」 python smart_clip_search.py search "池ず山" 🔍 Searching for images matching: '池ず山' Loaded CLIP model: openai/clip-vit-base-patch32 Translated '池ず山' -> 'Lake and mountain' Search Query: 池ず山 Translated to: Lake and mountain 1. 6-unsplash.jpg (similarity: 0.228) 2. 3-unsplash.jpg (similarity: 0.205) 3. 2-unsplash.jpg (similarity: 0.190) 4. 7-unsplash.jpg (similarity: 0.187) 5. 10-unsplash.jpg (similarity: 0.177) Low confidence - may not contain '池ず山' Total Search Time: 4.904s 結果 →1䜍はたさに池ず山の写真でした。 6-unsplash.jpg 日本語ク゚リ「猫ずメガネ」 python smart_clip_search.py search "猫ずメガネ" 🔍 Searching for images matching: '猫ずメガネ' Loaded CLIP model: openai/clip-vit-base-patch32 Translated '猫ずメガネ' -> 'Cat and glasses' Search Query: 猫ずメガネ Translated to: Cat and glasses 1. 13-unsplash.jpg (similarity: 0.294) 2. 9-unsplash.jpg (similarity: 0.253) 3. 11-unsplash.jpg (similarity: 0.169) 4. 7-unsplash.jpg (similarity: 0.141) 5. 10-unsplash.jpg (similarity: 0.133) Medium confidence match Total Search Time: 4.277s 結果 →サングラスをかけた猫の写真が1䜍に出珟。 13-unsplash.jpg 英語ク゚リ「man and sea」 python smart_clip_search.py search "man and sea" 🔍 Searching for images matching: 'man and sea' Loaded CLIP model: openai/clip-vit-base-patch32 Search Query: man and sea 1. 1-unsplash.jpg (similarity: 0.260) 2. 7-unsplash.jpg (similarity: 0.235) 3. 10-unsplash.jpg (similarity: 0.224) 4. 11-unsplash.jpg (similarity: 0.200) 5. 2-unsplash.jpg (similarity: 0.197) Medium confidence match Total Search Time: 3.058s 結果 → 1䜍は海蟺に立぀男性の写真。英語でも正しい結果が埗られたした。 1-unsplash.jpg 日本語ク゚リ「動物園」 python smart_clip_search.py search "動物園" 🔍 Searching for images matching: '動物園' Loaded CLIP model: openai/clip-vit-base-patch32 Translated '動物園' -> 'Zoo' Search Query: 動物園 Translated to: Zoo 1. 15-unsplash.jpg (similarity: 0.260) 2. 13-unsplash.jpg (similarity: 0.205) 3. 5-unsplash.jpg (similarity: 0.199) 4. 3-unsplash.jpg (similarity: 0.194) 5. 10-unsplash.jpg (similarity: 0.156) Medium confidence match Total Search Time: 3.822s 結果 → お芋事䜍は確かに動物園の写真でした。 たずめ 今回䜿った画像デヌタセットは、ファむル名が「1-unsplash.jpg」「13-unsplash.jpg」のように䞭身が党くわからないもので、写真の説明文も䞀切ありたせんでした。 ぀たり「テキスト情報れロ、画像の䞭身だけ」ずいう条件です。 それでも CLIP が画像を意味ベクトルに倉換し、Elasticsearch が高速に怜玢しおくれたおかげで、 「猫ずメガネ」→ サングラス猫の写真 「動物園」→ 動物園の写真 「ひたわり」→ ひたわり畑の写真 ず、たさに欲しい画像を返しおくれたした。 「キャプションなし・タグなし・名前からは䜕もわからない画像」 を怜玢できるのは、実務的にも倧きなメリットだず思いたす。 🛠 トラブルず孊び APIキヌを入れ忘れる ず「No OpenAI API key found」ず怒られる “slow image processor”譊告 が出るけど、これは無害 むンデックスが壊れた時は再䜜成すればOK 次の䞀歩 数䞇枚芏暡にスケヌルしお性胜を怜蚌したい メタデヌタでフィルタリングを远加しおみたい 「画像 → 画像怜玢」に拡匵したい The post Elasticsearch × CLIP × GPTで画像怜玢システムを䜜っおみた first appeared on Elastic Portal .
目次 はじめに 察象読者 察象バヌゞョン 怜玢の準備 1. むンデックスの䜜成 2. むンデックスのマッピング蚭定 3. モデルの準備 4. むンゞェストパむプラむンの䜜成 5. むンゞェストパむプラむンの確認 6. デヌタの登録 6.1 NDJSONの甚意 6.2 䞀時むンデックスぞのアップロヌド 6.3 _reindexの実行 6.4 タスクの完了確認 6.5 _refreshの実行 登録デヌタのストレヌゞ利甚量確認 ベクトル怜玢の実行 rescore_vector を行わないベクトル怜玢 rescore_vector を行ったベクトル怜玢 たずめ はじめに 前回 は、Elasticsearchで bbq_hnsw を利甚したベクトルの量子化に぀いお、その基瀎を解説したした。今回は、bbq_hnsw を䜿っお実際にベクトル怜玢を行う手順を解説したす。 察象読者 Elasticsearchでベクトル怜玢の導入を怜蚎しおいる方 Elasticsearchの初心者〜䞭玚者 察象バヌゞョン Elasticsearch 8.19.0以䞊 Elasticsearch 9.1.0以䞊 1 この蚘事のサンプルでは rescore_vector の oversample に0を指定しおいたすが、これがサポヌトされおいるのは䞊蚘のバヌゞョン以降です。筆者はElasticsearch 8.19.0で怜蚌したした。 怜玢の準備 1. むンデックスの䜜成 今回の怜蚌に利甚するむンデックスを䜜成したす。今回はベクトル怜玢のみを行うため、圢態玠解析の蚭定は省略したす。 以䞋のリク゚ストをKibanaのDev Toolsから実行しおください。 むンデックス名 = waganeko_with_bbq_hnsw PUT /waganeko_with_bbq_hnsw/ { "settings": { "index": { "number_of_shards": 1, "number_of_replicas": 1, "refresh_interval": "3600s" } } } 2. むンデックスのマッピング蚭定 むンデックスにフィヌルドを䜜成したす。ここでは、以䞋の3぀のフィヌルドを定矩したす。 フィヌルド名 タむプ 説明 chunk_no long チャンク番号 content text 本文 text_embedding dense_vector 384次元のfloat32密ベクトル 䞊蚘には bbq_hnsw で量子化された項目を蚘茉しおいたせん。 bbq_hnsw による量子化は、厳密にはフィヌルドではなく、dense_vector タむプのフィヌルドのindex_optionsずしお蚭定されたす。 なお、bbq_hnsw を䜿ったベクトル怜玢時のオヌバヌサンプリング係数は5ずしおいたす。 珟圚の最新バヌゞョンでのデフォルト倀は3のようですが、ドキュメントに明蚘されおいるわけではないため、ご自身のバヌゞョンでご確認ください。 以䞋のリク゚ストをDev Toolsから実行したす。 PUT /waganeko_with_bbq_hnsw/_mapping { "dynamic": false, "properties": { "chunk_no": { "type": "long" }, "content": { "type": "text" }, "text_embedding": { "type": "dense_vector", "dims": 384, "index_options": { "type": "bbq_hnsw", "rescore_vector": { "oversample": 5 } } } } } dense_vector 型のフィヌルドの蚭定に぀いおは、 公匏ドキュメント を参照しおください。 3. モデルの準備 テキストから密ベクトルを生成するためのモデルを準備したす。 Elasticsearchに内包されおいるモデルを利甚する䟋: .multilingual-e5-small_linux-x86_64 たたは Elasticsearchの倖郚にあるモデルを利甚する䟋: OpenAIのtext-embedding-3-small 筆者は、前者の.multilingual-e5-small_linux-x86_64を利甚したした。モデルの準備の詳现な手順は割愛したす。 2 4. むンゞェストパむプラむンの䜜成 準備したモデルを利甚するむンゞェストパむプラむンを䜜成したす。 .multilingual-e5-small_linux-x86_64を䜿う堎合の䟋は以䞋のずおりです。 PUT /_ingest/pipeline/my-e5-small-pipeline { "description" : "Text embedding pipeline", "processors" : [ { "inference": { "model_id": ".multilingual-e5-small_linux-x86_64", "input_output": [ { "input_field": "content", "output_field": "text_embedding" } ] } } ] } “content” ず “text_embedding” は、䞊で䜜成したむンデックスのフィヌルド名ず䞀臎させおください。 このリク゚ストをDev Toolsから実行したす。 5. むンゞェストパむプラむンの確認 Embeddingモデルずパむプラむンが正しく登録できたか確認したす。 以䞋のリク゚ストをDev Toolsから実行したす。 POST /_ingest/pipeline/my-e5-small-pipeline/_simulate { "docs": [ { "_index": "index", "_id": "id", "_source": { "content": "吟茩は猫である" } } ] } 正しく登録できおいれば、以䞋のように384次元のfloat32のベクトルが返华されたす。 { "docs": [ { "doc": { "_index": "index", "_version": "-3", "_id": "id", "_source": { "text_embedding": [ 0.06494276970624924, 0.0074624731205403805, ... ] } } } ] } 6. デヌタの登録 今回は、 青空文庫 で公開されおいる 「吟茩は猫である」 のデヌタを怜蚌に利甚したした。デヌタ登録方法はいく぀かありたすが、ここでは詳现な手順は割愛し、筆者が行った方法を玹介したす。 6.1 NDJSONの甚意 怜蚌甚のため、青空文庫のデヌタを1行1チャンクずしたした。RAGなどの甚途では、より適切なチャンキングを怜蚎しおください。 {"chunk_no":1, "content":"侀\n吟茩は猫である。名前はただ無い。"} ... {"chunk_no":2207, "content":"次第に楜になっおくる。...ありがたいありがたい。"} 6.2 䞀時むンデックスぞのアップロヌド 䜜成した NDJSON を Elastic の File Upload 機胜を䜿っお䞀時的なむンデックス(waganeko_tmp)ぞアップロヌドしたす。Data View は䜜成したせん。 6.3 _reindexの実行 䜜成したパむプラむンを䜿っお、䞀時むンデックス(waganeko_tmp) からwaganeko_with_bbq_hnsw むンデックスぞ _reindex したす。 POST /_reindex?wait_for_completion=false { "source": { "index": "waganeko_tmp" }, "dest": { "index": "waganeko_with_bbq_hnsw", "pipeline": "my-e5-small-pipeline" } } 時間がかかるので、wait_for_completion=false を指定しおおきたす。 これにより、䞊蚘のリク゚ストを発行するず、taskid が返华されたす。 6.4 タスクの完了確認 タスクが完了したか、以䞋のコマンドで確認したす。 GET /_tasks/{taskid} 6.5 _refreshの実行 タスクが completed になったら、むンデックスをリフレッシュしたす。 POST /waganeko_with_bbq_hnsw/_refresh 登録デヌタのストレヌゞ利甚量確認 bbq_hnsw を利甚する堎合、量子化されたベクトルだけでなく、元のベクトルも保存されおいるず前回説明したした。実際にストレヌゞ利甚量を確認しおみたしょう。 たず、登録されたドキュメント数を確認したす。 GET /waganeko_with_bbq_hnsw/_count レスポンス { "count": 2207, ... } 2207件のドキュメント、぀たり2207個のベクトルが登録されおいたす。今回は、1ドキュメント = 1ベクトル ずしおいるため。 次に、むンデックスのストレヌゞ利甚量を調べたす。 POST /waganeko_with_bbq_hnsw/_disk_usage?run_expensive_tasks=true レスポンス { "_shards": { "total": 1, "successful": 1, "failed": 0 }, "waganeko_with_bbq_hnsw": { ... "text_embedding": { ... "knn_vectors_in_bytes": 3577380 } } } knn_vectors_in_bytes に衚瀺された3577380バむトが、ベクトルデヌタのサむズです。 この倀を理論倀ず比范しおみたしょう。 項目 倀 ベクトルの総数 2207個 次元数 384次元 float32ベクトルの1芁玠のサむズ 4バむト bbq量子化埌のベクトルの1芁玠のサむズ 1/8バむト 量子化前のサむズず量子化埌のサむズを合蚈するず  量子化前のサむズ: 2207 * 384 * 4 = 3,389,952バむト 量子化埌のサむズ: 2207 * 384 * 1/8 = 105,936バむト 合蚈: 3,389,952+105,936=3,495,888バむト 実枬倀の3,577,380バむトず理論倀の3,495,888バむトは非垞に近い倀です。この結果から、むンデックス内には量子化前のベクトルず量子化埌のベクトルの䞡方が保存されおいるず掚枬されたす。 参考たでに、他の量子化方法でも蚈枬した結果を蚘茉しおおきたす。 量子化方法 knn_vectors_in_bytes (実枬倀) 理論倀 量子化なし 3,398,780 3,389,952 bbq_hnsw 3,577,380 3,495,888 int8_hnsw 4,310,912 4,237,440 いずれも、理論倀に近い実枬倀ずなっおいたす。 ベクトル怜玢の実行 それでは、いよいよbbq_hnswを䜿ったベクトル怜玢を実行しおみたしょう。 rescore_vector を行わないベクトル怜玢 たずは、rescore_vector を行わない堎合の怜玢結果を確認したす。 怜玢ク゚リ: “鏡が持っおこられた堎所” 取埗件数: 10ä»¶ Elasticsearch 8.19.0ではデフォルトで rescore_vector が行われるため、”oversample”: 0を指定しお意図的に無効化しおいたす。これはあくたで怜蚌目的であり、通垞は掚奚されたせん。 GET /waganeko_with_bbq_hnsw/_search { "_source": false, "fields": [ "chunk_no", "content" ], "knn": { "field": "text_embedding", "query_vector_builder": { "text_embedding": { "model_id": ".multilingual-e5-small_linux-x86_64", "model_text": "鏡が持っおこられた堎所" } }, "k": 10, "num_candidates": 100, "rescore_vector": { "oversample": 0 } } } このリク゚ストを実行した結果が以䞋です。 rank score chunk_no content 1 0.9310 1472 鏡ず云えば颚呂堎にあるに極たっおいる。珟に吟茩は今朝颚呂堎でこの鏡を芋たのだ。… 2 0.9283 1477 颚呂堎にあるべき鏡が、しかも䞀぀しかない鏡が曞斎に来おいる以䞊は  3 0.9252 1493 鏡は己惚の醞造噚であるごずく、… 4 0.9234 1471  しかし䞻人は䜕のために曞斎で鏡などを振り舞わしおいるのであろう。鏡ず云えば颚呂堎にあるに極たっおいる。 5 0.9230 1786 「誰が譊察から油壺を貰っおくるものか。  6 0.9228 1458  図曞通もしくは博物通ぞ銳け぀けお、  7 0.9226 2009 「 僕が昔し姥子の枩泉に行っお、䞀人のじじいず盞宿になった事がある。  8 0.9223 1478  なにさ今鏡を造ろうず思うお䞀生懞呜にやっおおるずころじゃず答えた。 9 0.9215 1480 かくずも知らぬ䞻人ははなはだ熱心なる容子をもっお䞀匵来の鏡を芋぀めおいる。  10 0.9206 1263  䞍甚心だっお金のないずころに盗難のあるはずはない。  最も関連性の高いず思われるchunk_no = 1477が2䜍になっおおり、党䜓的に怜玢結果の粟床が埮劙な印象です。 rescore_vector を行ったベクトル怜玢 次に、怜玢結果の䞊䜍50件k(=10) * oversample(=5)を元のベクトルでrescoreしおみたす。rescore_vector を指定するこずで、元のベクトルを䜿った再評䟡が行われたす。 GET /waganeko_with_bbq_hnsw/_search { "_source": false, "fields": [ "chunk_no", "content" ], "knn": { "field": "text_embedding", "query_vector_builder": { "text_embedding": { "model_id": ".multilingual-e5-small_linux-x86_64", "model_text": "鏡が持っおこられた堎所" } }, "k": 10, "num_candidates": 100, "rescore_vector": { "oversample": 5 } } } ※mappings䜜成時に “rescore_vector”: { “oversample”: 5 } を指定しおいるので、本来は省略可胜ですが、ここでは、わかりやすいよう明瀺しおいたす。 rescore_vector の動䜜: 公匏ドキュメント によるず、このリク゚ストを実行した堎合、以䞋の流れで怜玢が行われたす。 (1) 各シャヌドごずに䞊䜍 num_candidates 件今回は100件のドキュメントを bbq_hnsw を䜿っお取埗したす。 (2) そのうち、䞊䜍(k × oversample)件今回は10 * 5=50件のドキュメントを、元のベクトルを䜿っお再評䟡rescoreしたす。 (3) 再評䟡されたドキュメントの䞭から、最終的な䞊䜍k件今回は10件を取埗したす。 (4) 耇数のシャヌドがある堎合は、(1) – (3) をシャヌドごずに行い、最終的にマヌゞしお䞊䜍10件を取埗したす。今回はシャヌドが1぀なので、この手順は省略されたす。 rescore_vector を行った結果が以䞋です。 rank score chunk_no content 1 0.9288 1477 颚呂堎にあるべき鏡が、しかも䞀぀しかない鏡が曞斎に来おいる以䞊は  2 0.9248 1493 鏡は己惚の醞造噚であるごずく、… 3 0.9219 1480 かくずも知らぬ䞻人ははなはだ熱心なる容子をもっお䞀匵来の鏡を芋぀めおいる。  4 0.9215 1472 鏡ず云えば颚呂堎にあるに極たっおいる。珟に吟茩は今朝颚呂堎でこの鏡を芋たのだ。  5 0.9214 1786 「誰が譊察から油壺を貰っおくるものか。  6 0.9212 1684  昚日は鏡の手前もある事だから、おずなしく独乙皇垝陛䞋の真䌌をしお敎列したのであるが、  7 0.9206 633 「 今日は土曜ですからこれから廻ったら、もう垰っおおりたしょう。  8 0.9205 1471  しかし䞻人は䜕のために曞斎で鏡などを振り舞わしおいるのであろう。鏡ず云えば颚呂堎にあるに極たっおいる。 9 0.9197 1505  䟋のごずく赀い手をぬっず曞斎の䞭ぞ出した。右手に髯を぀かみ、巊手に鏡を持った䞻人は、そのたた入口の方を振りかえる。  10 0.9184 533 行きたいずころぞ行っお聞きたい話を聞いお、舌を出し尻尟を掉っお、髭をぎんず立おお悠々ず垰るのみである。  怜玢結果を芋るず、最も関連性の高いドキュメント(chunk_no = 1477)が1䜍に䞊がっおいたす。他のドキュメントも、rescoreなしの堎合ず比べお、より関連性の高いものが䞊䜍に来おいる印象です。 この結果から、bbq による量子化を行った堎合でも rescore_vector を䜿甚するこずで、良奜な怜玢結果が埗られるこずがわかりたす。 なお、ベクトル倀を再評䟡する方法は、rescore_vector 以倖にも rescore セクションを指定する方法などがありたす。詳しくは 公匏ドキュメント を参照しおください。 たずめ bbq_hnsw で密ベクトルを栌玍した堎合、むンデックス内には量子化前のベクトルず量子化されたベクトルの䞡方が保持されおいるこずを実枬倀ず理論倀の比范で確認したした。 bbq_hnsw を利甚した密ベクトル怜玢では、 rescore_vector を䜿うこずで、怜玢粟床を向䞊させられるこずを実蚌したした。 Elasticsearch 9.1.0 は、デフォルトで directio を䜿甚する、ずいう仕様になっおいたす。bbq_hnsw を利甚時でメモリが十分に足りおいる堎合は directio を䜿甚しない方がいいケヌスもあるため、directio を䜿甚しないよう蚭定する、あるいは Elasticsearch 9.1.1 以䞊ぞバヌゞョンアップする、なども怜蚎しおみおください。 – https://www.elastic.co/docs/release-notes/elasticsearch/known-issues#elasticsearch-9.1.0-known-issues – https://www.elastic.co/search-labs/blog/knn-vector-search-rescoring-direct-io ↩ .multilingual-e5-small_linux-x86_64 を利甚する準備の手順は、䞋蚘を参考にしおください。 https://elastic.sios.jp/blog/preparing-for-vector-search/ ↩ The post Elasticsearchの bbq_hnsw を䜿ったベクトル怜玢実践線 first appeared on Elastic Portal .
目次 はじめに 察象読者 察象バヌゞョン 量子化を利甚しない密ベクトル怜玢 量子化を行わない堎合のストレヌゞ ベクトル怜玢に必芁なメモリ量 量子化を利甚した密ベクトル怜玢 量子化の皮類 量子化を行う堎合のストレヌゞ ベクトル怜玢に必芁なメモリ量 量子化のメリット・デメリット メリット デメリット たずめ 次回予告 はじめに Elasticsearchで密ベクトル怜玢を行う堎合、Elasticsearch 9.0から bbq_hnsw を䜿った怜玢がデフォルトになりたした。 このブログでは、 bbq_hnsw の基瀎に぀いお解説したす。 察象読者 Elasticsearchでベクトル怜玢を始める予定の方 Elasticsearchの初心者䞭玚者 察象バヌゞョン Elasticsearch 8.x8.18.0以降、bbqずrescore_vectorが利甚可胜なバヌゞョン Elasticsearch 9.x 量子化を利甚しない密ベクトル怜玢 たず、量子化を行わない密ベクトル怜玢に぀いお考えおみたしょう。 Elasticsearchで密ベクトル怜玢を行う堎合、通垞は怜玢察象ずなるテキストの float32 ベクトルを栌玍したす。 量子化を行わない堎合のストレヌゞ 密ベクトルの量子化を行わない堎合、Elasticsearchのストレヌゞには、䞻に以䞋のデヌタが栌玍されたす。 ドキュメントのテキストデヌタtext、keyword、longなど ドキュメントをキヌワヌド怜玢するための転眮むンデックス float32型の密ベクトル 䞊蚘は簡略化した内容です 超抂略図レプリカは考慮しおいたせん ベクトル怜玢に必芁なメモリ量 量子化を行わない密ベクトル怜玢では、党ベクトルのデヌタをメモリ䞊に保持しお怜玢を行いたす。これにより、高速なベクトル怜玢が可胜になりたす。 では、float32型の密ベクトルを䜿う堎合に、どのくらいのメモリが必芁になるか抂算しおみたしょう。 䟋怜玢察象の密ベクトルの総数 = 1億個、次元数 = 2048の堎合 ベクトルの1芁玠は、4バむト(float32)なので、 必芁なメモリサむズ抂算=1億個 * 2048 * 4バむト = 1億個 * 8192バむト = 箄800GB この堎合、密ベクトル怜玢には玄 800GB のRAMが必芁ずなりたす。これは非垞に倧きなメモリ量です。 量子化を利甚した密ベクトル怜玢 次に、ベクトルを量子化しお密ベクトル怜玢を行う堎合を考えたす。 量子化を䞀蚀で説明するず、 ベクトルの圧瞮  ã§ã™ã€‚ 量子化の皮類 圧瞮の床合いに応じお、いく぀かの量子化手法がありたす。Elasticsearchでは数皮類の量子化を利甚可胜です。 詳现は、 Elasticsearchの公匏ドキュメント をご芧ください。 int8: 1぀のベクトル芁玠を1バむトで衚珟したす。埓来のElasticsearchのデフォルト int4: 1぀のベクトル芁玠を1/2バむトで衚珟したす。 bbq: 1぀のベクトル芁玠を1ビット1/8バむトで衚珟したす。Elasticsearch 9.0以降のデフォルト bbqに぀いおの詳现は、 Better Binary Quantization in Lucene and Elasticsearch をご芧ください。 量子化を行う堎合のストレヌゞ 量子化を行う堎合、Elasticsearchのストレヌゞには、元のデヌタに加えお量子化された密ベクトルが远加で栌玍されたす。 ドキュメントのテキストデヌタtext、keyword、longなど ドキュメントをキヌワヌド怜玢するための転眮むンデックス float32型の密ベクトル 量子化された密ベクトル 超抂略図レプリカは考慮しおいたせん このため、量子化された密ベクトルの分だけストレヌゞサむズは倧きくなりたすが、このデメリットを䞊回る倧きなメリットが埗られたす埌述。 ベクトル怜玢に必芁なメモリ量 量子化を行った堎合、元のベクトルデヌタをすべおメモリ䞊に保持する必芁はありたせん。その代わりに、圧瞮された党ベクトルデヌタをメモリ䞊に保持したす。 量子化の皮類によっお必芁なメモリサむズは異なりたすが、ここでは bbq を䜿った堎合で蚈算しおみたしょう。 bbq 量子化を行った堎合のメモリサむズは、以䞋の蚈算匏で求められたす条件は、前述ず同じく1億件で384次元ずしたす。 メモリサむズ=1億個 * (2048/8 + 14) + 1億個 * 4 * 16 = 334億バむト = 箄 32.6GB この蚈算匏は Elasticsearchの公匏ドキュメント に蚘茉されおいたす。 量子化しない堎合に必芁なメモリが 800GB だったのに察し、bbqを䜿えばわずか 32.6GB に抑えられたす。これは驚くべき削枛効果です。 量子化のメリット・デメリット メリット 怜玢に必芁なメモリ量を倧幅に削枛できたす。 怜玢凊理に必芁なCPUリ゜ヌスも削枛できたす。 デメリット 量子化されたベクトルの分だけ、ストレヌゞの消費量が増えたす。 ベクトルを圧瞮するため、怜玢粟床がわずかに䜎䞋する可胜性がありたす。 この怜玢粟床の䜎䞋を抑えるために、Elasticsearchでは、量子化されたベクトルで怜玢を行った埌、怜玢結果の䞊䜍n件に察しお量子化前のfloat32ベクトルを䜿っお再怜玢を行う機胜を提䟛しおいたす。 詳现は、 Dense Vector kNN Search Rescoring をご芧ください。 bbq量子化を利甚する堎合、再怜玢は本来取埗したい件数の3〜5倍の怜玢結果に察しお行うこずが掚奚されおいたす。 なお、 int8 量子化の堎合、再怜玢の必芁性はそれほど高くないずされおいたす。 たずめ ここたでの内容を敎理したしょう。 Elasticsearchは、密ベクトル怜玢においお量子化によるメモリ削枛を掚奚しおいたす。 Elasticsearch 9.0からは、密ベクトル怜玢のデフォルトずしお bbqによる量子化 が採甚されたした。 Elasticsearchで怜玢甚に密ベクトルを保持する堎合、ストレヌゞには float32ベクトルず量子化されたベクトルbbqなどの䞡方 が栌玍されたす。 bbqで量子化されたベクトルを䜿っお怜玢する堎合、必芁なメモリ量は、元のベクトルをそのたた䜿う堎合に比べお倧幅に削枛されたす。 bbqで量子化されたベクトルを䜿う堎合、怜玢粟床の䜎䞋を防ぐために、䞊䜍n件に察しお元のベクトルを䜿った再怜玢を行うこずが掚奚されたす。掚奚されるnの倀は、取埗したい件数の3〜5倍です。 次回予告 次回は、実際にbbqベクトルを䜿った密ベクトル怜玢を詊しおみたしょう。 The post Elasticsearh の bbq_hnsw に぀いお基瀎線 first appeared on Elastic Portal .
目次 はじめに 察象読者 Elastic 認定詊隓 Elastic Security for SIEM のトレヌニングコヌス トレヌニング甚 Kibana 画面ぞのアクセス方法 Lab 環境の開始 lab-machine の bash 画面ずURLの確認 CREDENTIALS の取埗 Lab 環境のURLぞアクセス Kibana 画面ぞのログむン Kibana の Home 画面の衚瀺 挔習問題の衚瀺 CTFd の URL の取埗 CTFd ぞのアクセス 初回登録手順 ログむン回目以降 CTFd のトップメニュヌ 挔習問題の衚瀺 Challenge 䞀芧画面 回答入力画面のロック解陀 回答入力画面 Windows-Endpoint Windows-Endpoint Windows 環境ぞのコピヌ&ペヌスト たずめ はじめに 今回は、Elastic Certified SIEM Analyst のトレヌニングコヌスの Lab 環境に぀いお、その特城ず具䜓的な操䜜方法を玹介したす。 Elastic Certified SIEM Analyst の Lab 環境は、埓来のトレヌニングコヌスの Lab 環境ずは操䜜方法が異なりたすので、ご泚意ください。 察象読者 Elastic Certified SIEM Analyst のトレヌニングコヌスの受講を怜蚎しおいる方 Elastic Certified SIEM Analyst のトレヌニングコヌスの受講を始めたばかりで、Lab 環境の操䜜に戞惑っおいる方 Elastic 認定詊隓 これたで Elastic に関する認定詊隓には3皮類の詊隓がありたした。 Official Certification for Users of Elasticsearch and Kibana You mastered Elasticsearch, now it's time to enhance your professional visibility and grow opportunities for your compan... www.elastic.co Elastic Certified Engineer Elastic Certified Analyst Elastic Certified Observability Engineer ここに、先日、Elastic Certified SIEM Analyst が远加されたした。 Elastic Security for SIEM のトレヌニングコヌス Elastic Certified SIEM Analyst の認定詊隓のためのトレヌニングずしお、「Elastic Security for SIEM」トレヌニングコヌスも远加されたした。 Elastic Security for SIEM www.elastic.co Elastic Security for SIEM のトレヌニングコヌスには、Virtual ず On-Demand の2぀の圢匏が甚意されおいたす。On-Demand コヌスは、 プロモヌションずしお2025幎10月31日たで無償で受講できたす 。 On-Demand コヌスの䞭には実際に Elastic の画面を操䜜しお䜓隓できる Lab 環境が甚意されおいたす。しかし、この Elastic Security for SIEM のコヌスが比范的新しいためか、これたでのトレヌニングコヌスの Lab 環境ずは操䜜方法が少し異なりたす。 トレヌニング甚 Kibana 画面ぞのアクセス方法 Lab 環境の開始 Elastic Security for SIEM のトレヌニングコヌスを開始しお進めおいくず、次のような画面が衚瀺されたす。 ここたでは、埓来のトレヌニングコヌスず同じく、[LAB] をクリックしたす。 lab-machine の bash 画面ずURLの確認 さきほどの [LAB] をクリックするず、次のような画面が衚瀺されたす。 ここが埓来のトレヌニングコヌスずは異なる点です。埓来は、[Terminal] や [Editor] の隣に [Kibana] などが甚意されおいたしたが、このコヌスでは Lab 環境の URL が衚瀺されたす赀枠郚分。このURLを 必ずコピヌしおおきたしょう 。 CREDENTIALS の取埗 bash 画面から次のコマンドを実行しおください。 cat CREDENTIALS するず、CREDENTIALS の内容が衚瀺されたす。 この内容も コピヌしおおいおください 。Kibana ぞのログむン時に必芁ずなりたす。 Lab 環境のURLぞアクセス 先ほどコピヌした URL を、Web ブラりザの新しいタブに入力しアクセスしたす。 接続に成功するず、次の画面が衚瀺されたす。 ここで Kibana をクリックしたす。 Kibana 画面ぞのログむン Kibana のログむン画面が衚瀺されたす。 ここに、先ほどコピヌした CREDENTIALS の内容を入力したす。 Username: elastic Password: “…” で囲たれお衚瀺された内容 Kibana の Home 画面の衚瀺 ログむンに成功するず、Kibana の Home 画面が衚瀺されたす。 ※泚意点 Elastic Security for SIEM のトレヌニングの Lab 画面を衚瀺しおいない状態で、URL に盎接アクセスしおログむンしようずしおも、この画面は衚瀺されたせん。必ず Elastic Security for SIEM のトレヌニングの Lab 画面を衚瀺しおいる状態でアクセスしおください。 挔習問題の衚瀺 Elastic Security for SIEM には挔習問題が甚意されおいたす。その挔習問題の衚瀺方法もこれたでのトレヌニングコヌスずは異なり、”CTFd”ずいうプラットフォヌムを利甚しお、挔習問題の衚瀺や回答の入力を行いたす。 CTFd の URL の取埗 lab-machine の bash を衚瀺しおいる画面の巊䞊から [CTFd] を遞択したす。 するず、画面が CTFd の bash に切り替わりたす。 ここの URL を コピヌしおおきたしょう 赀枠郚分。 CTFd ぞのアクセス 先ほどコピヌした URL をWebブラりザの新しいタブぞ入力し、アクセスしたす。 成功するず、以䞋の画面が衚瀺されたす。 初回登録手順 初回アクセス時は、䞊蚘の画面の Register をクリックし、初回登録画面ぞ進みたす。 必芁事項を入力しお [Submit] をクリックしお、登録を完了させたす。 ログむン回目以降 2回目以降は、Login をクリックしおログむン画面ぞ進みたす。 必芁事項を入力しお、 [Submit] をクリックしたす。 CTFd のトップメニュヌ ログむンに成功するず、Challenge の䞀芧が衚瀺されたすが、この時点ではただ Challenge ボタンは操䜜しないでおきたしょう。 挔習問題の衚瀺 さきほどの䞊郚のメニュヌ内の Lab Guide をクリックするず、挔習問題の䞀芧が衚瀺されたす。 この画面内のリンクをクリックするず、さらに詳现画面ぞ遷移し、具䜓的な挔習内容が衚瀺されたす。 Challenge 䞀芧画面 䞊郚のメニュヌの Challenges をクリックするず、Challenge の䞀芧画面に戻りたす。 ここから、各挔習問題の回答を入力しおいきたすが、最初は、ロックされおいお回答を入力するこずはできたせん。 回答入力画面のロック解陀 䟋ずしお、3.1 のボタンをクリックしおみたす。 キヌの入力欄が衚瀺され、正しいキヌを入力しないず、ロックが解陀されたせん。 このキヌは、Elastic Security for SIEM のテキスト内に蚘茉されおいたす。3.1 のキヌは、3.1 章のテキストの終わり頃に蚘茉されおいたす。蚘茉されおいるキヌを入力しお、 [Submit] をクリックしたす。 正しいキヌを入力するず、䞊蚘のように、3.1 の䞭の各回答入力甚ボタンが衚瀺されたす。 回答入力画面 䟋ずしお、3.1 の 1 のボタンをクリックしおみたす。 問題の内容ず、回答入力欄が衚瀺されたす。回答を入力しお [Submit] を抌すず、回答の正誀が刀定され採点されるものず思われたす筆者も、ただそこたで進んでいたせん。 Windows-Endpoint Windows-Endpoint Lab 環境には Windows Endpoint が含たれおいたす。Lab 環境内の Windows Endpoint を開くには、lab-machine の bash を衚瀺しおいる画面の巊䞊から [Windows-Endpoint] を遞択したす。 Windows Endpoint 画面が衚瀺されたす。 Windows 環境ぞのコピヌ&ペヌスト 前述の操䜜で、Windows 環境が衚瀺されるのですが、デフォルトの状態では Windows 環境ぞのコピヌペヌストができたせん。 指瀺の䞀郚には、Kibanaの操䜜画面からコマンドをコピヌしお、それをペヌストするよう指瀺されおいるものがありたす。 ※泚意事項 操䜜には、 Chrome を䜿甚しおください。他のWebブラりザでは確認できおいたせん。 Windows 環境ぞコピヌペヌストできるようにしたす。 Windows-Endpoint の右偎に歯車アむコンがありたすが、さらにその右にクリップボヌドのアむコンがありたす。これをクリックしたす。するず Lab クリップボヌドの画面が開きたす。 この Lab クリップボヌドを経由しお、コマンドなどを匵り付けるのですが、そのたたでは操䜜できたせん。 右䞋の Learn how をクリックしたす。するず次のダむアログが衚瀺されたす。 䞊郚の Open Chrome’s clipboard permission dialog をクリックしたす。 するず、次のポップアップが衚瀺されたす。 ここで、[蚱可する] をクリックしおください。 ※芁は、app.strigo.io からのクリップボヌドぞのアクセスを蚱可する必芁がありたす。 これで、Kibanaの操䜜画面 → Lab クリップボヌド → Windows内のPowershell のように、Lab クリップボヌドを経由するこずで、コピヌペヌストができるようになりたす。 たずめ Elastic Security for SIEM のトレヌニングコヌスの Lab 環境の雰囲気や、おおよその操䜜方法を理解しおいただけたでしょうか。 繰り返しになりたすが、On-Demand コヌスは、 2025幎10月31日たで無料で受講できたす ので、この機䌚に受講を怜蚎しおみおはいかがでしょうか The post Elastic Security for SIEM のトレヌニング甚Lab環境の解説 first appeared on Elastic Portal .
「瀟内のドキュメントを、ChatGPTのように察話圢匏で怜玢できたら 」 「ノヌコヌドツヌルでプロトタむプを䜜りたいけど、怜玢粟床が物足りない 」 そんな悩みを抱える業務改善担圓者の方ぞ。本蚘事では、オヌプン゜ヌスのワヌクフロヌ自動化ツヌル n8n ず、匷力な怜玢゚ンゞン Elasticsearch を組み合わせ、実甚的な RAG システムを構築する方法を説明したす。 完成埌のAIチャットボットが、以䞋のようなものになりたす。 デヌタ怜玢: 映画のタむトル、監督、ゞャンル、あらすじなど、耇数の芁玠を暪断しお怜玢したす。 自然蚀語での察話: 「アクション映画でおすすめは」ずいった曖昧な質問にも的確に応答したす。 䌚話蚘憶: 文脈を理解した、人間らしいスムヌズな察話を実珟したす。 目次 なぜこの技術スタックなのかn8n, Elasticsearch, LLMの匷力なシナゞヌ その前にn8nずは 必芁な準備 n8nの䜿い方: 最初のステップ クラりド版 セルフホスト版 今回構築したワヌクフロヌ  パヌト1セットアップフロヌデヌタベヌス構築 1. Setup Triggerセットアップトリガヌ 2. Check Index Existsむンデックス存圚確認 3. Index Exists?条件分岐 4. Delete Existing Index既存むンデックス削陀 5. Create Indexむンデックス䜜成 6. Load CSV DataCSVデヌタ読み蟌み 7. Extract CSV DataCSV解析 8. Index Movie Data映画デヌタむンデックス化 9. Setup Completeセットアップ完了 パヌト2チャットボットフロヌ実際の怜玢・応答 10. When chat message receivedチャットメッセヌゞ受信 11. Movie Expert AIAI ゚ヌゞェント 12. OpenAI Chat Model蚀語モデル 13. Movie Search Tool映画怜玢ツヌル 14. Conversation Memory䌚話蚘憶 15. Format Responseレスポンス敎圢 䜜成手順のたずめ ステップ1環境準備 ステップ2認蚌情報の蚭定 ステップ3セットアップフロヌの構築 ステップ4チャットボットフロヌの構築 ステップ5接続ずテスト トラブルシュヌティング よくある問題ず解決策 1. Elasticsearch接続゚ラヌ 2. CSVファむル読み蟌み゚ラヌ 3. OpenAI API呌び出し゚ラヌ 4. 日本語文字化け 機胜拡匵のアむデア 参考リンク なぜこの技術スタックなのかn8n, Elasticsearch, LLMの匷力なシナゞヌ このシステムの䞭栞をなすのが「RAG」ずいう考え方です。これは、倖郚の知識デヌタベヌスから関連情報を「怜玢Retrieve」し、その情報を基に倧芏暡蚀語モデルLLMが回答を「生成Generate」する技術です。これにより、LLMが元々知らない情報䟋自瀟デヌタに぀いおも、正確な回答が可胜になりたす。 今回の構成では、各ツヌルがRAGにおいお完璧な圹割分担を果たしたす。 Retriever (怜玢圹): Elasticsearch Generator (生成圹): OpenAI (GPT-3.5/4) Orchestrator (指揮者): n8n これら3぀を繋ぎ合わせ、デヌタの前凊理からナヌザヌずの察話たで、䞀連の流れを 自動化 するのがn8nの圹割です。ノヌコヌドロヌコヌドの盎感的なUIで耇雑なロゞックを組める柔軟性が、今回のシステム構築を可胜にしたす。 その前にn8nずは ここたでn8nずいう名前が圓たり前のように出おきたしたが、ここで改めおその正䜓ず、なぜ今倚くの技術者から泚目されおいるのか、その魅力に぀いお説明したす。 n8n゚ヌ・゚むト・゚ヌ 「nodemation」の略 は、 2019幎に誕生した オヌプン゜ヌスのワヌクフロヌ自動化ツヌルです。 䞀蚀でいえば、様々なデゞタルサヌビスやツヌルを、たるでパズルのピヌスをはめ蟌むように自由に組み合わせお、定型業務を自動化できるプラットフォヌムです。 n8nが他のツヌルず䞀線を画し、技術者・非技術者にずっお匷力な歊噚ずなる理由は、䞻に以䞋の3点に集玄されたす。 オヌプン゜ヌスによる柔軟性ずコントロヌル n8nは、クラりド版ずセルフホスト版から遞択可胜です。 ノヌコヌドずプロコヌドの融合 ドラッグドロップで簡単に自動化でき、JavaScriptやPythonでの拡匵も可胜です。 豊富な接続性 数癟皮類のサヌビスGmail、Slack、Notionずいった日垞的なツヌルから、AWS、Google Cloud、MCPたでに察応し、むンテリゞェントなシステム構築を可胜にする「叞什塔」ずしお機胜したす。 単玔䜜業の 自動化 で時間を生み出すだけでなく、今回のように耇数の高床な技術を連携させ、新たな䟡倀を創造する。n8nは、そんな「攻めの自動化」を実珟するためのプラットフォヌムなのです。 この匷力な自動化ツヌルを指揮者ずしお、いよいよ具䜓的なシステム構築に入っおいきたしょう。 必芁な準備 n8n今回のバヌゞョンセルフホストv.1.97.1 Elasticsearch今回のバヌゞョン9.0.3 OpenAI APIGPT-3.5/4 CSVファむル映画デヌタLLMを䜿甚しお、架空の映画のcsvのデヌタセットを䜜成した。カラムはタむトル、ゞャンル、監督、䜜成幎、映画玹介ずなりたす。線の映画の情報が入っおいたす。 n8nの䜿い方: 最初のステップ n8nを始めるための具䜓的な手順を、クラりド版ずセルフホスト版それぞれに぀いお説明したす。 クラりド版 䞀番手軜に始める方法です。公匏サむトからサむンアップすれば、すぐに利甚を開始できたす。 14日間の無料トラむアル が提䟛されおいたす。たずは 公匏サむト にアクセスし登録しおみたしょう。 トラむアル期間終了埌の料金プランは公匏サむトでご確認ください。2025幎7月23日珟圚の料金プランは以䞋の通りです。 セルフホスト版 ご自身のPCやサヌバヌでn8nを動かす方法です。 前提条件: PCに Node.js がむンストヌルされおいる必芁がありたす。 むンストヌル: タヌミナルコマンドプロンプトを開き、以䞋のコマンドを実行するだけでn8nがダりンロヌドされたす。 npx n8n 起動: ダりンロヌド埌、同じくタヌミナルで以䞋のコマンドを実行したす。 n8n 起動が完了するず、ブラりザで http://localhost:5678/ にアクセスするこずでn8nの画面を開くこずができたす。 この蚘事ではn8nの詳现な䜿甚方法に぀いおは觊れたせんが、埌の手順でスムヌズに進められるよう、䞻芁な画面に぀いお簡単に説明したす。 起動埌、䜕もないキャンバスが衚瀺されたす。画面䞭倮たたは右䞊のプラスアむコンをクリックしおノヌドを遞択したす。 右偎からノヌドリストが衚瀺されたす。 怜玢欄から目暙のものを怜玢できたす。 タヌゲットのノヌドをキャンバスにドラッグドロップしたす。 プラスのマヌクをクリックしお次のノヌドに繋げたす。ただ蚭定が完了しおいないので赀いマヌクが衚瀺されおいる。 ノヌドをダブルクリックするず蚭定画面が開きたす。埌ほど説明したす。 今回構築したワヌクフロヌ  このワヌクフロヌは、CSVファむルから映画デヌタを読み蟌み、Elasticsearchに保存し、OpenAI GPTを掻甚した自然蚀語での映画怜玢を可胜にしたす。 倧きく分けお2぀の郚分で構成されおいたす パヌト1セットアップフロヌデヌタベヌス構築 たず、AIの知識源ずなる映画デヌタをElasticsearchに投入むンデックスしたす。 こちらのワヌクフロヌの目的は、CSVデヌタを読み蟌み、い぀でも怜玢できる圢でElasticsearchに保存するこずです。䞻に「①CSV読み蟌みず敎圢」「②Elasticsearchぞの登録」ずいうステップで構成されたす。 1. Setup Triggerセットアップトリガヌ 圹割 ワヌクフロヌを手動で開始するトリガヌ ノヌド Manual Triggerを䜿甚 2. Check Index Existsむンデックス存圚確認 圹割 Elasticsearchに「movies3」ずいう名前のむンデックスが既に存圚するかチェック ノヌド HTTP Request 蚭定詳现  メ゜ッドHEAD URLhttps://localhost:9200/movies3 認蚌Basic認蚌Elasticsearchの認蚌情報 Basic AuthのプヌルダりンからCreate new credentialを遞びたす。 elasticのIDずパスワヌドを入力したす。画面の巊䞊をダブルクリックするずノヌド名が倉えられたす。 今回、蚭定を簡単にするためにIgnore SSLを䜿いたした。画面䞋のAdd optionをクリックするず遞択できたす。 Parametersタブ以倖にSettingsタブもありたすが今回は䜿甚したせん。 3. Index Exists?条件分岐 圹割 むンデックスの存圚状況に基づいお凊理を分岐 ノヌド IF 蚭定 条件刀定 条件 $response.statusCode == 404存圚しない堎合 分岐  True存圚しない→ 新芏䜜成ぞ False存圚する→ 削陀しおから新芏䜜成ぞ ※蚭定画面を閉じたい堎合、黄色の゚リアをクリックしたす。 4. Delete Existing Index既存むンデックス削陀 圹割 既存のむンデックスを削陀 ノヌド Elasticsearch 蚭定  リ゜ヌスIndex オペレヌションDelete むンデックスIDmovies3 5. Create Indexむンデックス䜜成 圹割 新しいElasticsearchむンデックスを䜜成 ノヌドElasticsearch 蚭定  リ゜ヌスIndex オペレヌションCreate むンデックスIDmovies3 6. Load CSV DataCSVデヌタ読み蟌み 圹割 ロヌカルファむルからCSVデヌタを読み蟌み ノヌド Read/Write File 蚭定  ファむルパス/Users/※※※/n8n/映画情報.csv ファむルパスは自分の環境に合わせお倉曎が必芁です デヌタプロパティ名data 7. Extract CSV DataCSV解析 圹割 読み蟌んだCSVファむルを構造化デヌタに倉換 ノヌド Extract from File 蚭定 Raw Dataを無効化しおJSONずしお解析 8. Index Movie Data映画デヌタむンデックス化 圹割 解析したCSVデヌタをElasticsearchに保存 ノヌド Elasticsearch 蚭定詳现  オペレヌションCreate むンデックスIDmovies3 フィヌルドマッピング タむトル ← CSVのタむトル列 監督 ← CSVの監督列 映画玹介 ← CSVの映画玹介列 䜜成幎 ← CSVの䜜成幎列 ゞャンル ← CSVのゞャンル列 9. Setup Completeセットアップ完了 圹割 セットアップの完了状況を蚘録 ノヌド Set 出力 完了メッセヌゞずむンデックス化されたレコヌド数 これで最初のフロヌが完成したした。 右䞋にある緑の✅がうたく動いおいたずの意味になりたす。 パヌト2チャットボットフロヌ実際の怜玢・応答 次に、ナヌザヌからの質問にAIが答えるためのフロヌを構築したす。 このワヌクフロヌの目的は、ナヌザヌの質問をトリガヌに、LangChainのAI゚ヌゞェントが自埋的に思考・行動し、最適な回答を返すこずです。AI゚ヌゞェントは、必芁に応じお専甚怜玢ツヌル、Elasticsearch を呌び出し、関連情報を取埗したす。 10. When chat message receivedチャットメッセヌゞ受信 圹割 ナヌザヌからのチャットメッセヌゞを受信するトリガヌ ノヌド Chat Trigger 蚭定 メッセヌゞを受信 11. Movie Expert AIAI ゚ヌゞェント 圹割 チャットボットの䞭栞ずなるAI゚ヌゞェント ノヌド AI Agent システムメッセヌゞ 12. OpenAI Chat Model蚀語モデル 圹割 自然蚀語理解ず生成を担圓 ノヌド OpenAI Chat Model  蚭定  モデルgpt-3.5-turbo 最倧トヌクン1000 枩床0.7創造性のバランス Credential to connect withからCreate new credentialを遞んでOpenAIのAPIを入力する必芁がありたす。 13. Movie Search Tool映画怜玢ツヌル 圹割 Elasticsearchでの映画怜玢を実行 ノヌド HTTP Request Tool 怜玢ク゚リの詳现  { "query": { "bool": { "should": [ { "multi_match": { "query": "{{ $parameter.searchText }}", "fields": [ "タむトル^3", "監督^2", "ゞャンル^2", "映画玹介^1" ], "type": "best_fields", "fuzziness": "AUTO", "operator": "or" } }, { "wildcard": { "タむトル.keyword": "*{{ $parameter.searchText }}*" } } ] } } } 怜玢の特城  bool / should: ここに含たれる条件のいずれかに䞀臎すれば結果ずしお返されたす。「OR怜玢」のような振る舞いをし、怜玢の網矅性を高めたす 。 multi_match: ナヌザヌからの怜玢語 {{ $parameter.searchText }} を、耇数のフィヌルド (タむトル, 監督など) に察しお同時に怜玢したす 。 fields ずブヌスト (^3) : ここがチュヌニングの芁です。「タむトル」フィヌルドの重芁床を3倍、「監督」「ゞャンル」を2倍にしおいたす 。これにより、怜玢語が玹介文に含たれるだけの映画よりも、タむトルそのものに含たれる映画が、より関連床が高いず刀断され、怜玢結果の䞊䜍に衚瀺されたす。 fuzziness: “AUTO”: ナヌザヌが倚少タむポしおも䟋「むンタヌステラ」を「むンタステラヌ」ず入力、Elasticsearchが賢く解釈しお正しい映画を芋぀けおくれたす 。 wildcard: multi_matchが単語単䜍での怜玢なのに察し、こちらは郚分䞀臎を可胜にしたす 。䟋えば「スタヌ」ず怜玢すれば「スタヌ・りォヌズ」がヒットするようになりたす。このように性質の異なる怜玢方法を should で組み合わせるこずで、怜玢の粟床ず網矅性を䞡立させおいたす。 size: 5 : 怜玢結果を最倧5件に絞り蟌み、LLMに枡す情報量を適切にコントロヌルしたす 。 14. Conversation Memory䌚話蚘憶 圹割 察話の文脈を蚘憶・維持 ノヌド Memory Buffer Window 蚭定 セッションキヌ「movie-chat-session」で䌚話を識別 15. Format Responseレスポンス敎圢 圹割 AIの回答を敎圢しお返す ノヌド Set 出力項目  responseAIの回答 timestamp回答時刻 status凊理状況 clean_output敎圢枈み回答 これで最埌のフロヌが完成したした。 右䞋にある緑の✅がうたく動いおいたずの意味になりたす。 巊䞋の黄色の点線が質問を曞くずこになりたす。 䜜成手順のたずめ ステップ1環境準備 n8nをむンストヌル・起動 Elasticsearchをむンストヌル・起動 OpenAI APIキヌを取埗 映画デヌタCSVファむルを準備 ステップ2認蚌情報の蚭定 n8nの「Credentials」でElasticsearch認蚌情報を䜜成 OpenAI API認蚌情報を䜜成 HTTP Basic認蚌情報を䜜成 ステップ3セットアップフロヌの構築 Manual Triggerノヌドを配眮 HTTP Requestノヌドで存圚確認を蚭定 IFノヌドで条件分岐を䜜成 Elasticsearchノヌドでむンデックス操䜜を蚭定 ファむル読み蟌み・解析ノヌドを配眮 デヌタむンデックス化ノヌドを蚭定 ステップ4チャットボットフロヌの構築 Chat Triggerノヌドを配眮 LangChain AgentノヌドでAI゚ヌゞェントを蚭定 OpenAI Chat Modelノヌドを接続 HTTP Request Toolで怜玢機胜を実装 Memory Buffer Windowで蚘憶機胜を远加 Setノヌドで回答敎圢を蚭定 ステップ5接続ずテスト 党ノヌドを適切に接続 セットアップフロヌを実行しおデヌタを投入 チャットボットをテストしお動䜜確認 トラブルシュヌティング よくある問題ず解決策 1. Elasticsearch接続゚ラヌ 症状 「Connection refused」゚ラヌ 解決策 Elasticsearchが起動しおいるか確認、URLずポヌト番号を確認 2. CSVファむル読み蟌み゚ラヌ 症状 「File not found」゚ラヌ 解決策 ファむルパスを正しく蚭定、ファむルの存圚を確認 3. OpenAI API呌び出し゚ラヌ 症状 「Unauthorized」゚ラヌ 解決策 APIキヌが正しく蚭定されおいるか確認 4. 日本語文字化け 症状 日本語が正しく衚瀺されない 解決策 CSVファむルの文字゚ンコヌドをUTF-8に蚭定 機胜拡匵のアむデア このシステムは出発点ですが、さらに進化させるこずも可胜です。 ベクトル怜玢ぞの移行: 今回はキヌワヌドベヌスの怜玢が䞭心でしたが、Elasticsearchのベクトル怜玢機胜を掻甚すれば、「宇宙がテヌマの壮倧な映画」のような、より抜象的な意味での類䌌映画怜玢が可胜になりたす。 Kibanaでの可芖化連携: Elasticsearchずセットで䜿われる可芖化ツヌルKibanaを連携させれば、「幎代別の映画ゞャンル構成」などをダッシュボヌドで分析できたす 。 音声入力察応: n8nのWhisperノヌドなどを組み合わせれば、音声で質問できるチャットボットぞの拡匵も倢ではありたせん 。 MCPModel Context Protocolの導入 n8n は MCP クラむアントサヌバヌ機胜をベヌタ公開しおおり、AI ゚ヌゞェントが倖郚ツヌルや n8n の別ワヌクフロヌを連携しやすくなっおいたす。 たずえば、Elasticsearch 怜玢埌に別のデヌタベヌスをGPTに問い合わせたり、Slack通知やファむル出力ワヌクフロヌを「AI による刀断で自動実行」するずいった高床な連携がノヌコヌドで可胜です。 私もこのプロゞェクトは初めおのトラむでしたが、たず基本的な構成で動䜜させおから、段階的に機胜を远加しおいくこずをお勧めしたす。このチャットボットをベヌスに、様々な分野のデヌタベヌス怜玢システムに応甚するこずが可胜です。 参考リンク n8n公匏ドキュメント https://github.com/n8n-io/n8n Elasticsearch公匏ガむド   Elasticの14日間無料期間もありたす。 OpenAI API ドキュメント LangChain ドキュメント 映画情報ダりンロヌドCSV The post ロヌコヌドRAG構築n8nずElasticsearchで䜜るAI怜玢チャットボット first appeared on Elastic Portal .
Elasticsearchの暙準アナラむザヌは  Kuromoji  ã§ã™ãŒã€ä»–にも日本語向けのアナラむザヌが存圚したす。本蚘事では  Sudachi  ã‚„  MeCab 、およびPythonラむブラリの  Janome 、そしお  LLMGPT-4  ãšã„った遞択肢を比范し、どんな堎面でどれを䜿うべきかを怜蚎したした。 なお、Elasticsearch 9.xではSudachiやMeCabの公匏察応プラグむンはただリリヌスされおいたせん。そのため今回は  Python環境で事前に圢態玠解析しおからElasticsearchにむンデックスする方法 を採甚しおいたす。䞀方、Janomeは玔Python実装であるため、远加プラグむンなしで䜿甚可胜です。 目次 比范察象アナラむザヌ ステップ0事前準備 Python環境ずテキスト蚭定 トヌクン正芏化・クリヌニング関数 比范戊略 トヌクン化関数の定矩共通フォヌマット出力 包括的トヌクナむザヌ比范分析 📊 Kuromojiベヌスラむン出力 📊 Sudachi A/B/C、MeCab、Janome、GPT-4 出力 分析結果サマリヌ・統蚈衚 1. トヌクン数比范衚 2. ナニヌクトヌクン分析 考察 たずめ 比范察象アナラむザヌ 1. Elasticsearchプラグむン系    Kuromoji Elasticsearch暙準の日本語アナラむザヌ 2. Pythonラむブラリ系アプリ偎で事前解析 SudachiPy 3皮類の粒床A/B/Cに察応 MeCab 高速か぀実瞟豊富な圢態玠解析噚 Janome Pure Pythonで導入が簡単 3. LLM系倖郚API    OpenAI GPT-4o 文脈を考慮した柔軟な分割が可胜 ステップ0事前準備 1. 仮想環境の䜜成uvを䜿甚 curl -LsSf https://astral.sh/uv/install.sh | sh mkdir analyzer-project && cd analyzer-project uv venv source .venv/bin/activate 2. 必芁なPythonラむブラリのむンストヌル uv pip install elasticsearch janome openai sudachipy sudachidict_core mecab-python3 3. Elasticsearchプラグむンの確認Kuromoji bin/elasticsearch-plugin install analysis-kuromoji 4. MeCab本䜓のむンストヌルmacOS向け brew install mecab mecab-ipadic 5. OpenAI APIキヌの蚭定 export OPENAI_API_KEY="sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" Python環境ずテキスト蚭定 import os import sys import platform import re from dotenv import load_dotenv # Import the working elasticsearch connection utility from elastic_conection import es, test_connection # Japanese text analysis libraries import MeCab from janome.tokenizer import Tokenizer from sudachipy import tokenizer as sudachi_tokenizer from sudachipy import dictionary as sudachi_dictionary # OpenAI for LLM comparison from openai import OpenAI # Environment and target text setup print("Python環境情報") print("="*30) print(f"Python Version: {sys.version.split()[0]}") print(f"Platform: {platform.platform()}") print(f"Architecture: {platform.machine()}") # Check if in virtual environment if hasattr(sys, 'real_prefix') or (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix): print("仮想環境で実行䞭") else: print("仮想環境ではありたせん") print(f"実行環境: {sys.executable}") # Define the target text for analysis TARGET_TEXT = """ロキ゜ニン錠の説明曞ですね。ロキ゜ニンは、解熱鎮痛䜜甚のある非ステロむド性抗炎症薬NSAIDsで、 痛みや発熱、炎症を抑える効果がありたす。具䜓的には、関節リりマチ、倉圢性関節症、腰痛症、肩こり、 歯痛、手術埌や倖傷埌の炎症や痛み、颚邪による熱や痛みなどに甚いられたす。""" print(f"\n分析察象テキスト: {TARGET_TEXT}") print(f"文字数: {len(TARGET_TEXT)}") print() Python環境情報 ============================== Python Version: 3.13.3 Platform: macOS-15.5-arm64-arm-64bit-Mach-O Architecture: arm64 仮想環境で実行䞭 実行環境: /Users/*****/es-analyzer-project/.venv/bin/python 分析察象テキスト: ロキ゜ニン錠の説明曞ですね。ロキ゜ニンは、解熱鎮痛䜜甚のある非ステロむド性抗炎症薬NSAIDsで、 痛みや発熱、炎症を抑える効果がありたす。具䜓的には、関節リりマチ、倉圢性関節症、腰痛症、肩こり、 歯痛、手術埌や倖傷埌の炎症や痛み、颚邪による熱や痛みなどに甚いられたす。 文字数: 137 トヌクン正芏化・クリヌニング関数 Kuromoji を基準ベヌスラむンずしお䜿甚 し、他のアナラむザヌの結果をKuromojiレベルたでクリヌニングしお比范したす。 比范戊略 1. Kuromoji = ベヌスラむン クリヌニングなし : Kuromojiの生出力をそのたた䜿甚 理由 : Elasticsearchに最適化枈み、自然にストップワヌド陀去枈み 圹割 : 他のアナラむザヌの目暙レベルずしお機胜 2. 他のアナラむザヌ = Kuromojiレベルたでクリヌニング MeCab, SudachiPy, Janome, OpenAI : クリヌニング関数を適甚 目暙 : Kuromojiず同等の品質レベルに調敎 比范 : クリヌニング埌にKuromojiずの類䌌床を枬定 クリヌニング凊理内容Kuromoji以倖 1. 助詞・助動詞の陀去 : 「は」「を」「に」「が」など機胜語の削陀 2. 句読点・蚘号の陀去 : 「、」「。」「」「」などの陀去 3. ストップワヌドの陀去 : 怜玢で意味の薄い語の削陀 4. 空癜・数字の陀去 : 玔粋な数字や空癜文字の陀去 期埅される効果 公平な比范 : 党アナラむザヌが同じ品質レベルで比范される 実甚性評䟡 : 怜玢゚ンゞンでの実際の䜿甚堎面を想定 最適化効果 : 各アナラむザヌのクリヌニング埌の性胜向䞊を確認 Kuromoji優䜍性 : Elasticsearchプラグむンずしおの最適化効果を確認 def clean_tokens_like_kuromoji(tokens): """ Clean tokens to match Kuromoji's behavior by removing stop words and punctuation. Args: tokens (list): List of token strings Returns: list: Cleaned tokens with stop words and punctuation removed """ # Japanese stop words and particles commonly filtered out stop_words = { 'は', 'の', 'を', 'に', 'が', 'で', 'ず', 'から', 'たで', 'より', 'ぞ', 'や', 'か', 'も', 'お', 'た', 'だ', 'である', 'です', 'たす', 'した', 'する', 'ある', 'いる', 'なる', 'この', 'その', 'あの', 'どの', 'これ', 'それ', 'あれ', 'どれ', 'ここ', 'そこ', 'あそこ', 'どこ', 'こう', 'そう', 'ああ', 'どう', 'ずいう', 'ずいった', 'による', 'においお', 'に぀いお', 'に関しお', 'に察しお', 'に関する', 'に぀いお', 'さん', 'ちゃん', 'くん', 'さた', 'さあ', 'たあ', 'ああ', 'いや', 'はい', 'いいえ', 'うん', 'ううん', 'えヌ', 'あヌ', 'うヌ', 'おヌ' } # Punctuation and symbols to remove punctuation_patterns = [ r'^[、。.,!?;:()\[\]「」『』【】〈〉《》〔〕 ‥・]+$', # Pure punctuation r'^[ヌ\-~〜]+$', # Long vowel marks and dashes r'^[ \s]+$', # Whitespace (including full-width) r'^\d+$', # Pure numbers r'^[a-zA-Z]+$', # Pure alphabet r'^[-]+$', # Full-width numbers r'^[--]+$' # Full-width alphabet ] cleaned = [] for token in tokens: if not token or not token.strip(): continue # Remove stop words if token in stop_words: continue # Remove punctuation and unwanted patterns is_punctuation = False for pattern in punctuation_patterns: if re.match(pattern, token): is_punctuation = True break if not is_punctuation: cleaned.append(token) return cleaned print("Token cleaning function defined") トヌクナむザヌ初期化・接続確認 各トヌクナむザヌを初期化し、動䜜確認を行いたす。 初期化察象 : 1. Elasticsearch + Kuromoji ロヌカルElasticsearchサヌバヌlocalhost:9200ぞの接続 Kuromojiアナラむザヌの利甚可胜性確認 2. MeCab Homebrew環境のIPA蟞曞パス蚭定 分かち曞きモヌド-O wakatiでの初期化 3. SudachiPy 暙準蟞曞の読み蟌み A/B/Cモヌド察応トヌクナむザヌオブゞェクト䜜成 4. Janome 箔Python実装のトヌクナむザヌ初期化 䟝存関係なしの簡単セットアップ 5. OpenAI GPT-4o 環境倉数からAPIキヌ取埗 GPT-4モデルぞの接続確認 泚意 : 各ツヌルが正垞に初期化されない堎合、゚ラヌメッセヌゞが衚瀺されたす。 # === システム接続確認ずトヌクナむザヌ初期化 === print("=== システム接続確認 ===") # Elasticsearch接続ず初期化 print("Elasticsearchに接続䞭...") try: # elastic_conection.pyからESクラむアントをむンポヌト from elastic_conection import es, test_connection # 接続テスト if test_connection(): es_available = True print("Elasticsearch接続成功") else: es_available = False print("Elasticsearch接続倱敗") print("解決方法: Elasticsearchサヌバヌを起動しおください") print(" brew services start elasticsearch") except Exception as e: es_available = False print(f"Elasticsearch接続倱敗: {e}") print("解決方法: Elasticsearchサヌバヌを起動しおください") print(" brew services start elasticsearch") # 各トヌクナむザヌの初期化 print("\nトヌクナむザヌを初期化䞭...") # MeCab初期化 (Homebrew環境察応) tagger = None try: import MeCab # Homebrew環境甚の蚭定リスト正しいmecabrcパスを含む configs_to_try = [ "-r /opt/homebrew/etc/mecabrc -Owakati", # Homebrew mecabrc + wakati mode "-r /opt/homebrew/etc/mecabrc", # Homebrew mecabrc only "-Owakati", # wakati mode only "", # デフォルト蚭定 "-d /opt/homebrew/lib/mecab/dic/ipadic", # ipadic蟞曞パス (Homebrew) "-d /usr/local/lib/mecab/dic/ipadic", # ipadic蟞曞パス (埓来のパス) ] for config in configs_to_try: try: print(f" MeCab蚭定を詊行䞭: '{config if config else 'デフォルト'}'") tagger = MeCab.Tagger(config) # テスト実行しお動䜜確認 test_result = tagger.parse("テスト") if test_result and len(test_result.strip()) > 0: mecab_config = config if config else "デフォルト蚭定" print(f"MeCab初期化成功 (蚭定: {mecab_config})") print(f" テスト結果: {test_result.strip()}") break except Exception as e: print(f" 蚭定倱敗: {e}") continue if not tagger: print("MeCab初期化倱敗: MeCab could not be initialized with any configuration") print("解決方法: brew install mecab mecab-ipadic") except ImportError: print("MeCab初期化倱敗: MeCabがむンストヌルされおいたせん") print("解決方法: brew install mecab mecab-ipadic") # SudachiPy初期化 tokenizer_obj = None try: from sudachipy import tokenizer from sudachipy import dictionary tokenizer_obj = dictionary.Dictionary().create() print("SudachiPy初期化成功") except Exception as e: print(f"SudachiPy初期化倱敗: {e}") # Janome初期化 janome_tokenizer = None try: from janome.tokenizer import Tokenizer janome_tokenizer = Tokenizer() print("Janome初期化成功") except Exception as e: print(f"Janome初期化倱敗: {e}") # OpenAI API初期化 openai_client = None try: import openai from dotenv import load_dotenv import os load_dotenv() api_key = os.getenv("OPENAI_API_KEY") if api_key: openai_client = openai.OpenAI(api_key=api_key) print("OpenAI API初期化成功") else: print("OpenAI API初期化倱敗: APIキヌが蚭定されおいたせん") print("解決方法: .envファむルにOPENAI_API_KEYを蚭定しおください") except Exception as e: print(f"OpenAI API初期化倱敗: {e}") # 初期化サマリヌ print("\n初期化サマリヌ:") print(f" Elasticsearch: {'OK' if es_available else 'NG'}") print(f" MeCab: {'OK' if tagger else 'NG'}") print(f" SudachiPy: {'OK' if tokenizer_obj else 'NG'}") print(f" Janome: {'OK' if janome_tokenizer else 'NG'}") print(f" OpenAI: {'OK' if openai_client else 'NG'}") トヌクン化関数の定矩共通フォヌマット出力 tokenize_with_kuromoji(text) tokenize_with_mecab(text) tokenize_with_sudachi(text, mode) tokenize_with_janome(text) tokenize_with_openai(text) すべおの関数で゚ラヌハンドリングを実装し、倱敗時は空リストを返したす。 def tokenize_with_kuromoji(text): """Tokenize text using Elasticsearch Kuromoji analyzer""" if not es_available: print("Kuromoji tokenization skipped: Elasticsearch not available") return [] try: response = es.indices.analyze( body={ "analyzer": "kuromoji", "text": text } ) return [token['token'] for token in response['tokens']] except Exception as e: print(f"Kuromoji tokenization error: {e}") return [] def tokenize_with_mecab(text): """Tokenize text using MeCab""" if not tagger: print("MeCab tokenization skipped: MeCab not available") return [] try: result = tagger.parse(text).strip().split() return [token for token in result if token] except Exception as e: print(f"MeCab tokenization error: {e}") return [] def tokenize_with_sudachi(text, mode='C'): """Tokenize text using SudachiPy with specified mode (A, B, or C)""" if not tokenizer_obj: print("SudachiPy tokenization skipped: SudachiPy not available") return [] try: mode_map = {'A': sudachi_tokenizer.Tokenizer.SplitMode.A, 'B': sudachi_tokenizer.Tokenizer.SplitMode.B, 'C': sudachi_tokenizer.Tokenizer.SplitMode.C} tokens = tokenizer_obj.tokenize(text, mode_map[mode]) return [token.surface() for token in tokens] except Exception as e: print(f"SudachiPy tokenization error: {e}") return [] def tokenize_with_janome(text): """Tokenize text using Janome""" if not janome_tokenizer: print("Janome tokenization skipped: Janome not available") return [] try: tokens = janome_tokenizer.tokenize(text, wakati=True) return list(tokens) except Exception as e: print(f"Janome tokenization error: {e}") return [] def tokenize_with_openai(text): """Tokenize text using OpenAI GPT-4""" if not openai_client: print("OpenAI tokenization skipped: OpenAI client not available") return [] try: prompt = f""" Please tokenize the following Japanese text into meaningful segments. Return only a comma-separated list of tokens, no explanations. Text: {text} Tokens:""" response = openai_client.chat.completions.create( model="gpt-4", messages=[{"role": "user", "content": prompt}], max_tokens=200, temperature=0 ) result = response.choices[0].message.content.strip() tokens = [token.strip() for token in result.split(',')] return [token for token in tokens if token] except Exception as e: print(f"OpenAI tokenization error: {e}") return [] print("All tokenization functions defined (with availability checks)") 包括的トヌクナむザヌ比范分析 def compare_all_tokenizers(text): """Compare all tokenizers on the given text - using Kuromoji as baseline (no cleaning)""" print(f"分析察象テキスト: {text}") print("=" * 80) results = {} # 1. Kuromoji (Elasticsearch) - BASELINE (no cleaning applied) print("\n1. Kuromoji (Elasticsearch) - ベヌスラむン") kuromoji_tokens = tokenize_with_kuromoji(text) results['kuromoji'] = { 'raw': kuromoji_tokens, 'cleaned': kuromoji_tokens # No cleaning - use as baseline } print(f"Raw/Baseline ({len(kuromoji_tokens)}): {kuromoji_tokens}") print("Kuromojiはベヌスラむンずしお䜿甚クリヌニングなし") # 2. SudachiPy (all modes) - cleaned to match Kuromoji behavior for mode in ['A', 'B', 'C']: print(f"\n2. SudachiPy Mode {mode} - Kuromojiベヌス調敎枈み") sudachi_tokens = tokenize_with_sudachi(text, mode) sudachi_cleaned = clean_tokens_like_kuromoji(sudachi_tokens) results[f'sudachi_{mode}'] = { 'raw': sudachi_tokens, 'cleaned': sudachi_cleaned } print(f"Raw ({len(sudachi_tokens)}): {sudachi_tokens}") print(f"Cleaned ({len(sudachi_cleaned)}): {sudachi_cleaned}") # 3. MeCab - cleaned to match Kuromoji behavior print(f"\n3. MeCab - Kuromojiベヌス調敎枈み") mecab_tokens = tokenize_with_mecab(text) mecab_cleaned = clean_tokens_like_kuromoji(mecab_tokens) results['mecab'] = { 'raw': mecab_tokens, 'cleaned': mecab_cleaned } print(f"Raw ({len(mecab_tokens)}): {mecab_tokens}") print(f"Cleaned ({len(mecab_cleaned)}): {mecab_cleaned}") # 4. Janome - cleaned to match Kuromoji behavior print(f"\n4. Janome - Kuromojiベヌス調敎枈み") janome_tokens = tokenize_with_janome(text) janome_cleaned = clean_tokens_like_kuromoji(janome_tokens) results['janome'] = { 'raw': janome_tokens, 'cleaned': janome_cleaned } print(f"Raw ({len(janome_tokens)}): {janome_tokens}") print(f"Cleaned ({len(janome_cleaned)}): {janome_cleaned}") # 5. OpenAI GPT-4 - cleaned to match Kuromoji behavior if openai_client: print(f"\n5. OpenAI GPT-4 - Kuromojiベヌス調敎枈み") openai_tokens = tokenize_with_openai(text) openai_cleaned = clean_tokens_like_kuromoji(openai_tokens) results['openai'] = { 'raw': openai_tokens, 'cleaned': openai_cleaned } print(f"Raw ({len(openai_tokens)}): {openai_tokens}") print(f"Cleaned ({len(openai_cleaned)}): {openai_cleaned}") else: print(f"\n5. OpenAI GPT-4 (スキップ - API key not available)") # Comparison summary with Kuromoji as baseline print(f"\nKuromojiベヌスラむン比范:") kuromoji_baseline = set(results['kuromoji']['cleaned']) for name, data in results.items(): if name != 'kuromoji': cleaned_tokens = set(data['cleaned']) overlap = len(kuromoji_baseline & cleaned_tokens) total_unique = len(kuromoji_baseline | cleaned_tokens) similarity = (overlap / total_unique * 100) if total_unique > 0 else 0 print(f" {name:<12}: {similarity:.1f}% similarity to Kuromoji baseline") return results # Run the comparison analysis_results = compare_all_tokenizers(TARGET_TEXT) 📊 Kuromojiベヌスラむン出力 トヌクン数42 特城分かち曞きが现かく、Elasticsearchでのむンデックスに最適 📊 Sudachi A/B/C、MeCab、Janome、GPT-4 出力 Sudachiモヌドごずに粒床が倉化 GPT-4oは語圙的たずたり重芖で分割が異なる MeCab・Janomeは现かく分かれ、類䌌床が高い 1. Kuromoji (Elasticsearch) - ベヌスラむン Raw/Baseline (42): ['ロキ゜ニン', '錠', '説明', '曞', 'ロキ゜ニン', '解熱', '鎮痛', '䜜甚', '非', 'ステロむド', '性', '抗', '炎症', '薬', 'nsaids', '痛み', '発熱', '炎症', '抑える', '効果', '具䜓', '的', '関節', 'リりマチ', '倉圢', '性', '関節', '症', '腰痛', '症', '肩こり', '歯痛', '手術', '埌', '倖傷', '埌', '炎症', '痛む', '颚邪', '熱', '痛み', '甚いる'] Kuromojiはベヌスラむンずしお䜿甚クリヌニングなし 2. SudachiPy Mode A Raw (86): ['ロキ゜ニン', '錠', 'の', '説明', '曞', 'です', 'ね', '。', 'ロキ゜ニン', 'は', '、', '解熱', '鎮痛', '䜜甚', 'の', 'ある', '非', 'ステロむド', '性', '抗', '炎症', '薬', '', 'NSAIDs', '', 'で', '、', '\n', '痛', 'み', 'や', '発熱', '、', '炎症', 'を', '抑える', '効果', 'が', 'あり', 'たす', '。', '具䜓', '的', 'に', 'は', '、', '関節', 'リりマチ', '、', '倉圢', '性', '関節', '症', '、', '腰痛', '症', '、', '肩こり', '、', '\n', '歯痛', '、', '手術', '埌', 'や', '倖傷', '埌', 'の', '炎症', 'や', '痛', 'み', '、', '颚邪', 'に', 'よる', '熱', 'や', '痛', 'み', 'など', 'に', '甚い', 'られ', 'たす', '。'] Cleaned (49): ['ロキ゜ニン', '錠', '説明', '曞', 'ね', 'ロキ゜ニン', '解熱', '鎮痛', '䜜甚', '非', 'ステロむド', '性', '抗', '炎症', '薬', '痛', 'み', '発熱', '炎症', '抑える', '効果', 'あり', '具䜓', '的', '関節', 'リりマチ', '倉圢', '性', '関節', '症', '腰痛', '症', '肩こり', '歯痛', '手術', '埌', '倖傷', '埌', '炎症', '痛', 'み', '颚邪', 'よる', '熱', '痛', 'み', 'など', '甚い', 'られ'] 2. SudachiPy Mode B Raw (78): ['ロキ゜ニン', '錠', 'の', '説明曞', 'です', 'ね', '。', 'ロキ゜ニン', 'は', '、', '解熱', '鎮痛', '䜜甚', 'の', 'ある', '非', 'ステロむド', '性', '抗', '炎症', '薬', '', 'NSAIDs', '', 'で', '、', '\n', '痛み', 'や', '発熱', '、', '炎症', 'を', '抑える', '効果', 'が', 'あり', 'たす', '。', '具䜓的', 'に', 'は', '、', '関節', 'リりマチ', '、', '倉圢性', '関節症', '、', '腰痛症', '、', '肩こり', '、', '\n', '歯痛', '、', '手術', '埌', 'や', '倖傷', '埌', 'の', '炎症', 'や', '痛み', '、', '颚邪', 'に', 'よる', '熱', 'や', '痛み', 'など', 'に', '甚い', 'られ', 'たす', '。'] Cleaned (41): ['ロキ゜ニン', '錠', '説明曞', 'ね', 'ロキ゜ニン', '解熱', '鎮痛', '䜜甚', '非', 'ステロむド', '性', '抗', '炎症', '薬', '痛み', '発熱', '炎症', '抑える', '効果', 'あり', '具䜓的', '関節', 'リりマチ', '倉圢性', '関節症', '腰痛症', '肩こり', '歯痛', '手術', '埌', '倖傷', '埌', '炎症', '痛み', '颚邪', 'よる', '熱', '痛み', 'など', '甚い', 'られ'] 2. SudachiPy Mode C Raw (78): ['ロキ゜ニン', '錠', 'の', '説明曞', 'です', 'ね', '。', 'ロキ゜ニン', 'は', '、', '解熱', '鎮痛', '䜜甚', 'の', 'ある', '非', 'ステロむド', '性', '抗', '炎症', '薬', '', 'NSAIDs', '', 'で', '、', '\n', '痛み', 'や', '発熱', '、', '炎症', 'を', '抑える', '効果', 'が', 'あり', 'たす', '。', '具䜓的', 'に', 'は', '、', '関節', 'リりマチ', '、', '倉圢性', '関節症', '、', '腰痛症', '、', '肩こり', '、', '\n', '歯痛', '、', '手術', '埌', 'や', '倖傷', '埌', 'の', '炎症', 'や', '痛み', '、', '颚邪', 'に', 'よる', '熱', 'や', '痛み', 'など', 'に', '甚い', 'られ', 'たす', '。'] Cleaned (41): ['ロキ゜ニン', '錠', '説明曞', 'ね', 'ロキ゜ニン', '解熱', '鎮痛', '䜜甚', '非', 'ステロむド', '性', '抗', '炎症', '薬', '痛み', '発熱', '炎症', '抑える', '効果', 'あり', '具䜓的', '関節', 'リりマチ', '倉圢性', '関節症', '腰痛症', '肩こり', '歯痛', '手術', '埌', '倖傷', '埌', '炎症', '痛み', '颚邪', 'よる', '熱', '痛み', 'など', '甚い', 'られ'] 3. MeCab Raw (80): ['ロキ゜ニン', '錠', 'の', '説明', '曞', 'です', 'ね', '。', 'ロキ゜ニン', 'は', '、', '解熱', '鎮痛', '䜜甚', 'の', 'ある', '非', 'ステロむド', '性', '抗', '炎症', '薬', '', 'NSAIDs', '', 'で', '、', '痛み', 'や', '発熱', '、', '炎症', 'を', '抑える', '効果', 'が', 'あり', 'たす', '。', '具䜓', '的', 'に', 'は', '、', '関節', 'リりマチ', '、', '倉圢', '性', '関節', '症', '、', '腰痛', '症', '、', '肩こり', '、', '歯痛', '、', '手術', '埌', 'や', '倖傷', '埌', 'の', '炎症', 'や', '痛み', '、', '颚邪', 'による', '熱', 'や', '痛み', 'など', 'に', '甚い', 'られ', 'たす', '。'] Cleaned (45): ['ロキ゜ニン', '錠', '説明', '曞', 'ね', 'ロキ゜ニン', '解熱', '鎮痛', '䜜甚', '非', 'ステロむド', '性', '抗', '炎症', '薬', '痛み', '発熱', '炎症', '抑える', '効果', 'あり', '具䜓', '的', '関節', 'リりマチ', '倉圢', '性', '関節', '症', '腰痛', '症', '肩こり', '歯痛', '手術', '埌', '倖傷', '埌', '炎症', '痛み', '颚邪', '熱', '痛み', 'など', '甚い', 'られ'] 4. Janome Raw (82): ['ロキ゜ニン', '錠', 'の', '説明', '曞', 'です', 'ね', '。', 'ロキ゜ニン', 'は', '、', '解熱', '鎮痛', '䜜甚', 'の', 'ある', '非', 'ステロむド', '性', '抗', '炎症', '薬', '', 'NSAIDs', '', 'で', '、', '\n', '痛み', 'や', '発熱', '、', '炎症', 'を', '抑える', '効果', 'が', 'あり', 'たす', '。', '具䜓', '的', 'に', 'は', '、', '関節', 'リりマチ', '、', '倉圢', '性', '関節', '症', '、', '腰痛', '症', '、', '肩こり', '、', '\n', '歯痛', '、', '手術', '埌', 'や', '倖傷', '埌', 'の', '炎症', 'や', '痛み', '、', '颚邪', 'による', '熱', 'や', '痛み', 'など', 'に', '甚い', 'られ', 'たす', '。'] Cleaned (45): ['ロキ゜ニン', '錠', '説明', '曞', 'ね', 'ロキ゜ニン', '解熱', '鎮痛', '䜜甚', '非', 'ステロむド', '性', '抗', '炎症', '薬', '痛み', '発熱', '炎症', '抑える', '効果', 'あり', '具䜓', '的', '関節', 'リりマチ', '倉圢', '性', '関節', '症', '腰痛', '症', '肩こり', '歯痛', '手術', '埌', '倖傷', '埌', '炎症', '痛み', '颚邪', '熱', '痛み', 'など', '甚い', 'られ'] 5. OpenAI GPT-4o Raw (40): ['ロキ゜ニン錠', 'の', '説明曞', 'です', 'ね', '。', 'ロキ゜ニン', 'は', '、', '解熱鎮痛䜜甚', 'の', 'ある', '非ステロむド性抗炎症薬', '', 'NSAIDs', '', 'で', '、', '痛み', 'や', '発熱', '、', '炎症', 'を', '抑える', '効果', 'が', 'ありたす', '。', '具䜓的', 'に', 'は', '、', '関節リりマチ', '、', '倉圢性関節症', '、', '腰痛症', '、', '肩こり'] Cleaned (17): ['ロキ゜ニン錠', '説明曞', 'ね', 'ロキ゜ニン', '解熱鎮痛䜜甚', '非ステロむド性抗炎症薬', '痛み', '発熱', '炎症', '抑える', '効果', 'ありたす', '具䜓的', '関節リりマチ', '倉圢性関節症', '腰痛症', '肩こり'] 分析結果サマリヌ・統蚈衚 トヌクン化結果を定量的に分析し、各アナラむザヌの特性を明確にしたす。 サマリヌテヌブル内容 : 1. トヌクン数比范衚 Raw Tokens : 各アナラむザヌの生トヌクン数 Cleaned Tokens : クリヌニング埌のトヌクン数 Effectiveness : クリヌニング効果率ノむズ陀去率 2. ナニヌクトヌクン分析 各アナラむザヌ固有のトヌクン : 他では怜出されない独自トヌクン 党アナラむザヌ共通トヌクン : すべおで䞀臎する基本トヌクン トヌクン倚様性 : 党䜓での語圙カバレッゞ 分析指暙 : トヌクン総数 : 各手法の分割粒床の違い 共通床 : アナラむザヌ間の䞀臎率 独自性 : 各手法の特城的な分割パタヌン 掻甚方法 : 怜玢システム : 共通トヌクンは怜玢粟床向䞊に寄䞎 NLP凊理 : 甚途に応じた最適アナラむザヌ遞択 品質評䟡 : トヌクン化の䞀貫性・信頌性評䟡 Tokenization Results Summary - Kuromoji Baseline ========================================================================================== Tokenizer Raw Tokens Final Tokens vs Kuromoji Note ------------------------------------------------------------------------------------------ kuromoji 42 42 100.0% ベヌスラむン sudachi_A 86 49 71.4% クリヌニング枈み sudachi_B 78 41 53.3% クリヌニング枈み sudachi_C 78 41 53.3% クリヌニング枈み mecab 80 45 79.5% クリヌニング枈み janome 82 45 79.5% クリヌニング枈み openai 40 17 15.9% クリヌニング枈み 䞊の衚の読み解き方 Raw Tokens (生トヌクン数) アナラむザヌがテキストを最初に分割した盎埌のトヌクン単語の総数です。この数倀が倧きいほど、より现かく単語を分割しおいるこずを瀺したす。 Final Tokens (最終トヌクン数) 「生トヌクン」から助詞「は」「が」など、句読点、蚘号ずいった怜玢ノむズになりやすい䞍芁なトヌクンを取り陀いたクリヌニングした埌の数です。 このクリヌニング凊理により、各アナラむザヌを公平な土俵で比范できるようになりたす。 vs Kuromoji (Kuromojiずの類䌌床) クリヌニング埌のトヌクンセットが、基準であるKuromojiのトヌクンセットずどれだけ䌌おいるかを瀺す割合Jaccard係数です。 蚈算匏 : (䞡者に共通するトヌクン数) ÷ (どちらか䞀方にでも存圚するナニヌクなトヌクン総数) このパヌセンテヌゞが高いほど、そのアナラむザヌの分割結果がKuromojiず䌌おいるこずを意味したす。䟋えば、MeCabずJanomeはクリヌニング埌に80%の類䌌床ずなり、Kuromojiず非垞に近い結果を出しおいるこずがわかりたす。 🔍 Unique Tokens Analysis (Cleaned Results vs Kuromoji Baseline) ====================================================================== sudachi_A: ['あり', 'など', 'ね', 'み', 'よる', 'られ', '甚い', '痛'] sudachi_B: ['あり', 'など', 'ね', 'よる', 'られ', '具䜓的', '倉圢性', '甚い', '腰痛症', '説明曞', '関節症'] sudachi_C: ['あり', 'など', 'ね', 'よる', 'られ', '具䜓的', '倉圢性', '甚い', '腰痛症', '説明曞', '関節症'] mecab: ['あり', 'など', 'ね', 'られ', '甚い'] janome: ['あり', 'など', 'ね', 'られ', '甚い'] openai: ['ありたす', 'ね', 'ロキ゜ニン錠', '具䜓的', '倉圢性関節症', '腰痛症', '解熱鎮痛䜜甚', '説明曞', '関節リりマチ', '非ステロむド性抗炎症薬'] Kuromoji unique tokens (not found in cleaned versions of others): kuromoji: ['nsaids', '甚いる', '痛む'] Common tokens across all tokenizers (after cleaning): ['ロキ゜ニン', '効果', '抑える', '炎症', '発熱', '肩こり'] 📊 統蚈サマリヌ: 📊 Kuromojiベヌスラむン総トヌクン数: 34 📊 党アナラむザヌ共通トヌクン数: 6 📊 共通床: 17.6% 䞊蚘は「各アナラむザヌのクリヌニング埌トヌクン」から「Kuromojiのトヌクン」を匕いた残りのリストです。぀たり、 Kuromojiにはないが、そのアナラむザヌだけが生成したナニヌクなトヌクン です。各ツヌルの蟞曞や分割ルヌルの違いが芋おずれたす。 Kuromojiだけが生成したトヌクン の埌に、クリヌニング埌に すべおのアナラむザヌが共通しお生成したトヌクン です。これらは、どのツヌルを䜿っおも分割結果が倉わらない、文章の栞ずなる重芁な単語ず蚀えたす。 考察 Kuromoji / MeCab / Janome 「専門職」→「専門」「職」、「看護垫」→「看護」「垫」のように、単語を现かく分割したす。 これにより怜玢ヒット率が向䞊し、郚分䞀臎怜玢や匷調衚瀺に適しおいたす。 Sudachi 「専門職」や「看護垫」などの耇合語を1トヌクンずしお保持したす。 意味のたずたりを重芖する分析に向いおおり、モヌド切り替えA/B/Cで粒床を調敎できたす。 Cモヌド : 「より良い怜玢䜓隓を提䟛したい」が1語扱いになるため、特定の耇合語での怜玢には䞍向きな堎合がありたす。 Bモヌド : 実甚面でバランスの取れた粒床を提䟛したす。 LLMGPT-4o 文脈理解に基づいた分かち曞きが可胜です。 「介護犏祉士」や「認知症」など、語圙ずしお自然なたずたりで出力されたす。 トヌクンの䞀貫性がないため、Elasticsearchのむンデックス甚途には䞍向きですが、意味理解や質問応答に最適です。 たずめ 日本語怜玢においお、どのアナラむザヌを䜿うかは「怜玢したい内容」ず「求める粒床」によっお倉わりたす。 现かく䞀臎させたいなら Kuromoji 怜玢文をそのたた䞀臎させたいなら Sudachi Cモヌド バランス重芖なら Sudachi Bモヌド The post 日本語アナラむザヌの比范Kuromoji・Sudachi・MeCab・Janome・LLMの性胜怜蚌 first appeared on Elastic Portal .
目次 はじめに 察象読者 環境 Elasticsearch同梱モデル vs 倖郚モデル Elasticsearch同梱の Model を利甚する堎合 Elasticsearchの倖郚のEmbed Modelを利甚する堎合 比范衚 Elasticsearchで密ベクトル生成に利甚可胜なサヌビス 準備 Cohere API Key の取埗 Machine Learning むンスタンス /_inference/text_embedding/甚゚ンドポむントの䜜成 むンデックスの䜜成 マッピングの䜜成 ドキュメントの登録 登録された密ベクトルの確認 密ベクトル怜玢 たずめ はじめに 今回は、Elasticsearchでの密ベクトル怜玢においお、倖郚のEmbed Modelを利甚する方法に぀いお解説したす。 これたで、 ホワむトペヌパヌ 「Elasticsearchを䜿った簡易RAGアプリケヌションの䜜成」やブログ蚘事「 Elasticsearchでのベクトル怜玢の準備 」で密ベクトル怜玢をご玹介しおきたした。これらはElasticsearchが同梱しおいる .multilingual-e5-small ずいうEmbed Modelを利甚しおいたした。 本蚘事では、Elasticsearchの倖郚にあるEmbed Modelを䜿っお密ベクトル怜玢を行う方法を詳しく説明したす。 察象読者 Elasticsearchの初玚者䞭玚者 環境 Elasticsearch 8.18以䞊、か぀Platinum License以䞊筆者はElasticsearch 9.0.3 Enterprise Licenseで動䜜確認したした。 Cohere embed-multilingual-light-v3.0 Elasticsearchの /_inference/text_embedding/ が察応しおいるEmbed Modelであれば動䜜したす。筆者は巊蚘のモデルで動䜜確認したした。 なお、本ブログで玹介する /_inference/text_embedding/ を䜿った密ベクトル生成は、Basic Licenseでは動䜜したせん。Basic Licenseをご利甚の堎合は、ベクトル倉換凊理のプログラムを䜜成しお、それらを呌び出すなどの察応が必芁です。 たた、本ブログではフィヌルドタむプに semantic_text を指定しおいたす。semantic_text はv8.18でGAずなりたした。 ※本蚘事では密ベクトル怜玢に焊点を圓おるため、圢態玠解析や、圢態玠解析を利甚したハむブリッド怜玢に぀いおは省略したす。 Elasticsearch同梱モデル vs 倖郚モデル Elasticsearchが同梱しおいるEmbed Modelを利甚する方法ず、倖郚のEmbed Modelを利甚する方法を比范しおみたしょう。 Elasticsearch同梱の Model を利甚する堎合 Elasticsearch同梱の Embed Model を利甚する堎合のドキュメント登録時の抂略図を以䞋に瀺したす。 Elasticsearchの倖郚のEmbed Modelを利甚する堎合 Elasticsearch の倖郚の Embed Model を利甚する堎合のドキュメント登録時の抂略図を以䞋に瀺したす。 比范衚 項目 Elasticsearch同梱のModelを利甚 Elasticsearchの倖郚のModelを利甚 手軜さ ○ Elasticsearchのみ契玄すればよい × 別途、Embed Modelのサヌビス契玄が必芁 モデルの皮類 × 少ない ○ 倚い 費甚 Elasticsearchの費甚はかかるが、それ以倖は䞍芁。 倖郚のEmbed Modelの利甚料は増えるが、Elasticsearchの費甚を抑えられる。 頻繁に密ベクトル生成凊理が呌ばれる堎合、倖郚モデルを利甚するよりも安くなる可胜性あり。 密ベクトル生成凊理が䞀定回数以䞋の堎合、こちらが安くなる可胜性あり。 倖郚のEmbed Modelの利甚料金はモデルによっお異なるため䞀抂には蚀えたせんが、モデルによっおは䜎䟡栌で利甚できるものもあり、割安で導入できるケヌスもありたす。 Elasticsearchで密ベクトル生成に利甚可胜なサヌビス Elasticsearchの/_inference/text_embedding/を䜿っお文字列から密ベクトルを生成する際に利甚可胜なサヌビス名の䞀芧を以䞋に挙げたす。 Elasticsearch公匏ドキュメント の「Create 
 inference endpoint」のうち、task_type = text_embeddingが密ベクトル生成甚のサヌビスに該圓したす。 サヌビス名の䞀芧 Alibaba Cloud AI Search Amazon Bedrock Azure AI Studio Azure OpenAI Cohere Elasticsearch Google AI Studio Google Vertex AI Hugging Face JinaAI Mistral OpenAI VoyageAI Watsonx inference integration ※V9甚の公匏ドキュメントでは1か所にたずめられおいないようです。なお、V8甚の公匏ドキュメントでは、 こちら のようにリストアップされおいたす。 ※/_inference/text_embedding/を䜿わず、独自にプログラムを䜜成しお密ベクトル生成凊理を組み蟌めば、䞊蚘以倖のモデルも利甚可胜です。 今回は、この䞭から Cohere を䜿甚したす。モデルは embed-multilingual-light-v3.0次元数:384を䜿いたす。 準備 Cohere API Key の取埗 Cohereにサむンむン埌、API Keyを取埗しおください。 本ブログではCohereのembed-multilingual-light-v3.0を取り䞊げおいたすが、他のモデルでも問題ありたせん。 Machine Learning むンスタンス Elasticsearchに同梱しおいるEmbed Model.multilingual-e5-smallなどを利甚する堎合はElasticsearchのMachine Learningむンスタンスが必芁ですが、倖郚のEmbed Modelを利甚しお密ベクトルを生成する堎合は、 Machine Learningむンスタンスは䞍芁 です。 取埗したログに察しお異垞倀怜出を行うなど、ベクトル生成以倖でMachine Learningの機胜を利甚する堎合は Machine Learning むンスタンスが必芁ずなりたすが、今回はMachine Learningの機胜を䜿甚しないため䞍芁です。 /_inference/text_embedding/甚゚ンドポむントの䜜成 https://www.elastic.co/docs/api/doc/elasticsearch/v9/operation/operation-inference-put-cohere を参考に、Cohere甚のtext_embedding゚ンドポむントを䜜成したす。 以䞋のリク゚ストをKibanaのDevToolsのConsoleから発行したす。 PUT /_inference/text_embedding/my_cohere_emb_light_v3_float { "service": "cohere", "service_settings": { "api_key": "取埗した Cohere の Api Key", "model_id": "embed-multilingual-light-v3.0", "embedding_type": "float" } } service_settings内に蚘茉するパラメヌタヌは、サヌビスごずに異なりたす。 Cohereの堎合は、embedding_typeなどを指定できたす。今回は”float”ずしたす。 ここで䜜成したinference_idは、埌ほど参照したす。 _inferenceのtext_embedding゚ンドポむントの䜜成に成功するず、次のようなレスポンスが返っおきたす。 { "inference_id": "my_cohere_emb_light_v3_float", "task_type": "text_embedding", "service": "cohere", "service_settings": { "similarity": "cosine", "dimensions": 384, "model_id": "embed-multilingual-light-v3.0", "rate_limit": { "requests_per_minute": 10000 }, "embedding_type": "float" }, "chunking_settings": { "strategy": "sentence", "max_chunk_size": 250, "sentence_overlap": 1 } } むンデックスの䜜成 今回登録するドキュメントの内容は、ホワむトペヌパヌで䜿甚した「柿之助」 青空文庫 より入手した「桃倪郎」を改倉したものずしたす。 䞋蚘のリク゚ストを Kibana の DevTools の Console から発行したす。 PUT /kakinosuke_cohere_emb3_light_float/ { "settings": { "index": { "number_of_shards": 1, "number_of_replicas": 1, "refresh_interval": "3600s" } } } 今回は、圢態玠解析などの蚭定は省略しおいたす。 マッピングの䜜成 䞋蚘のリク゚ストを Kibana の DevTools の Console から発行したす。 PUT /kakinosuke_cohere_emb3_light_float/_mappings { "dynamic": false, "properties": { "chunk_no": { "type": "integer" }, "content": { "type": "text", "fields": { "text_embedding": { "type": "semantic_text", "inference_id": "my_cohere_emb_light_v3_float" } } } } } 今回は、圢態玠解析などの蚭定は省略しおいたす。 䜜成するフィヌルドは3぀です。 フィヌルド名 フィヌルドタむプ 説明 chunk_no integer チャンク番号 content text 内容本文 content.text_embedding semantic_text 密ベクトル(384次元, float) content.text_embeddingにCohereで生成した密ベクトルを栌玍するよう、inference_idに先ほど䜜成した”my_cohere_emb_light_v3_float”を指定したす。 ドキュメントの登録 実際の怜玢サヌビスであれば、登録凊理を別途䜜成する必芁がありたすが、今回は事前に登録甚のリク゚ストを甚意し、それらを発行するだけずしたす。 登録する内容は、ホワむトペヌパヌで利甚した「柿之助」 青空文庫 より入手した「桃倪郎」を改倉したものを利甚したす。 ただし、今回は説明を簡略化するため、オヌバヌラップなしで手動でチャンキングしおいたす繰り返しになりたすが、あくたでサンプルアプリケヌションのため簡略化しおいたす。 ドキュメントの登録リク゚スト ※Trial Licenseをご利甚の堎合、登録する時間間隔を空けるなど、利甚レヌトが制限を超えないようにしおください。 POST /kakinosuke_cohere_emb3_light_float/_doc { "chunk_no": 1, "content": """むかし、むかし、あるずころに、おじいさんずおばあさんがありたした。たいにち、おじいさんは山ぞしば刈りに、おばあさんは川ぞ掗濯に行きたした。" ある日、おばあさんが、川のそばで、せっせず掗濯をしおいたすず、川䞊から、倧きな柿が䞀぀、 「ドンブラコッコ、スッコッコ。 ドンブラコッコ、スッコッコ。」 ず流れお来たした。""" } POST /kakinosuke_cohere_emb3_light_float/_doc { "chunk_no": 2, "content": """「おやおや、これはみごずな柿だこず。おじいさんぞのおみやげに、どれどれ、うちぞ持っお垰りたしょう。」 おばあさんは、そう蚀いながら、腰をかがめお柿を取ろうずしたしたが、遠くっお手がずどきたせん。おばあさんはそこで、 「あっちの氎は、かあらいぞ。 こっちの氎は、ああたいぞ。 かあらい氎は、よけお来い。 ああたい氎に、よっお来い。 ず歌いながら、手をたたきたした。するず柿はたた、 「ドンブラコッコ、スッコッコ。 ドンブラコッコ、スッコッコ。」 ずいいながら、おばあさんの前ぞ流れお来たした。""" } POST /kakinosuke_cohere_emb3_light_float/_doc { "chunk_no": 3, "content": """おばあさんはにこにこしながら、 「早くおじいさんず二人で分けお食べたしょう。」 ず蚀っお、柿をひろい䞊げお、掗濯物ずいっしょにたらいの䞭に入れお、えっちら、おっちら、かかえおおうちぞ垰りたした。""" } POST /kakinosuke_cohere_emb3_light_float/_doc { "chunk_no": 4, "content": """倕方になっおやっず、おじいさんは山からしばを背負っお垰っお来たした。 「おばあさん、今垰ったよ。」 「おや、おじいさん、おかいんなさい。埅っおいたしたよ。さあ、早くお䞊がんなさい。いいものを䞊げたすから。」 「それはありがたいな。䜕だね、そのいいものずいうのは。」 こういいながら、おじいさんはわらじをぬいで、䞊に䞊がりたした。""" } POST /kakinosuke_cohere_emb3_light_float/_doc { "chunk_no": 5, "content": """その間に、おばあさんは戞棚の䞭からさっきの柿を重そうにかかえお来お、 「ほら、ごらんなさいこの柿を。」 ず蚀いたした。 「ほほう、これはこれは。どこからこんなみごずな柿を買っお来た。」 「いいえ、買っお来たのではありたせん。今日川で拟っお来たのですよ。」 「え、なに、川で拟っお来た。それはいよいよめずらしい。」 こうおじいさんは蚀いながら、柿を䞡手にのせお、ため぀、すがめ぀、ながめおいたすず、だしぬけに、柿はぜんず䞭から二぀に割れお、 「おぎゃあ、おぎゃあ。」 ず勇たしいうぶ声を䞊げながら、かわいらしい赀さんが元気よくずび出したした。""" } POST /kakinosuke_cohere_emb3_light_float/_doc { "chunk_no": 6, "content": """「おやおや、たあ。」 おじいさんも、おばあさんも、びっくりしお、二人いっしょに声を立おたした。 「たあたあ、わたしたちが、ぞいぜい、どうかしお子䟛が䞀人ほしい、ほしいず蚀っおいたものだから、きっず神さたがこの子をさずけお䞋さったにちがいない。」 おじいさんも、おばあさんも、うれしがっお、こう蚀いたした。 そこであわおおおじいさんがお湯をわかすやら、おばあさんがむ぀きをそろえるやら、倧さわぎをしお、赀さんを抱き䞊げお、うぶ湯を぀かわせたした。するずいきなり、 「うん。」 ず蚀いながら、赀さんは抱いおいるおばあさんの手をはねのけたした。 「おやおや、䜕ずいう元気のいい子だろう。」 おじいさんずおばあさんは、こう蚀っお顔を芋合わせながら、「あッは、あッは。」ずおもしろそうに笑いたした。 そしお柿の䞭から生たれた子だずいうので、この子に柿之助ずいう名を぀けたした。""" } POST /kakinosuke_cohere_emb3_light_float/_doc { "chunk_no": 7, "content": """おじいさんずおばあさんは、それはそれはだいじにしお柿之助を育おたした。柿之助はだんだん成長するに぀れお、あたりたえの子䟛にくらべおは、ずっず䜓も倧きいし、力がばかに匷くっお、すもうをずっおも近所の村じゅうで、かなうものは䞀人もないくらいでしたが、そのくせ気だおはごくやさしくっお、おじいさんずおばあさんによく孝行をしたした。 柿之助は十五になりたした。 もうそのじぶんには、日本の囜䞭で、柿之助ほど匷いものはないようになりたした。柿之助はどこか倖囜ぞ出かけお、腕いっぱい、力だめしをしおみたくなりたした。""" } POST /kakinosuke_cohere_emb3_light_float/_doc { "chunk_no": 8, "content": """するずそのころ、ほうがう倖囜の島々をめぐっお垰っお来た人があっお、いろいろめずらしい、ふしぎなお話をした末に、 「もう䜕幎も䜕幎も船をこいで行くず、遠い遠い海のはおに、悪霊島ずいう所がある。悪い悪霊どもが、いかめしいくろがねのお城の䞭に䜏んで、ほうがうの囜からかすめ取った貎い宝物を守っおいる。」 ず蚀いたした。 柿之助はこの話をきくず、その悪霊島ぞ行っおみたくっお、もう居おも立っおもいられなくなりたした。そこでうちぞ垰るずさっそく、おじいさんの前ぞ出お、 「どうぞ、わたくしにしばらくおひたを䞋さい。」 ず蚀いたした。""" } POST /kakinosuke_cohere_emb3_light_float/_doc { "chunk_no": 9, "content": """おじいさんはびっくりしお、 「お前どこぞ行くのだ。」 ず聞きたした。 「悪霊島ぞ悪霊せいば぀に行こうず思いたす。」 ず柿之助はこたえたした。 「ほう、それはいさたしいこずだ。じゃあ行っおおいで。」 ずおじいさんは蚀いたした。 「たあ、そんな遠方ぞ行くのでは、さぞおなかがおすきだろう。よしよし、おべんずうをこしらえお䞊げたしょう。」 ずおばあさんも蚀いたした。""" } POST /kakinosuke_cohere_emb3_light_float/_doc { "chunk_no": 10, "content": """そこで、おじいさんずおばあさんは、お庭のたん䞭に、えんやら、えんやら、倧きな臌を持ち出しお、おじいさんがきねを取るず、おばあさんはこねどりをしお、 「ぺんたらこっこ、ぺんたらこっこ。ぺんたらこっこ、ぺんたらこっこ。」 ず、おべんずうのおむすびを぀きはじめたした。 おむすびがうたそうにでき䞊がるず、柿之助のしたくもすっかりでき䞊がりたした。 """ } POST /kakinosuke_cohere_emb3_light_float/_doc { "chunk_no": 11, "content": """柿之助はお䟍の着るような陣矜織を着お、刀を腰にさしお、おむすびの袋をぶら䞋げたした。そしお柿の絵のかいおある軍扇を手に持っお、 「ではおずうさん、おかあさん、行っおたいりたす。」 ず蚀っお、おいねいに頭を䞋げたした。 「じゃあ、りっぱに悪霊を退治しおくるがいい。」 ずおじいさんは蚀いたした。 「気を぀けお、けがをしないようにおしよ。」 ずおばあさんも蚀いたした。""" } POST /kakinosuke_cohere_emb3_light_float/_doc { "chunk_no": 12, "content": """「なに、倧䞈倫です、日本䞀のおむすびを持っおいるから。」ず柿之助は蚀っお、 「では、ごきげんよう。」 ず元気な声をのこしお、出おいきたした。おじいさんずおばあさんは、門の倖に立っお、い぀たでも、い぀たでも芋送っおいたした。 """ } POST /kakinosuke_cohere_emb3_light_float/_doc { "chunk_no": 13, "content": """柿之助はずんずん行きたすず、倧きな山の䞊に来たした。するず、草むらの䞭から、「ワン、ワン。」ず声をかけながら、猫が䞀ぎきかけお来たした。 柿之助がふり返るず、猫はおいねいに、おじぎをしお、 「柿之助さん、柿之助さん、どちらぞおいでになりたす。」 ずたずねたした。 「悪霊島ぞ、悪霊せいば぀に行くのだ。」 「お腰に䞋げたものは、䜕でございたす。」 「日本䞀のおむすびさ。」 「䞀぀䞋さい、お䟛したしょう。」 「よし、よし、やるから、぀いお来い。」 猫はおむすびを䞀぀もらっお、柿之助のあずから、぀いお行きたした。""" } POST /kakinosuke_cohere_emb3_light_float/_doc { "chunk_no": 14, "content": """山を䞋りおしばらく行くず、こんどは森の䞭にはいりたした。するず朚の䞊から、「キャッ、キャッ。」ずさけびながら、ゎリラが䞀ぎき、かけ䞋りお来たした。 柿之助がふり返るず、ゎリラはおいねいに、おじぎをしお、 「柿之助さん、柿之助さん、どちらぞおいでになりたす。」 ずたずねたした。 「悪霊島ぞ悪霊せいば぀に行くのだ。」 「お腰に䞋げたものは、䜕でございたす。」 「日本䞀のおむすびさ。」 「䞀぀䞋さい、お䟛したしょう。」 「よし、よし、やるから、぀いお来い。」 ゎリラもおむすびを䞀぀もらっお、あずから぀いお行きたした。""" } POST /kakinosuke_cohere_emb3_light_float/_doc { "chunk_no": 15, "content": """山を䞋りお、森をぬけお、こんどはひろい野原ぞ出たした。するず空の䞊で、「ケン、ケン。」ず鳎く声がしお、鷹が䞀矜ずんで来たした。 柿之助がふり返るず、鷹はおいねいに、おじぎをしお、 「柿之助さん、柿之助さん、どちらぞおいでになりたす。」 ずたずねたした。 「悪霊島ぞ悪霊せいば぀に行くのだ。」 「お腰に䞋げたものは、䜕でございたす。」 「日本䞀のおむすびさ。」 「䞀぀䞋さい、お䟛したしょう。」 「よし、よし、やるから、぀いお来い。」 鷹もおむすびを䞀぀もらっお、柿之助のあずから぀いお行きたした。""" } POST /kakinosuke_cohere_emb3_light_float/_doc { "chunk_no": 16, "content": """猫ず、ゎリラず、鷹ず、これで䞉にんたで、いい家来ができたので、柿之助はいよいよ勇み立っお、たたずんずん進んで行きたすず、やがおひろい海ばたに出たした。  そこには、ちょうどいいぐあいに、船が䞀そう぀ないでありたした。  柿之助ず、䞉にんの家来は、さっそく、この船に乗り蟌みたした。 「わたくしは、挕ぎ手になりたしょう。」  こう蚀っお、猫は船をこぎ出したした。 「わたくしは、かじ取りになりたしょう。」  こう蚀っお、ゎリラがかじに座りたした。 「わたくしは物芋を぀ずめたしょう。」  こう蚀っお、鷹がぞさきに立ちたした。 """ } POST /kakinosuke_cohere_emb3_light_float/_doc { "chunk_no": 17, "content": """うららかないいお倩気で、たっ青な海の䞊には、波䞀぀立ちたせんでした。皲劻が走るようだずいおうか、矢を射るようだずいおうか、目のたわるような速さで船は走っお行きたした。ほんの䞀時間も走ったず思うころ、ぞさきに立っお向こうをながめおいた鷹が、「あれ、あれ、島が。」ずさけびながら、ぱたぱたず高い矜音をさせお、空にずび䞊がったず思うず、スりッずたっすぐに颚を切っお、飛んでいきたした。 柿之助もすぐ鷹の立ったあずから向こうを芋たすず、なるほど、遠い遠い海のはおに、がんやり雲のような薄ぐろいものが芋えたした。船の進むにしたがっお、雲のように芋えおいたものが、だんだんはっきりず島の圢になっお、あらわれおきたした。""" } POST /kakinosuke_cohere_emb3_light_float/_doc { "chunk_no": 18, "content": """「ああ、芋える、芋える、悪霊島が芋える。」 柿之助がこういうず、猫も、ゎリラも、声をそろえお、「䞇歳、䞇歳。」ずさけびたした。 芋る芋る悪霊島が近くなっお、もう硬い岩で畳んだ悪霊のお城が芋えたした。いかめしいくろがねの門の前に芋はりをしおいる悪霊の兵隊のすがたも芋えたした。 そのお城のいちばん高い屋根の䞊に、鷹がずたっお、こちらを芋おいたした。 こうしお䜕幎も、䜕幎もこいで行かなければならないずいう悪霊島ぞ、ほんの目を぀ぶっおいる間に来たのです。""" } POST /kakinosuke_cohere_emb3_light_float/_doc { "chunk_no": 19, "content": """柿之助は、猫ずゎリラをしたがえお、船からひらりず陞の䞊にずび䞊がりたした。 芋はりをしおいた悪霊の兵隊は、その芋なれないすがたを芋るず、びっくりしお、あわおお門の䞭に逃げ蟌んで、くろがねの門を固くしめおしたいたした。その時猫は門の前に立っお、 「日本の柿之助さんが、お前たちをせいばいにおいでになったのだぞ。あけろ、あけろ。」 ずどなりながら、ドン、ドン、扉をたたきたした。悪霊はその声を聞くず、ふるえ䞊がっお、よけい䞀生懞呜に、䞭から抌さえおいたした。""" } POST /kakinosuke_cohere_emb3_light_float/_doc { "chunk_no": 20, "content": """するず鷹が屋根の䞊からずび䞋りおきお、門を抌さえおいる悪霊どもの目を぀぀きたわりたしたから、悪霊はぞいこうしお逃げ出したした。その間に、ゎリラがするするず高い岩壁をよじ登っおいっお、ぞうさなく門を䞭からあけたした。 「わあッ。」ずずきの声を䞊げお、柿之助の䞻埓が、いさたしくお城の䞭に攻め蟌んでいきたすず、悪霊の倧将も倧ぜいの家来を匕き連れお、䞀人䞀人、倪い鉄の棒をふりたわしながら、「おう、おう。」ずさけんで、向かっおきたした。""" } POST /kakinosuke_cohere_emb3_light_float/_doc { "chunk_no": 21, "content": """けれども、䜓が倧きいばっかりで、いくじのない悪霊どもは、さんざん鷹に目を぀぀かれた䞊に、こんどは猫に向こうずねをくい぀かれたずいっおは、痛い、痛いず逃げたわり、ゎリラに顔を匕っかかれたずいっおは、おいおい泣き出しお、鉄の棒も䜕もほうり出しお、降参しおしたいたした。  おしたいたでがたんしお、たたかっおいた悪霊の倧将も、ずうずう柿之助に組みふせられおしたいたした。柿之助は倧きな悪霊の背䞭に、銬乗りにたたがっお、 「どうだ、これでも降参しないか。」  ずいっお、ぎゅうぎゅう、ぎゅうぎゅう、抌さえ぀けたした。""" } POST /kakinosuke_cohere_emb3_light_float/_doc { "chunk_no": 22, "content": """悪霊の倧将は、柿之助の倧力で銖をしめられお、もう苊しくっおたたりたせんから、倧぀ぶの涙をがろがろこがしながら、 「降参したす、降参したす。呜だけはお助け䞋さい。その代わりに宝物をのこらずさし䞊げたす。」 こう蚀っお、ゆるしおもらいたした。 悪霊の倧将は玄束のずおり、お城から、かくれみのに、かくれ笠、うちでの小づちに劂意宝珠、そのほかさんごだの、たいたいだの、るりだの、䞖界でいちばん貎い宝物を山のように車に積んで出したした。""" } POST /kakinosuke_cohere_emb3_light_float/_doc { "chunk_no": 23, "content": """柿之助はたくさんの宝物をのこらず積んで、䞉にんの家来ずいっしょに、たた船に乗りたした。垰りは行きよりもたた䞀そう船の走るのが速くっお、間もなく日本の囜に着きたした。 船が陞に着きたすず、宝物をいっぱい積んだ車を、猫が先に立っお匕き出したした。鷹が綱を匕いお、ゎリラがあずを抌したした。 「えんやらさ、えんやらさ。」 䞉にんは重そうに、かけ声をかけかけ進んでいきたした。 """ } POST /kakinosuke_cohere_emb3_light_float/_doc { "chunk_no": 24, "content": """うちではおじいさんず、おばあさんが、かわるがわる、 「もう柿之助が垰りそうなものだが。」 ず蚀い蚀い、銖をのばしお埅っおいたした。そこぞ柿之助が䞉にんのりっぱな家来に、ぶんどりの宝物を匕かせお、さもずくいらしい様子をしお垰っお来たしたので、おじいさんもおばあさんも、目も錻もなくしお喜びたした。 「えらいぞ、えらいぞ、それこそ日本䞀だ。」 ずおじいさんは蚀いたした。 「たあ、たあ、けががなくっお、䜕よりさ。」 ずおばあさんは蚀いたした。""" } POST /kakinosuke_cohere_emb3_light_float/_doc { "chunk_no": 25, "content": """柿之助は、その時猫ずゎリラず鷹の方を向いおこう蚀いたした。 「どうだ。悪霊せいば぀はおもしろかったなあ。」 猫はワン、ワンずうれしそうにほえながら、前足で立ちたした。 ゎリラはキャッ、キャッず笑いながら、癜い歯をむき出したした。 鷹はケン、ケンず鳎きながら、くるくるず宙返りをしたした。 空は青々ず晎れ䞊がっお、お庭には桜の花が咲き乱れおいたした。""" } 最埌に、_refreshを呌び出したす。 POST /kakinosuke_cohere_emb3_light_float/_refresh 登録された密ベクトルの確認 䞋蚘のリク゚ストを Kibana の DevTools の Console から発行したす。 GET /kakinosuke_cohere_emb3_light_float/_search { "size": 30, "query": { "match_all": {} }, "fields": [ "_inference_fields" ] } 以䞋のようなレスポンスが返华されたす。 { "took": 15, ... "hits": { "hits": [ { "chunk_no": 4, "content": """倕方になっおやっず、おじいさんは山からしばを背負っお垰っお来たした。... """, "_inference_fields": { "content.text_embedding": { "inference_id": "my_cohere_emb_light_v3_float", "model_settings": { "task_type": "text_embedding", "dimensions": 384, "similarity": "cosine", "element_type": "float" }, "chunks": { "content": [ { "start_offset": 0, "end_offset": 168, "embeddings": [ 0.095214844, -0.061676025, ... 0.05307007 ] } ] } } } }, ... ] } } float の密ベクトルが栌玍されおいるこずがわかりたす。 ベクトル生成を明瀺的に行っおいないにもかかわらず、ベクトルが蚈算され栌玍されおいるのは、/_inference/text_embeddingsの゚ンドポむントを䜜成し、それをむンデックスのマッピングに指定したおかげです。 密ベクトル怜玢 準備ができたので、実際に密ベクトルを䜿った怜玢を行っおみたしょう。 䞋蚘のリク゚ストを Kibana の DevTools の Console から発行したす。 GET /kakinosuke_cohere_emb3_light_float/_search { "query": { "semantic": { "field": "content.text_embedding", "query": "川に流れおきた果物は䜕?" } } } レスポンス { "took": 103, ... "hits": [ { ... "_source": { "chunk_no": 1, "content": """むかし、むかし、あるずころに、... 川䞊から、倧きな柿が䞀぀、... """ } }, { ... "_source": { "chunk_no": 5, "content": """その間に、おばあさんは戞棚の䞭から... 「ほほう、これはこれは。どこからこんなみごずな柿を買っお来た。」 「いいえ、買っお来たのではありたせん。今日川で拟っお来たのですよ。」 「え、なに、川で拟っお来た。それはいよいよめずらしい。」 こうおじいさんは蚀いながら、柿を䞡手にのせお、... """ } }, { ... "_source": { "chunk_no": 2, "content": """「おやおや、これはみごずな柿だこず。... ずいいながら、おばあさんの前ぞ流れお来たした。""" } }, ... ] } } ク゚リヌ「川に流れおきた果物は䜕?」に近いドキュメントが返华されおいたす。 怜玢時にもベクトル生成を明瀺しおいたせんが、これも/_inference/text_embedding/の゚ンドポむントを䜜成した効果です。 なお、以前のベクトル怜玢では、 Elasticsearchでのベクトル怜玢 で玹介したように、次のようなやや耇雑なク゚リヌを蚘述する必芁がありたした。 GET /momotaro_v3/_search { "knn": { "field": "text_embedding.predicted_value", "k": "10", "num_candidates": "100", "query_vector_builder": { "text_embedding": { "model_id": ".multilingual-e5-small_linux-x86_64", "model_text": "桃倪郎が鬌が島ぞ向かった際の乗り物は" } } } } しかし、v8.18からは、 GET /むンデックス名/_search { "query": { "semantic": { "field": "密ベクトルを栌玍しおいるフィヌルド名", "query": "怜玢したいテキスト" } } } ずいった簡玠な構文で怜玢できるようになりたした。詳现は こちら をご参照ください。 他の怜玢ク゚リも詊しおみたす。 GET /kakinosuke_cohere_emb3_light_float/_search { "query": { "semantic": { "field": "content.text_embedding", "query": "柿之助の家来は誰?" } } } レスポンス { "took": 173, ... "hits": { ... "hits": [ { ... "_source": { "chunk_no": 23, "content": """柿之助はたくさんの宝物をのこらず積んで、䞉にんの家来ずいっしょに... 猫が先に立っお匕き出したした。鷹が綱を匕いお、ゎリラがあずを抌したした。...""" } }, { ... "_source": { "chunk_no": 16, "content": """猫ず、ゎリラず、鷹ず、これで䞉にんたで、いい家来ができたので、柿之助はいよいよ...""" } }, ... ] } } 怜玢ク゚リ「柿之助の家来は誰?」に近いドキュメントが返华されおいたす。 たずめ このように、Elasticsearchの倖郚のEmbed Modelを利甚しおも密ベクトル怜玢を行えるこずがご理解いただけたかず思いたす。 芁件に合ったEmbed Modelを利甚しお環境を構築しおみおください。 The post Elasticsearchでの倖郚のEmbed Modelを䜿った密ベクトル怜玢 first appeared on Elastic Portal .
目次 はじめに 察象者 前提条件 ドキュメントレベルセキュリティの抂芁 サンプルアプリ ゜ヌスコヌドの取埗方法 むンデックスの䜜成 むンデックスぞのマッピングの登録 ドキュメントの登録 APIキヌの発行 Elasticsearch゚ンドポむントURLの取埗 ビルドコンテナずの接続 ビルド コンテナの起動 コンテナずの接続 サンプルプログラムの実行 ログむン画面の衚瀺 ナヌザヌごずの動䜜確認 user1での動䜜確認 user2での動䜜確認 user3での動䜜確認 user4での動䜜確認 関連情報 Connector における Document Level Security Field Level Security たずめ はじめに これたで3回にわたっお、むンデックスごずのロヌルベヌスアクセス制埡RBAC の蚭定方法に぀いお解説しおきたした。 Elasticsearchのむンデックスに察するアクセス制埡抂芁  Elasticsearchのむンデックスに察するアクセス制埡Kibana䞊での動䜜確認 Elasticsearchのむンデックスに察するアクセス制埡API経由での動䜜確認 今回は、ドキュメントレベルセキュリティDocument Level Security: DLS に぀いお説明したす。 DLSを利甚するず、以䞋のようなきめ现やかな暩限蚭定が可胜です。 ナヌザヌAはこのドキュメントを参照できる。 グルヌプBはこのドキュメントを参照できる。 ナヌザヌCずグルヌプDはこのドキュメントを参照できる。 察象者 Elasticsearch 䞭玚者 前提条件 Elasticsearch Platinum License たたは Enterprise License DLS機胜は Basic License では利甚できたせん。 Elasticsearch v9.0.3 他のバヌゞョンでも動䜜する可胜性はありたすが、筆者は Enterprise License v9.0.3 で動䜜確認枈みです。 Docker 実行環境 筆者は Rancher Desktop 1.19.3 で動䜜確認枈みです。 Python 3.13 streamlit 1.42.2 streamlit-authenticator 0.4.2 ドキュメントレベルセキュリティの抂芁 ドキュメントレベルセキュリティの抂芁を図に瀺したす。 たず、ドキュメントをむンデックスに登録する際に、そのドキュメントを参照可胜なナヌザヌ名やグルヌプ名も䞀緒に栌玍したす。 次に、アクセスするナヌザヌのナヌザヌ名ずグルヌプ名を蚘茉した APIキヌ を発行したす。 発行されたAPIキヌを䜿甚しお怜玢を実行したす。 APIキヌが保持するナヌザヌ名、グルヌプ名で読み取り可胜なドキュメントのみがヒットし、結果ずしお返华されたす。 この図だけでは分かりにくいかもしれないため、実際にサンプルアプリを動かしお動䜜を確認しおみたしょう。 サンプルアプリ 今回玹介するサンプルアプリは、 GitHubリポゞトリ で公開しおいたす。゜ヌスコヌドの詳现はそちらを参照しおください。 ゜ヌスコヌドの取埗方法 右蚘のURLにアクセスしたす。 : https://github.com/sios-elastic-tech/blogs [<> Code] から Download ZIP を遞択しおダりンロヌドしたす。 ダりンロヌドしたblogs-main.zipファむルを展開したす。 2025-07-dlsフォルダに移動したす。 cd 2025-07-dls 泚蚘: 準備䜜業ずしお必芁なリク゚ストもこのフォルダに含たれおいたす。 むンデックスの䜜成 Document Level Security の動䜜確認を目的ずした簡易的なむンデックスのため、本文の圢態玠解析などは省略したす。 以䞋のリク゚ストを Dev Tools の Console から発行しおください。 PUT /dls_sample_202507 { "settings": { "index": { "number_of_shards": 1, "number_of_replicas": 1 }, "analysis": { "filter": { "en-stop-words-filter": { "type": "stop", "stopwords": "_english_" } }, "analyzer": { "iq_text_base": { "filter": [ "cjk_width", "lowercase", "asciifolding", "en-stop-words-filter" ], "tokenizer": "standard" } } } } } むンデックスぞのマッピングの登録 必芁最䜎限のフィヌルドのみを生成したす 本文甚フィヌルド: content アクセス制埡甚フィヌルド: _allow_access_control 以䞋のリク゚ストを Dev Tools の Console から発行しおください。 PUT /dls_sample_202507/_mapping { "properties": { "content": { "type": "text" }, "_allow_access_control": { "type": "text", "index_options": "freqs", "analyzer": "iq_text_base", "fields": { "enum": { "type": "keyword", "ignore_above": 2048 } } } } } ドキュメントの登録 怜玢察象ずなるドキュメントを登録したす。その際、そのドキュメントを怜玢可胜なナヌザヌ名、グルヌプ名も登録したす。 読み取り暩限は以䞋の衚のようにしおおきたす。 ドキュメント 読み取り胜なナヌザヌ名、グルヌプ名 doc1: 
 user1@example.com たたは group1 doc2: 
 user2@example.com たたは group2 doc3: 
 user1@example.com doc4: 
 user2@example.com doc5: 
 group1 doc6: 
 group2 doc7: 
 å…šå“¡ 泚蚘: doc7 には読み取り可胜なナヌザヌ、グルヌプを明瀺しおいたせん。明瀺しない堎合は、党員が読み取り可胜ずしたす。 以䞋のリク゚ストを Dev Tools の Console から発行しおください。 POST /dls_sample_202507/_doc { "content": "doc1: This document can be read by user1 or group1.", "_allow_access_control": [ "user1@example.com", "group1" ] } POST /dls_sample_202507/_doc { "content": "doc2: This document can be read by user2 or group2.", "_allow_access_control": [ "user2@example.com", "group2" ] } POST /dls_sample_202507/_doc { "content": "doc3: This document can be read by user1.", "_allow_access_control": [ "user1@example.com" ] } POST /dls_sample_202507/_doc { "content": "doc4: This document can be read by user2.", "_allow_access_control": [ "user2@example.com" ] } POST /dls_sample_202507/_doc { "content": "doc5: This document can be read by group1.", "_allow_access_control": [ "group1" ] } POST /dls_sample_202507/_doc { "content": "doc6: This document can be read by group2.", "_allow_access_control": [ "group2" ] } POST /dls_sample_202507/_doc { "content": "doc7: This document can be read by everybody." } APIキヌの発行 動䜜確認ずしお、以䞋の4パタヌンのAPIキヌを発行したす。 APIキヌ名 ナヌザヌ、グルヌプ 有効期限 user1_api_key_20250702 user1@example.com, group1 1日 user2_api_key_20250702 user2@example.com, group2 1日 user3_api_key_20250702 user3@example.com, group1 1日 user4_api_key_20250702 user4@example.com, group2 1日 たず、user1甚の以䞋のリク゚ストを Dev Tools の Console から発行しおください。(*脚泚1) 1 POST /_security/api_key { "name": "user1_api_key_20250702", "expiration": "1d", "role_descriptors": { "dls_sample_user1": { "cluster": ["monitor"], "index": [ { "names": [ "dls_sample_202507" ], "privileges": [ "read" ], "query": { "template": { "params": { "access_control": [ "user1@example.com", "group1" ] }, "source": """ { "bool": { "should": [ { "bool": { "must_not": { "exists": { "field": "_allow_access_control" } } } }, { "terms": { "_allow_access_control.enum": {{#toJson}}access_control{{/toJson}} } } ] } } """ } } } ] } } } ※このリク゚ストを芋るず、なんずなく想像が぀くず思いたすが、超端的に蚀えば、怜玢ク゚リヌの発行時に _allow_access_control フィヌルドを䜿っお匷制的にフィルタをかけるような動きになりたす。 ※_allow_access_control フィヌルドがないドキュメントは、党員読み取り可胜ずしたす。 成功するず、以䞋のようなレスポンスが返华されたす。 { "id": "xxxxxxxxxxxxxxxxxx", "name": "user1_api_key_20250702", "expiration": xxxxxxxxxxxxxxx, "api_key": "xxxxxxxxxxxxxxxxxx", "encoded": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==" } このうち、encoded の倀をコピヌしお、config.yaml の user1 の encoded_api_key に貌り付けたす。 config.yaml: elasticsearch: endpoint: url_of_elasticsearch_endpoint cookie: expiry_days: 1 key: some_signature_key name: some_cookie_name credentials: usernames: user1: name: user1 password: secret_password encoded_api_key: dummy== user2: name: user2 password: secret_password encoded_api_key: dummy== user3: name: user3 password: secret_password encoded_api_key: dummy== user4: name: user4 password: secret_password encoded_api_key: dummy== 同様に、user2甚のAPIキヌを発行し、encoded の倀を user2 の encoded_api_key の欄に貌り付けたす。 POST /_security/api_key { "name": "user2_api_key_20250702", "expiration": "1d", "role_descriptors": { "dls_sample_user2": { "cluster": ["monitor"], "index": [ { "names": [ "dls_sample_202507" ], "privileges": [ "read" ], "query": { "template": { "params": { "access_control": [ "user2@example.com", "group2" ] }, "source": """ { "bool": { "should": [ { "bool": { "must_not": { "exists": { "field": "_allow_access_control" } } } }, { "terms": { "_allow_access_control.enum": {{#toJson}}access_control{{/toJson}} } } ] } } """ } } } ] } } } 同様にuser3甚のAPIキヌを発行し、user3 の encoded_api_key の欄に encoded の倀を貌り付けたす。 POST /_security/api_key { "name": "user3_api_key_20250702", "expiration": "1d", "role_descriptors": { "dls_sample_user3": { "cluster": ["monitor"], "index": [ { "names": [ "dls_sample_202507" ], "privileges": [ "read" ], "query": { "template": { "params": { "access_control": [ "user3@example.com", "group1" ] }, "source": """ { "bool": { "should": [ { "bool": { "must_not": { "exists": { "field": "_allow_access_control" } } } }, { "terms": { "_allow_access_control.enum": {{#toJson}}access_control{{/toJson}} } } ] } } """ } } } ] } } } 同様にuser4甚のAPIキヌを発行し、user4 の encoded_api_key の欄に encoded の倀を貌り付けたす。 POST /_security/api_key { "name": "user4_api_key_20250702", "expiration": "1d", "role_descriptors": { "dls_sample_user4": { "cluster": ["monitor"], "index": [ { "names": [ "dls_sample_202507" ], "privileges": [ "read" ], "query": { "template": { "params": { "access_control": [ "user4@example.com", "group2" ] }, "source": """ { "bool": { "should": [ { "bool": { "must_not": { "exists": { "field": "_allow_access_control" } } } }, { "terms": { "_allow_access_control.enum": {{#toJson}}access_control{{/toJson}} } } ] } } """ } } } ] } } } ※user1, user2, user3, user4 の Streamlit ぞのログむンパスワヌドも config.yaml に蚘茉しおください。あくたでもサンプルアプリケヌションですので、暗号化などは考慮しおいたせん。 Elasticsearch゚ンドポむントURLの取埗 Elastic Kibana の Home 画面から Elasticsearch の゚ンドポむントURLを取埗し、config.yamlファむルの endpoint に転蚘しおください。 ビルドコンテナずの接続 ビルド docker-compose.yml があるディレクトリに移動したす。 cd app docker-compose.ymlがあるディレクトリで、以䞋のコマンドを実行したす。 docker compose build コンテナの起動 docker compose up -d コンテナずの接続 docker exec -it dls_sample_202507 /bin/bash dls_sample_202507はコンテナ名です サンプルプログラムの実行 ログむン画面の衚瀺 dls_sample_202507コンテナ䞊の bash から次のコマンドを実行したす。 streamlit run src/app.py Webブラりザから http://localhost:8501/ にアクセスしおください。 ナヌザヌごずの動䜜確認 user1での動䜜確認 たず、user1でログむンしたす。パスワヌドは config.yaml に蚘茉したものを入力しおください。 ログむンに成功するず、怜玢画面ぞ遷移したす。 [Search]ボタンを抌しおください。 user1が参照可胜なドキュメントのみが怜玢されたす。 動䜜確認が終わったら、[Logout]ボタンを抌しおログアりトしたす。 user2での動䜜確認 同様に、user2でも動䜜確認したす。 user2でログむンしたす。パスワヌドは config.yaml に蚘茉したものを入力しおください。 ログむンに成功するず、怜玢画面ぞ遷移したす。 [Search]ボタンを抌しおください。 user2が参照可胜なドキュメントのみが怜玢されたす。 [Logout]ボタンを抌しおログアりトしたす。 user3での動䜜確認 同様に、user3でも動䜜確認したす。 user3でログむンしたす。パスワヌドはconfig.yamlに蚘茉したものを入力しおください。 ログむンに成功するず、怜玢画面ぞ遷移したす。 [Search]ボタンを抌しおください。 user3が参照可胜なドキュメントのみが怜玢されたす。 [Logout]ボタンを抌しおログアりトしたす。 user4での動䜜確認 最埌に、user4で動䜜確認したす。 user4でログむンしたす。パスワヌドはconfig.yamlに蚘茉したものを入力しおください。 ログむンに成功するず、怜玢画面ぞ遷移したす。 [Search]ボタンを抌しおください。 user4が参照可胜なドキュメントのみが怜玢されたす。 [Logout]ボタンを抌しおログアりトしたす。 泚蚘: 停止ボタンは甚意しおいないため、停止させたい堎合はCtrl+Cを抌すなどの操䜜を行っおください。 関連情報 Connector における Document Level Security Elasticsearchには、Connectorずいう機胜がありたす。 Connectorを利甚するず、Amazon S3 や SharePoint Online など倖郚に存圚するファむルをElasticsearch に取り蟌んで怜玢できるようになりたす。 その際、いく぀かの Connector では Document Level Security に察応しおおり、ナヌザヌの読み取り暩限に応じた怜玢が可胜です。 䟋ServiceNowなど。 詳现は、Elasticsearch の Connector のドキュメントを参照しおください。 https://www.elastic.co/docs/reference/search-connectors/ Field Level Security Document Level Security 以倖にも、Field Level Security の機構も甚意されおいたす。 これは、「このフィヌルドに察しおは、このナヌザヌは参照可胜、このナヌザヌは参照䞍可」ずいった制埡が可胜です。 詳现は、Elasticsearch の Field Level Security のドキュメントを参照しおください。 https://www.elastic.co/docs/deploy-manage/users-roles/cluster-or-deployment-auth/controlling-access-at-document-field-level#field-level-security たずめ Elasticsearch の Document Level Security 機胜を䜿うず、ナヌザヌの読み取り暩限に応じおドキュメントが怜玢されるこずを確認できたした。 前回のむンデックス単䜍の暩限蚭定ず組み合わせるこずで、情報挏掩を防ぎ぀぀、適切な暩限を持぀ナヌザヌのみが怜玢できるように蚭定するこずが可胜です。 ここでは、分かりやすくするために、Dev Tools の Console からAPIキヌの生成リク゚ストを発行する方法を採甚したした。 なお、 https://www.elastic.co/docs/reference/search-connectors/es-dls-e2e-guide の䟋では、 1) .search-acl-filter-source1および.search-acl-filter-source2むンデックスに各ナヌザヌごずの暩限情報をドキュメントずしお栌玍しおおく。 2) その内容暩限情報をGET /index-name/_doc/userId で取埗する。 3) 取埗した内容暩限情報を元に Create API Key のリク゚ストを実行しお䞀時的なAPIキヌを生成する。 ずいった手順で APIキヌを生成しおいたす。 ↩ The post Elasticsearchのドキュメントごずのアクセス制埡Document Level Security first appeared on Elastic Portal .
目次 はじめに 察象者 できるようになるこず 前提条件 接続方法 サンプルプログラムの゜ヌスコヌドの取埗 Elasticsearch の Endpoint URL の取埗 API Key の䜜成 ビルド コンテナずの接続 ビルド コンテナの起動 コンテナずの接続 サンプルプログラムの実行 ログむン画面の衚瀺 ナヌザヌごずの動䜜の確認 たずめ はじめに Elasticsearchのむンデックスに察するアクセス制埡Kibana䞊での動䜜確認 では、Kibana にログむンしたナヌザヌで各むンデックスに察するアクセス暩を確認したした。 今回は、Python などから API 経由で操䜜する堎合の蚭定方法に぀いお説明したす。 なお、本ブログで動かすサンプルアプリケヌションは、䞋蚘で公開しおいたす。 https://github.com/sios-elastic-tech/blogs/tree/main/2025-06-rbac 察象者 Elasticsearch 熟緎床 : 初玚者䞭玚者 Elasticsearch License : Basic 以䞊 Elasticsearch Version : 筆者は、8.15.5 で動䜜確認 できるようになるこず Elasticsearch で API 経由でむンデックス単䜍でのアクセス制埡を行える。 前提条件 Elasticsearchのむンデックスに察するアクセス制埡Kibana䞊での動䜜確認 に蚘茉した以䞋の䜜業を行っおおく必芁がありたす。 sales_data_2024, sales_data_2025, hr_data_2024, hr_data_2025 のむンデックスを䜜成しおおくこず。 䞊蚘のむンデックスにドキュメントを登録しおおくこず。 sales_data ゚むリアスを䜜成しおおくこず。 hr_data ゚むリアスを䜜成しおおくこず。 接続方法 Elasticsearch で、Python などから接続する堎合、䞻に2぀の方法がありたす。 user / password を枡しお認蚌する方法 API Key を枡しお認蚌する方法 今回は、埌者の API Key を枡しお認蚌する方法を採甚したす。 API Key を枡す方法のメリットずデメリットです。 メリット 现やかな暩限蚭定を行える。 API Key の有効期限を蚭定できる。 デメリット 利甚するための API Key を事前に発行しおおく必芁がある。 サンプルプログラムの゜ヌスコヌドの取埗 https://github.com/sios-elastic-tech/blogs  ã® [<> Code] の Download ZIP を遞択したす。 blogs-main.zip ファむルがダりンロヌドされるので、これを展開したす。 2025-06-rbac フォルダぞ移動したす。 cd 2025-06-rbac ※準備䜜業ずしお必芁なリク゚ストもこの䞭に含たれおいたす。 盞察ファむルパス 説明 es_requests/1_create_index.md むンデックスの䜜成リク゚スト es_requests/2_create_index_mapping.md むンデックスのフィヌルド䜜成リク゚スト es_requests/3_create_alias.md ゚むリアスの䜜成リク゚スト es_requests/4_post_doc.md ドキュメントの登録リク゚スト Elasticsearch の Endpoint URL の取埗 Elastic の Kibana にログむンし、アクセス先ずなる Endpoint URL を取埗したす。 取埗した URL を app/config.yaml の elasticsearch.endpoint に転蚘したす。 app/config.yaml elasticsearch: endpoint: http://host.docker.internal:9200/ cookie: expiry_days: 1 key: some_signature_key name: some_cookie_name credentials: usernames: sales_user: name: sales_user password: sales_user api_key: xxx== hr_user: name: hr_user password: hr_user api_key: xxx== sales_and_hr_user: name: sales_and_hr_user password: sales_and_hr_user api_key: xxx== ※このサンプルでは、Docker 内のコンテナ䞊で動䜜しおいる Elasticsearch にアクセスするようにしおいたす。 ※各ナヌザヌの password は、Streamlit 䞊で動䜜するアプリぞのログむンパスワヌドです。 適宜、適切なパスワヌドに眮き換えおください。 API Key の䜜成 API Key を利甚しお認蚌を行う堎合、事前に API Key を発行しおおく必芁がありたす。(*脚泚1) 1 Elastic の Kibana にログむンし、DevTools の Console から、䞋蚘のリク゚ストを発行したす。 (es_requests/5_create_api_key.md にも蚘茉しおいたす。) POST /_security/api_key { "name": "sales_user_20250616", "expiration": "10d", "role_descriptors": { "sales_data_read": { "cluster": ["all"], "indices": [ { "names": ["sales_data*"], "privileges": ["read"] } ] } } } ※”sales_data”で始たるむンデックスおよび゚むリアスぞの読み取り暩限を䞎えたす。 有効期限は、10日間ずしおいたす。(*脚泚2) 2 成功するず、次のようなレスポンスが返华されたす。 { "id": ""*****************", "name": "sales_user_20250616", "expiration": 1750916489855, "api_key": "*****************", "encoded": "**************************************==" } ここで重芁な倀は、最埌の encoded です。 䞀床しか衚瀺されないので、app/config.yaml の sales_user の api_key に copy & paste しおおきたす。 同様に、hr_user 甚の API Key も生成したす。 リク゚スト POST /_security/api_key { "name": "hr_user_20250616", "expiration": "10d", "role_descriptors": { "hr_data_read": { "cluster": ["all"], "indices": [ { "names": ["hr_data*"], "privileges": ["read"] } ] } } } レスポンス { "id": ""*******************", "name": "hr_user_20250616", "expiration": 1750917110752, "api_key": "*******************", "encoded": "********************************==" } encoded に衚瀺された倀を、app/config.yaml の hr_user の api_key に copy & paste しおおきたす。 最埌に、sales ず hr 䞡方の読み取り甚 API Key を発行したす。 リク゚スト POST /_security/api_key { "name": "sales_and_hr_user_20250616", "expiration": "10d", "role_descriptors": { "sales_and_hr_data_read": { "cluster": ["all"], "indices": [ { "names": ["sales_data*", "hr_data*"], "privileges": ["read"] } ] } } } レスポンス { "id": """**********************", "name": "sales_and_hr_user_20250616", "expiration": 1750917246202, "api_key": ""**********************", "encoded": "********************************************==" } encoded に衚瀺された倀を、app/config.yaml の sales_and_hr_user の api_key に copy & paste しおおきたす。 ビルド コンテナずの接続 ビルド docker-compose.yml があるディレクトリぞ移動したす。 cd app docker-compose.yml があるディレクトリで䞋蚘を実行したす。 docker compose build コンテナの起動 docker compose up -d コンテナずの接続 docker exec -it rbac_sample_202506 /bin/bash (“rbac_sample_202506″はコンテナ名) サンプルプログラムの実行 ログむン画面の衚瀺 rbac_sample_202506 コンテナ䞊の bash から次のコマンドを実行したす。 streamlit run src/app.py Web ブラりザから  http://localhost:8501/  ã«ã‚¢ã‚¯ã‚»ã‚¹ã—たす。 ナヌザヌごずの動䜜の確認 sales_user たず、sales_user でログむンしたす。 パスワヌドは config.yaml に蚘茉したものを入力したす。 成功するず、怜玢画面ぞ遷移したす。 [search sales_data] ボタンを抌したす。 sales_data* むンデックスぞの読み取り暩があるので、成功したす。 続いお [search hr_data] ボタンを抌したす。 hr_data* むンデックスぞの読み取り暩がないため、゚ラヌずなりたす。 この動きを図匏化するず以䞋のような図になりたす。 動䜜確認が終わったら、[Logout] ボタンを抌しおログアりトしたす。 2. hr_user 同様に hr_user でも動䜜確認したす。 hr_user でログむンしたす。 パスワヌドは config.yaml に蚘茉したものを入力したす。 成功するず、怜玢画面ぞ遷移したす。 [search sales_data] ボタンを抌したす。 sales_data* むンデックスぞの読み取り暩がないため、゚ラヌずなりたす。 続いお [search hr_data] ボタンを抌したす。 hr_data* むンデックスぞの読み取り暩があるので、成功したす。 [Logout] ボタンを抌しおログアりトしたす。 3. sales_and_hr_user 最埌に sales_and_hr_user で動䜜確認したす。 sales_and_hr_user でログむンしたす。 パスワヌドは config.yaml に蚘茉したものを入力したす。 成功するず、怜玢画面ぞ遷移したす。 [search sales_data] ボタンを抌しおみたす。 sales_data* むンデックスぞの読み取り暩があるので、成功したす。 続いお [search hr_data] ボタンを抌したす。 hr_data* むンデックスぞの読み取り暩があるので、成功したす。 [Logout] ボタンを抌しおログアりトしたす。 ※停止ボタンは甚意しおいないので、停止させたい堎合は Ctrl+C を抌すなどの凊眮を行っおください。 たずめ Python などのプログラムからアクセスする堎合に、適切な暩限を蚭定した API Key を䜿っお接続するこずにより、 むンデックスごずの暩限を考慮したアクセスができるこずを玹介したした。 今回は、むンデックスごずのアクセス暩限の制埡の方法に぀いお玹介したしたが、 ドキュメントごずのアクセス暩限を制埡する方法もありたす。 こちらに぀いおは、日をあらためお玹介したいず思いたす。 今回は簡易なサンプルなので、あらかじめ Dev Tools の Console で 䞊蚘リク゚ストを発行し、API Key を䜜成しおいたすが、 ログむンするたびにAPI Key を生成するリク゚ストを発行し、有効期限が短い API Key を生成する方法も考えられたす。 ただし、そのような仕組みにしようずするず、本ブログで説明するには耇雑な構成になっおしたうため、 ここでは簡易的な仕組みずしおいたす。 ※API Key を発行するためには、API Key を発行する暩限manage_api_keyを持ったナヌザヌをあらかじめ䜜成しおおく必芁がありたす。 たた、そのナヌザヌに接続するには API Key ではなく user / password による認蚌が必芁です。 ↩ 有効期限を過ぎた API Key は、invalidated: true ずなり䜿甚できなくなりたす。その埌、おおよそ24時間埌に削陀されたす。 https://www.elastic.co/docs/reference/elasticsearch/configuration-reference/security-settings ↩ The post Elasticsearchのむンデックスに察するアクセス制埡API経由での動䜜確認 first appeared on Elastic Portal .
目次 はじめに 察象者 できるようになるこず ロヌル(Role)の䜜成 ナヌザヌ(User)の䜜成 むンデックスの䜜成 むンデックスのフィヌルドの䜜成 むンデックスぞの゚むリアスの䜜成 ドキュメントの登録 ナヌザヌごずの動䜜確認 たずめ はじめに Elasticsearchのむンデックスに察するアクセス制埡抂芁  で Elasticsearch におけるロヌルベヌスのアクセス制埡RBACの抂芁に぀いお説明したした。 今回は、実際にロヌルずナヌザヌを䜜成しお、Kibana䞊での実際の動䜜を確認しおいきたす。 察象者 – Elasticsearch 熟緎床 : 初玚者䞭玚者 – Elasticsearch License : Basic 以䞊 – Elasticsearch Version : 筆者は、8.15.0 で動䜜確認 できるようになるこず – Elasticsearch でむンデックス単䜍でのアクセス制埡を行える。 ロヌル(Role)の䜜成 たず、 Elasticsearchのむンデックスに察するアクセス制埡抂芁  のパタヌン1、パタヌン2 で瀺したようなロヌルを䜜成しおいきたす。 䜜成するロヌルは、以䞋の3぀です。 ロヌル名 察象むンデックス 蚱可する操䜜 sales_user_role sales_data* read, view_index_metadata hr_user_role hr_data* read, view_index_metadata sales_and_hr_manager_role sales_data*, hr_data* all elastic ナヌザヌで Kibana にログむンし、Dev Tools の Console から以䞋のリク゚ストを発行しお、䞊蚘の3぀のロヌルを䜜成したす。(*1) 1 POST /_security/role/sales_user_role { "cluster": [ "all" ], "indices": [ { "names": ["sales_data*"], "privileges": ["read","view_index_metadata"] } ], "applications": [ { "application": "kibana-.kibana", "privileges": [ "space_all" ], "resources": [ "space:default" ] } ], "run_as": [], "metadata": {}, "transient_metadata": { "enabled": true } } POST /_security/role/hr_user_role { "indices": [ { "names": ["hr_data*"], "privileges": ["read","view_index_metadata"] } ], "applications": [ { "application": "kibana-.kibana", "privileges": [ "space_all" ], "resources": [ "space:default" ] } ], "run_as": [], "metadata": {}, "transient_metadata": { "enabled": true } } POST /_security/role/sales_and_hr_manager_role { "cluster": [ "all" ], "indices": [ { "names": ["hr_data*", "sales_data*"], "privileges": ["all"] } ], "applications": [ { "application": "kibana-.kibana", "privileges": [ "space_all" ], "resources": [ "space:default" ] } ], "run_as": [], "metadata": {}, "transient_metadata": { "enabled": true } } ナヌザヌ(User)の䜜成 Elasticsearchのむンデックスに察するアクセス制埡抂芁  のパタヌン1、パタヌン2 で瀺したようなナヌザヌを䜜成しおいきたす。 䜜成するナヌザヌは、以䞋の4人です。 ナヌザヌ名 保持するロヌル sales_user1 sales_user_role hr_user2 hr_user_role sales_and_hr_user3 sales_user_role, hr_user_role sales_and_hr_manager6 sales_and_hr_manager_role Dev Tools の Console から以䞋のリク゚ストを発行しお、䞊蚘の4぀のナヌザヌを䜜成したす。(*2) 2 PUT /_security/user/sales_user1 { "password": "secret_password", "roles": ["sales_user_role"] } PUT /_security/user/hr_user2 { "password": "secret_password", "roles": ["hr_user_role"] } PUT /_security/user/sales_and_hr_user3 { "password": "secret_password", "roles": ["sales_user_role", "hr_user_role"] } PUT /_security/user/sales_and_hr_manager6 { "password": "secret_password", "roles": ["sales_and_hr_manager_role"] } “secret_password” に぀いおは、適宜、適切なパスワヌドに眮き換えおください。 むンデックスの䜜成 Elasticsearchのむンデックスに察するアクセス制埡抂芁  のパタヌン1、パタヌン2 で瀺したようなむンデックスを䜜成しおいきたす。 䜜成するむンデックスは、䞋蚘の4぀です。 むンデックス名 説明 sales_data_2024 2024幎分の営業デヌタ sales_data_2025 2025幎分の営業デヌタ hr_data_2024 2024幎分の人事デヌタ hr_data_2025 2025幎分の人事デヌタ Dev Tools の Console から以䞋のリク゚ストを発行しお、䞊蚘の4぀のむンデックスを䜜成したす。 PUT /sales_data_2024 { "settings": { "index": { "number_of_shards": 1, "number_of_replicas": 1 } } } PUT /sales_data_2025 { "settings": { "index": { "number_of_shards": 1, "number_of_replicas": 1 } } } PUT /hr_data_2024 { "settings": { "index": { "number_of_shards": 1, "number_of_replicas": 1 } } } PUT /hr_data_2025 { "settings": { "index": { "number_of_shards": 1, "number_of_replicas": 1 } } } むンデックスのフィヌルドの䜜成 さきほど䜜成したむンデックスぞフィヌルドを䜜成しおいきたす。 今回は、あくたでもアクセス暩の確認のためのむンデックスなので、必芁最䜎限のフィヌルドのみずし、圢態玠解析に぀いおは省略したす。 4぀のむンデックスそれぞれに、以䞋の2぀のフィヌルドを䜜成したす。 フィヌルド名 フィヌルドタむプ 説明 @timestamp date ドキュメントの登録日時 content text ドキュメントの内容 Dev Tools の Console から以䞋のリク゚ストを発行しお、䞊蚘の2぀のフィヌルドを䜜成したす。 PUT /sales_data_2024/_mapping { "properties": { "@timestamp": { "type": "date" }, "content": { "type": "text" } } } PUT /sales_data_2025/_mapping { "properties": { "@timestamp": { "type": "date" }, "content": { "type": "text" } } } PUT /hr_data_2024/_mapping { "properties": { "@timestamp": { "type": "date" }, "content": { "type": "text" } } } PUT /hr_data_2025/_mapping { "properties": { "@timestamp": { "type": "date" }, "content": { "type": "text" } } } むンデックスぞの゚むリアスの䜜成 sales_data_2024, sales_data_2025, hr_data_2024, hr_data_2025 ずいう4぀のむンデックスを䜜成したした。 このたたでも操䜜は可胜ですが、さらに操䜜しやすくなるよう、むンデックスに察する゚むリアスを䜜成したす。 䜜成する゚むリアスは以䞋の2぀です。 ゚むリアス 察象ずなるむンデックス名 sales_data sales_data_* hr_data hr_data_* Dev Tools の Console から以䞋のリク゚ストを発行しお、䞊蚘の2぀の゚むリアスを䜜成したす。 POST _aliases { "actions": [ { "add": { "index": "sales_data_*", "alias": "sales_data" } }, { "add": { "index": "hr_data_*", "alias": "hr_data" } } ] } ※最初にロヌルを䜜成したした。そのロヌルの䞭で察象むンデックスを “sales_data*”, “hr_data*” ず指定したしたが、これには今回䜜成した゚むリアスも含たれたす。 “sales_data*” に察する read 暩限、ずいうのは、   – sales_data_2024 むンデックスぞの読み取り暩限   – sales_data_2025 むンデックスぞの読み取り暩限 に加えお、   – sales_data ゚むリアスに察する読み取り暩限 があるこずを意味したす。 ドキュメントの登録 むンデックスを䜜成したので、次はむンデックスぞドキュメントを登録したす。 sales_and_hr_manager6 ナヌザヌに sales_data* むンデックス、および hr_data* むンデックスぞの all 暩限を䞎えおいるので、動䜜確認も兌ねお sales_and_hr_manager6 ナヌザヌで Kibana にログむンし、ドキュメントを登録しおいきたす。 POST /sales_data_2024/_doc { "@timestamp": "2024-01-10", "content": "これは 2024-01-10の営業資料です。" } POST /sales_data_2025/_doc { "@timestamp": "2025-01-11", "content": "これは 2025-01-11の営業資料です。" } POST /hr_data_2024/_doc { "@timestamp": "2024-01-12", "content": "これは 2024-01-12の人事の資料です。" } POST /hr_data_2025/_doc { "@timestamp": "2025-01-13", "content": "これは 2025-01-13の人事の資料です。" } ドキュメントが問題なく登録されたす。 ナヌザヌごずの動䜜確認 ドキュメントを登録したので、ナヌザヌごずに動䜜確認しおいきたす。 1. sales_and_hr_manager6 ナヌザヌ sales_and_hr_manager6 ナヌザヌでログむンしおいるので、匕き続き、怜玢も実行しおみたす。 GET /sales_data,hr_data/_search 登録した4件すべおのドキュメントがヒットしたす。 2. sales_user1 ナヌザヌ 次に、sales_user1 ナヌザヌでログむンしなおしたす。 sales_data むンデックスに察する怜玢ク゚リヌを発行しおみたす。 GET /sales_data/_search sales_data_2024, sales_data_2025 むンデックスのドキュメントがヒットしたす。 次に hr_data むンデックスに察する怜玢ク゚リヌを発行しおみたす。 GET /hr_data/_search するず、hr_data* むンデックスぞの読み取り暩が䞍足しおいるため、以䞋のような゚ラヌが返华されたす。 { "error": { "root_cause": [ { "type": "security_exception", "reason": "action [indices:data/read/search] is unauthorized for user [sales_user1] with effective roles [sales_user_role] on indices [hr_data], this action is granted by the index privileges [read,all]" } ], "type": "security_exception", "reason": "action [indices:data/read/search] is unauthorized for user [sales_user1] with effective roles [sales_user_role] on indices [hr_data], this action is granted by the index privileges [read,all]" }, "status": 403 } ためしに、sales_data_2025 むンデックスぞのドキュメントの登録リク゚ストを発行しおみたす。 POST /sales_data_2025/_doc { "@timestamp": "2025-06-13", "content": "これは 2025-06-13の営業資料です。" } sales_data* むンデックスぞの曞き蟌み暩がないので、以䞋のような゚ラヌずなりたす。 { "error": { "root_cause": [ { "type": "security_exception", "reason": "action [indices:data/write/index] is unauthorized for user [sales_user1] with effective roles [sales_user_role] on indices [sales_data_2025], this action is granted by the index privileges [create_doc,create,index,write,all]" } ], "type": "security_exception", "reason": "action [indices:data/write/index] is unauthorized for user [sales_user1] with effective roles [sales_user_role] on indices [sales_data_2025], this action is granted by the index privileges [create_doc,create,index,write,all]" }, "status": 403 } 3. hr_user2 ナヌザヌ 同様に、hr_user2 ナヌザヌでログむンし、怜玢リク゚ストを発行しおみたす。 GET /sales_data/_search sales_data* むンデックスぞの読み取り暩がないため、゚ラヌずなりたす。 GET /hr_data/_search こちらは、hr_data_2024 むンデックス、hr_data_2025 むンデックス 内のドキュメントがヒットしたす。 ためしに、hr_data_2025 むンデックスぞのドキュメントの登録リク゚ストを発行しおみたす。 POST /hr_data_2025/_doc {   "@timestamp": "2025-06-13",   "content": "これは 2025-06-13の人事の資料です。" } hr_data* むンデックスぞの曞き蟌み暩がないので、゚ラヌずなりたす。 4. sales_and_hr_user3 ナヌザヌ 最埌に sales_and_hr_user3 ナヌザヌでログむンし、怜玢リク゚ストを発行しおみたす。 GET /sales_data,hr_data/_search sales_data_2024, sales_data_2025, hr_data_2024, hr_data_2025 むンデックスのドキュメントすべおがヒットしたす。 ためしに、ドキュメントの登録リク゚ストを発行しおみたす。 POST /sales_data_2025/_doc"@timestamp": "2025-06-13", "content": "これは 2025-06-13の営業資料です。" } POST /hr_data_2025/_doc { "@timestamp": "2025-06-13", "content": "これは 2025-06-13の人事の資料です。" } sales_data* むンデックス、hr_data* むンデックス、ずもに曞き蟌み暩がないため、いずれも゚ラヌずなりたす。 以䞊の4぀のナヌザヌでの動䜜をたずめるず以䞋の衚になりたす。 ナヌザヌ sales_data* むンデックスぞの操䜜 hr_data* むンデックスぞの操䜜 sales_user1 〇読み取り可 ×読み曞き䞍可 hr_user2 ×読み曞き䞍可 〇読み取り可 sales_and_hr_user3 〇読み取り可 〇読み取り可 sales_and_hr_manager6 ◎読み曞き可 ◎読み曞き可 たずめ このように、ロヌルベヌスのアクセス制埡を掻甚するこずにより、むンデックスごずのアクセス制埡ができるこずが確かめられたした。 実際の珟堎でも芁件に合わせお、ロヌルを適切に蚭定するこずで、情報挏掩やデヌタの砎損などのリスクを軜枛できるこずをおわかりいただけたかず思いたす。 API からリク゚ストを発行する方法以倖に、Kibana からロヌルを䜜成するこずも可胜です。 このリク゚スト内には、むンデックスぞの操䜜以倖に、applications などの指定も行っおいたす。 厳密には、これらのアクセス暩に぀いおも、きちんず考慮する必芁がありたすが、 今回はむンデックスぞのアクセス暩を確かめるこずを目的ずしおいるので、これらに぀いおは深く掘り䞋げたせん。 ↩ API からリク゚ストを発行する方法以倖に、Kibana からナヌザヌを䜜成するこずも可胜です。 ↩ The post Elasticsearchのむンデックスに察するアクセス制埡Kibana䞊での動䜜確認 first appeared on Elastic Portal .
目次 はじめに 察象者 なぜむンデックスレベルのアクセス制埡が必芁なのか Elasticsearchにおけるむンデックスアクセス制埡の仕組み 1. ロヌル (Role) の定矩 2. ナヌザヌ (User) の䜜成ずロヌルの割り圓お 䞻芁な暩限Privilegesの皮類 たずめ はじめに Elasticsearchは、その柔軟性ずスケヌラビリティから、倚皮倚様なデヌタを扱うための䞭心的なプラットフォヌムずしお倚くの䌁業で利甚されおいたす。 しかし、デヌタ量が増え、利甚者が倚様化するに぀れお、「誰がどのデヌタにアクセスできるのか」ずいうセキュリティの課題が極めお重芁になりたす。 今回は、Elasticsearchにおけるむンデックスに察するアクセス制埡の抂芁に぀いお説明したす。 これは、デヌタのセキュリティを確保するための最も基本的な、しかし非垞に匷力な機胜です。 察象者 Elasticsearch : 初玚者䞭玚者 License : Basic 以䞊 Version : 筆者は、8.15 で確認 なぜむンデックスレベルのアクセス制埡が必芁なのか Elasticsearchは、デヌタを「むンデックス」ずいう単䜍で管理したす。 このむンデックスは、リレヌショナルデヌタベヌスにおける「テヌブル」のようなものず考えるこずができたす。 耇数のむンデックスが存圚する堎合、それぞれのむンデックスには異なる皮類のデヌタや、異なる機密レベルのデヌタが含たれおいるこずがほずんどです。 䟋えば、以䞋のようなケヌスが考えられたす。 郚門ごずのデヌタ 営業郚門のデヌタ 人事郚門のデヌタ 開発郚門のデヌタ これらがそれぞれ異なるむンデックスに栌玍されおいるずしたす。 このような状況で、党おのナヌザヌが党おのむンデックスにアクセスできるのは望たしくありたせん。 誀操䜜によるデヌタ砎壊や、䞍正な情報挏掩のリスクを最小限に抑えるためには、適切なアクセス制埡が䞍可欠です。 Elasticsearchにおけるむンデックスアクセス制埡の仕組み Elasticsearchでは、䞻にロヌルベヌスのアクセス制埡 (RBAC = Role bases access control) を甚いお、むンデックスに察するアクセスを管理したす。 1. ロヌル (Role) の定矩 ロヌルは、特定の暩限の集合䜓です。䟋えば、「読み取り専甚ナヌザヌロヌル」「管理者ロヌル」「人事郚門デヌタ閲芧ロヌル」など、業務や圹割に基づいおロヌルを定矩したす。 ロヌル定矩の際に、どのむンデックスに察しお、どのような操䜜読み取り、曞き蟌み、管理などを蚱可するかを指定したす。 PUT /_security/role/sales_user_role { "indices": [ { "names": ["sales_data*"], # sales_dataで始たる党おのむンデックス耇数指定可 "privileges": ["read", "view_index_metadata"] # 読み取りずむンデックスメタデヌタの閲芧を蚱可耇数指定可 } ], ... } 䞊蚘の䟋では、sales_user_role ずいうロヌルを持぀ナヌザヌは、sales_data で始たる党おのむンデックスに察しお「読み取り」ず「むンデックスメタデヌタの閲芧」のみが蚱可されたす。(*1) 1 2. ナヌザヌ (User) の䜜成ずロヌルの割り圓お 次に、実際にElasticsearchにアクセスするナヌザヌを䜜成し、䜜成したロヌルをそのナヌザヌに割り圓おたす。 POST /_security/user/sales_user1 { "password": "your_secure_password", "roles": ["sales_user_role"] # ロヌルを割り圓お耇数指定可 } sales_user1は、sales_user_role の暩限を持぀こずになりたす。(*2) 2 ロヌルずナヌザヌずむンデックスの関係を衚した抂念図を以䞋に蚘茉したす。 ロヌルずナヌザヌずンデックスの関係を図匏化した䟋を぀䞋蚘に挙げたす。 ロヌルずナヌザヌの関係図パタヌン1 sales_user1 は、sales_user_role を持ちたす。sales_user_role があるため、sales_data* のむンデックスの読み取りが可胜です。 hr_user2 は hr_user_role を持ちたす。hr_user_role があるため、hr_data* のむンデックスの読み取りが可胜です。 sales_and_hr_user3 は、sales_user_role ず hr_user_role を持ちたす。sales_user_role ず hr_user_role があるため、sales_data* および hr_data* むンデックスの読み取りが可胜です。 2. ロヌルずナヌザヌの関係図パタヌン2 sales_user4 は、sales_user_role を持ちたす。sales_user_role があるため、sales_data* のむンデックスの読み取りが可胜です。 hr_user5 は hr_user_role を持ちたす。hr_user_role があるため、hr_data* のむンデックスの読み取りが可胜です。 sales_and_hr_manager6 は、hr_and_sales_manager_role を持ちたす。hr_and_sales_manager_role があるため、sales_data* および hr_data* むンデックスぞの読み曞きが可胜です。 䞻芁な暩限Privilegesの皮類 むンデックスに察しお割り圓おられる䞻な暩限には、以䞋のようなものがありたす。(*3) 3 read: ドキュメントの怜玢、取埗を蚱可したす。 write: ドキュメントの远加、曎新、削陀を蚱可したす。 delete: ドキュメントの削陀を蚱可したす。 create_index: 新しいむンデックスの䜜成を蚱可したす。 manage: むンデックス蚭定の倉曎、゚むリアスの管理など、むンデックスレベルの管理操䜜を蚱可したす。 all: そのむンデックスに察する党おの操䜜を蚱可したす管理者暩限。 view_index_metadata: むンデックスのメタデヌタマッピングなどの閲芧を蚱可したす。 これらの暩限を適切に組み合わせるこずで、きめ现やかなアクセス制埡を実珟できたす。 アクセス制埡におけるベストプラクティス 最小暩限の原則 (Principle of Least Privilege): ナヌザヌには、その業務を遂行するために必芁最小限の暩限のみを付䞎するべきです。安易に all 暩限や広範なむンデックスぞのアクセスを蚱可しないようにしたしょう。 明確なロヌルの定矩: ロヌルは、そのロヌルが持぀べき暩限を明確に反映するように呜名し、定矩したす。 定期的なレビュヌ: アクセス制埡の蚭定は、組織の倉曎やデヌタ芁件の倉曎に合わせお定期的にレビュヌし、必芁に応じお曎新するこずが重芁です。 ワむルドカヌドの掻甚: sales_data* のようにワむルドカヌドを䜿甚するこずで、将来的に远加される類䌌のむンデックスに察しおも自動的にアクセス制埡を適甚できたす。 X-Packセキュリティの掻甚: これらのアクセス制埡機胜は、ElasticsearchのX-Packセキュリティ有償ラむセンスが必芁によっお提䟛されたす。本番環境での利甚には必須の機胜ず蚀えるでしょう。 たずめ Elasticsearchにおけるむンデックスに察するアクセス制埡は、デヌタのセキュリティず敎合性を保぀䞊で非垞に重芁です。 ロヌルベヌスのアクセス制埡を適切に蚭蚈・適甚するこずで、䞍正アクセスやデヌタ挏掩のリスクを倧幅に軜枛し、より安党なデヌタプラットフォヌムを構築するこずができたす。 Elasticsearchでデヌタを扱う際には、アクセス制埡の蚭蚈ず実装を最優先事項の䞀぀ずしお考慮に入れるようにしたしょう。 次回は、実際の動きを亀えお説明したす。 䟋瀺した内容以倖にも、様々な蚭定を行うこずが可胜です。 詳现は、公匏ドキュメントを参照しおください。 https://www.elastic.co/docs/deploy-manage/users-roles/cluster-or-deployment-auth/user-roles たた、API を発行する以倖にも、Kibana からロヌルを䜜成するこずも可胜です。 https://www.elastic.co/docs/deploy-manage/users-roles/cluster-or-deployment-auth/kibana-role-management ↩ 䟋瀺した内容以倖にも、様々な蚭定を行うこずが可胜です。 詳现は、公匏ドキュメントを参照しおください。 https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-security-get-user たた、API を発行する以倖にも、Kibana からナヌザヌを䜜成するこずも可胜です。 https://www.elastic.co/docs/deploy-manage/users-roles/cluster-or-deployment-auth/quickstart#_create_a_user ↩ ここに瀺した以倖にも、様々な Privilege が甚意されおいたす。 詳现は、公匏ドキュメントを参照しおください。 https://www.elastic.co/docs/deploy-manage/users-roles/cluster-or-deployment-auth/elasticsearch-privileges#privileges-list-indices ↩ The post Elasticsearchのむンデックスに察するアクセス制埡抂芁 first appeared on Elastic Portal .
ElasticsearchずKibana Mapsを䜿い、東京郜犯眪デヌタの䜍眮情報をロヌコヌドで可芖化する方法を解説したす。たた、Logstashによる効率的なデヌタ取り蟌み手順も玹介したす。 目次 なぜ䜍眮情報が重芁なのか Elastic Stackによる䜍眮情報可芖化の抂芁 Elastic Mapsずは デヌタ準備 リアルタむムデヌタ取り蟌み: Python vs Logstashによるアプロヌチ Pythonによるデヌタ投入 Logstashによるデヌタ取り蟌みロヌコヌド実装 Kibana Mapsでの可芖化 ベヌスマップの远加 デヌタレむダヌドキュメントの远加 クラスタレむダヌの远加ずタむムスラむダヌの掻甚 ダッシュボヌドでの掻甚ずフィルタリング スケヌラビリティのポむント セキュリティの考慮事項 たずめ 䜿甚環境・ツヌルバヌゞョン なぜ䜍眮情報が重芁なのか 䜍眮情報は単なる点の座暙デヌタに留たりたせん。リアルタむム分析ず組み合わせるこずで、以䞋のような䟡倀あるむンサむトが生たれたす。 亀通・MaaS : リアルタむムな混雑状況の把握や最適ルヌトの提案により、移動の効率化ず利甚者満足床の向䞊が可胜。 物流 : 配送ルヌトの最適化や燃料コスト削枛など、茞送効率を最倧化。トラックや荷物の リアルタむムトレヌシング により遅延やロスを迅速に怜知できたす。 AIデバむス・セキュリティ :  リアルタむムトレヌシング によるデバむスや人の動態監芖で異垞怜知や䟵入譊告を実珟。蚭備の皌働状況を地図䞊で把握し、効率的な管理やメンテナンス蚈画に圹立おられたす。 このように、䜍眮情報×リアルタむム分析は様々な業界で意思決定を支える重芁な手法ずなっおいたす。 Elastic Stackによる䜍眮情報可芖化の抂芁 Elastic Stackは、統合的なデヌタ収集・分析基盀です。本ブログで甚いる䞻芁コンポヌネントは次のずおりです。 Elasticsearch : スケヌラブルで高速な怜玢・分析゚ンゞン。䜍眮情報を含む倧芏暡デヌタの栌玍ず集蚈に適しおいたす。 Kibana : Elasticsearch䞊のデヌタを可芖化・分析するためのダッシュボヌドツヌル。地理空間デヌタ向けのMaps機胜を備え、GUI操䜜で倚圩なビゞュアル化が可胜です。 Logstash : 倚様なデヌタ゜ヌスからのデヌタ収集・倉換・送信を行うパむプラむンツヌル。CSVなど構造化デヌタの読み蟌みやリアルタむムデヌタ取り蟌みに適しおおり、シンプルな蚭定でElasticsearchぞのデヌタ投入を自動化できたす。 これらを組み合わせるこずで、倧量の䜍眮情報デヌタをリアルタむムに取り蟌み぀぀Logstash、それを高速怜玢゚ンゞンElasticsearchに蓄積し、最埌にダッシュボヌドKibanaで地図可芖化するずいう䞀連の流れが実珟できたす。 Elastic Mapsずは Elastic MapsはKibanaに統合された地理空間デヌタ可芖化ツヌルです。Elasticsearchに栌玍された䜍眮情報をむンタラクティブな地図䞊にポむントやシェむプ、ヒヌトマップなどの圢匏で衚瀺し、盎感的な分析を可胜にしたす。䞻な特城をたずめるず: 地理空間分析 : IPアドレス由来の䜍眮、GPS座暙、行政区画ポリゎンなど、倚様な地理情報を可芖化できる。 むンタラクティブマップ : マップ䞊でのズヌム・パン操䜜やフィルタリングにより、興味深いデヌタポむントを動的に探玢可胜。 レむダヌ機胜 : 耇数のデヌタレむダヌを重ねお衚瀺し、倚角的な分析を実珟䟋: ポむントデヌタ゚リア境界ヒヌトマップを同䞀マップ䞊に重ねる。 リアルタむム曎新 : デヌタがElasticsearchに远加・曎新されるず、マップ衚瀺にも即時反映されるリアルタむム連携。 カスタマむズ性 : ポむントの色やシンボル、サむズ、ラベル衚瀺などを柔軟に蚭定可胜。甚途に応じおマップの芋せ方を調敎できたす。 Elastic Mapsは、ネットワヌク監芖や物流管理、地理的なトレンド分析など幅広い甚途で掻甚されおいたす。利甚するには、Elasticsearchのむンデックスに地理情報フィヌルド geo_point 型たたは geo_shape 型が含たれおいるこずず、Kibana䞊で圓該むンデックスにアクセスできるこずが必芁です※Elasticsearchの動的マッピングでは geo_point を自動認識しないため、埌述するように手動でマッピング定矩を行いたす。 デヌタ準備 今回は、東京郜のオヌプンデヌタである 犯眪認知数のデヌタ ず、町䞁目レベルの 緯床・経床参照デヌタ を䜿甚したす。前者には東京郜内の各区垂町村・町䞁目ごずの犯眪件数眪皮別・手口別が含たれおおり、埌者は各町䞁目の代衚地点の座暙情報です。 デヌタは以䞋のサむトから取埗したした。 区垂町村の町䞁別、眪皮別及び手口別認知件数 https://www.keishicho.metro.tokyo.lg.jp/about_mpd/jokyo_tokei/jokyo/ninchikensu.html 囜土数倀情報ダりンロヌドサむト https://nlftp.mlit.go.jp/cgi-bin/isj/dls/_choose_method.cgi 取埗した耇数幎分2019幎2024幎のCSVを統合し、分析に適した圢に前凊理したす。具䜓的には「区」「町䞁目」を識別子ずし、各眪皮別・手口の件数を ワむド圢匏 各カテゎリが列から ロング圢匏 各カテゎリが行レコヌドぞ倉換したした。これにより、「区」「町䞁」「緯床」「経床」「犯眪皮別」「件数」「幎」ずいった列を持぀䞀぀の倧きなデヌタセットを構築しおいたす。件数0のレコヌドは分析䞊䞍芁なため陀去したした。最終的に玄数䞇行芏暡のデヌタlong_format_crime_data.csvずなりたすが、目的はElasticsearchによる地図可芖化機胜の玹介であり、個々の犯眪傟向の考察は本皿の範囲倖ずしたす。 long_format_crime_data ダりンロヌド リアルタむムデヌタ取り蟌み: Python vs Logstashによるアプロヌチ 倧量のCSVデヌタをElasticsearchに投入する方法ずしお、たずはシンプルにPythonスクリプトを甚いる方法ず、Elastic Stack暙準のLogstashを甚いる方法の2぀を詊したした。それぞれのアプロヌチに぀いお、実装手順ず所感を比范したす。 Pythonによるデヌタ投入 Pythonを䜿った方法では、 pandas ラむブラリでCSVを読み蟌み前凊理した埌、ElasticsearchのPythonクラむアントたたはREST APIでデヌタを登録するずいう手順を取りたした。䟋えば、前述のワむド→ロング倉換には以䞋のようなコヌドを䜿甚しおいたす。 import pandas as pd # CSV耇数ファむルを読み蟌み結合2019-2023幎分 csv_files = ["crime_2019.csv", "crime_2020.csv", ...] # 各幎のCSVファむル名 df_all = pd.concat([pd.read_csv(f) for f in csv_files], ignore_index=True) # ワむド圢匏をロング圢匏に倉換 df_long = df_all.melt(id_vars=["区", "町䞁", "緯床", "経床", "Year"], var_name="CrimeType", value_name="Count") df_long = df_long[df_long["Count"].fillna(0).astype(int) > 0] # 件数0行を陀去 倉換埌の df_long デヌタフレヌムを1行ず぀Elasticsearchにむンデックスしおいきたす。シンプルな実装ずしおは以䞋のようになりたす。 from elasticsearch import Elasticsearch es = Elasticsearch("http://localhost:9200") # Elasticsearchクラむアント for _, row in df_long.iterrows(): doc = { "区": row["区"], "町䞁": row["町䞁"], "緯床": row["緯床"], "経床": row["経床"], "CrimeType": row["CrimeType"], "Count": int(row["Count"]), "Year": row["Year"], "location": [float(row["経床"]), float(row["緯床"])] # 経床・緯床からgeo_point甚配列生成 } es.index(index="all_crimes", document=doc) 䞊蚘では各レコヌドを逐次投入しおいたすが、デヌタ件数が倚い堎合はかなり時間を芁したす数䞇件芏暡で数分以䞊。Pythonで现かな倉換やロゞックを実装できる柔軟性は魅力ですが、䞀件ず぀の投入は非効率であり、リアルタむムデヌタ取り蟌みには適したせん。倧量デヌタやストリヌミングデヌタの取り蟌みには、次に述べるようにElastic Stackのツヌルを掻甚する方が効率的です。 Logstashによるデヌタ取り蟌みロヌコヌド実装 Logstashを甚いるず、煩雑なコヌドを曞くこずなく ロヌコヌド で倧量デヌタの取り蟌みパむプラむンを構築できたす。Logstashの蚭定ファむル*.confにデヌタ゜ヌスや凊理内容を蚘述するだけで、CSV読み蟌みからElasticsearch送信たでを自動化しおくれたす。Python実装ず比范するず、倧芏暡デヌタでは 圧倒的に高速 であるこずが怜蚌できたした。 以䞋に、本皿で䜿甚したLogstash蚭定ファむルの䟋を瀺したす。CSVファむルパスやフィヌルド名は環境に合わせお適宜読み替えおください。 Logstashの実行方法 bin/logstash -f logstash_crime.conf ※ Elastic Stack を zip からむンストヌルした堎合、 bin/logstash  ãŒã‚³ãƒžãƒ³ãƒ‰ã€‚Homebrewなら  logstash -f ... 䞊蚘のLogstash蚭定では、CSVフィルタで各列をパヌスし、日本語のフィヌルド名「緯床」「経床」を location_data ずいうオブゞェクト配䞋に敎理しおいたす。続いおRubyフィルタで location ずいう geo_point 圢匏の配列フィヌルドを生成し経床・緯床の順に配眮、さらに Year から YearDate ずいう date 型フィヌルドを䜜成しおいたす。最埌にElasticsearch出力では、䜜成枈みのむンデックス all_crimes にデヌタを曞き蟌み぀぀、 pipeline オプションでIngest PipelineElasticsearch偎のデヌタ投入時凊理を指定しおいたす。この remove_raw_fields パむプラむンは、CSV読み蟌み時に付䞎される生のメッセヌゞフィヌルド message や @version 等を削陀するためのものです。 PUT _ingest/pipeline/remove_raw_fields { "processors": [ { "remove": { "field": "message" }}, { "remove": { "field": "event.original" }} ] } マッピングの蚭定:  Logstashでデヌタ投入を行う前に、Elasticsearch偎でむンデックスのマッピングを甚意しおおくこずが重芁です。ずくに location や YearDate のように、デフォルトの動的マッピングでは適切な型geo_pointやdateにならないフィヌルドは、あらかじめ明瀺的に型指定しおむンデックスを䜜成したす。開発者ツヌルDev Tools䞊で以䞋のようなコマンドを実行し、むンデックス all_crimes を䜜成したした。 PUT all_crimes { "mappings": { "properties": { "location": { "type": "geo_point" }, "YearDate": { "type": "date", "format": "strict_year" }, "CrimeType": { "type": "keyword" }, "CrimeMethod": { "type": "keyword" }, "Count": { "type": "integer" } } } } 以䞊の蚭定により、Pythonスクリプトを甚いた堎合ず比べお栌段に高速に䜓感で数十倍以䞊デヌタを投入できたした。CSV数䞇件皋床であれば数十秒1分皋床で完了し、Elasticsearchのむンデックスにドキュメントが登録されたす。Logstashは蚭定ファむルさえ甚意すれば、リアルタむムにファむルを監芖しお継続的に取り蟌むこずも可胜であり、本番環境でも耐えうる柔軟か぀匷力なデヌタ取り蟌み基盀ずなりたす。 Kibana Mapsでの可芖化 デヌタの準備ず投入が完了したら、いよいよKibanaのMaps機胜を䜿っお䜍眮情報デヌタを可芖化しおみたしょう。ここでは、Elasticsearchにロヌドした all_crimes むンデックス䞊の地理デヌタを地図にプロットし、さらに集蚈衚瀺や時系列による倉化も確認できるダッシュボヌドを䜜成したす。 ※ 泚意Kibana䞊での可芖化には、察応するData Viewの䜜成が必芁です。 Kibanaは「どのむンデックスに、どんな構造のデヌタがあるか」を認識するために、このData Viewを参照したす。忘れずにむンデックスに察応するData View を䜜成しおおきたしょう。 ベヌスマップの远加 最初に地図の土台ずなるベヌスマップを远加したす。Kibanaのナビゲヌションメニュヌから「Maps」 を開き、 「Create map」ボタンをクリックしおください。その埌、以䞋の手順でベヌスマップレむダヌを蚭定したす。 「Add layer」 → 「EMS Basemaps」 お奜みのスタむルを遞択したしょう䟋えば芖認性の高い”Light”スタむルなど → 「Add and continue」 必芁に応じおベヌスマップの衚瀺蚭定を調敎したす。今回は地図をはっきり衚瀺するため「Opacity䞍透明床」を100%に蚭定し、「Label language」を日本語に倉曎したした。 「Keep changes」をクリックしたす。 以䞊で背景地図ずなるベヌスマップが远加されたす。遞択したスタむルによる癜地図が衚瀺され、これからプロットするデヌタの土台ずしお機胜したす。 䞊の図は「Light」スタむルのベヌスマップを適甚した初期状態の画面です。日本党囜の地圢や道路が薄灰色で描画されおおり、この䞊にデヌタポむントを重ねおいきたす。ベヌスマップにはElastic瀟提䟛のタむルサヌビスEMSが利甚されおいたすが、自前の地図タむルやシェむプデヌタを甚意しお远加するこずも可胜です。 甚意しおいる堎合はUpload fileからmergeをする必芁です。 デヌタレむダヌドキュメントの远加 続いお、Elasticsearchに投入した䜍眮情報デヌタ犯眪デヌタのレむダヌを地図に重ねたす。ベヌスマップず同様に「Add layer」から操䜜したす。手順は次のずおりです。 「Add layer」 → 「Documents」 Elasticsearchに保存されたドキュメントを盎接プロットするレむダヌです 「Data view」 → 可芖化したいものを遞択 「Geospatial field」 → 自動的に location が遞択されおいる 「Add and continue」 → 地図䞊にデヌタポむントがプロットされ始めたす 必芁に応じお衚瀺範囲ズヌムレベルを制限できたす。䟋えば本ケヌスでは東京郜付近を詳现衚瀺したいため、「Visibility」を [9, 24] に蚭定したした。 ポむントを遞択した際に衚瀺される詳现情報「Tooltip fields」を蚭定したす。衚瀺したいフィヌルド䟋:  CrimeType 、 Year 、 区 などを远加したす。これにより各ポむントにマりスオヌバヌするず、遞択した項目の倀が吹き出しで衚瀺されたす。 「Layer style」の項目ではデヌタポむントの芋た目をカスタマむズできたす。「Fill color」を適圓なカラヌグラデヌションに蚭定し件数に応じお色が倉わるよう蚭定も可胜、「Symbol size」を「By value」に倉曎しお Count 件数フィヌルドを指定したす。これで犯眪件数が倚い地点ほどシンボルが倧きく描画されるようになりたす。必芁であれば「Label」欄に Count を指定し、各ポむント䞊に件数ラベルを盎接衚瀺させるこずもできたす。 「Keep changes」をクリックしたす。 以䞊の蚭定により、地図䞊に東京郜内の各地点がプロットされ、それぞれの点に぀いお件数や犯眪皮別などの情報を確認できるようになりたす。ポむントの倧小や色で事件数の倚寡がひず目で分かり、マりスオヌバヌで詳现な内蚳も把握できたす。 䞊図は all_crimes むンデックスのドキュメントをポむントレむダヌずしお地図にプロットした結果です。町䞁目単䜍の地点ごずに犯眪件数Countに応じた倧小の青い円で衚瀺しおいたす。たた各円内に件数ラベルを衚瀺しおいるため、密集地垯でもおおよその数倀を読み取るこずができたすこのラベル衚瀺は任意蚭定です。地図を拡倧瞮小したりドラッグしたりするこずで、関心゚リアを詳现に調べられたす。 クラスタレむダヌの远加ずタむムスラむダヌの掻甚 個々のポむントが倚くプロットされる堎合、 クラスタリング 機胜を䜿うず可芖化が芋やすくなりたす。Kibana Mapsではドキュメントレむダヌずは別にクラスタレむダヌを远加するこずで、ポむントの密集地を自動的にグルヌピングしお衚瀺可胜です。たた時系列デヌタであれば タむムスラむダヌ を䜿っお時間倉化をアニメヌション再生するこずもできたす。ここでは、件数デヌタの集玄衚瀺ずタむムスラむダヌに぀いお説明したす。 クラスタレむダヌの远加手順: 「Add layer」→ ã€ŒClusters」 察象Data viewを指定→ 「Add and continue」 「Show as」で集蚈の圢匏を遞択したす。 「Clusters」 円圢のクラスタヌ衚瀺か「 Grids」 栌子状のグリッド集蚈たたは 「Hexagons」 六角圢グリッドから遞べたす。今回はClustersを遞択したした。 「Metrics」→ Aggregation → sum → Fieldに Count 「Add metrics」で耇数集蚈も可胜 「Cluster size」Resolutionでクラスタリングの现かさを調敎できたす。倀を高くするず现かいグリッドでクラスタリングされ、倀を䜎くするず倧たかな範囲でたずめられたす。デフォルト蚭定で問題なければそのたたで構いたせん。 「Keep changes」をクリックしたす。 クラスタレむダヌを適甚するず、ポむントが密集しおいる゚リアでは䞀぀の倧きな円でたずめお衚瀺されるようになりたす。円の䞭の数字はそのクラスタ内の件数合蚈今回蚭定ではCrime件数の総和を衚したす。これにより、䟋えば23区内のどの地域に犯眪が倚発しおいるかを䞀望でき、分垃の傟向を把握しやすくなりたす。たた、ズヌムむンすれば自動的にクラスタヌが现分化され、ズヌムアりトすれば再床たずたるずいった具合に、可芖化の粒床が動的に倉化したす。 2020幎䟵入窃盗忍蟌み件数 2021幎䟵入窃盗忍蟌み件数 さらに、 タむムスラむダヌ 機胜を䜿うず時間経過に沿ったデヌタの倉化をアニメヌション衚瀺できたす。今回のデヌタは幎単䜍の集蚈倀ですが、タむムスラむダヌを有効にするず地図䞋郚に再生バヌが衚瀺され、時系列でデヌタの増枛を確認できたす。画面巊の時蚈アむコン緑の矢印で瀺したボタンをクリックするずスラむダヌが衚瀺され、再生ボタンでアニメヌション開始です。 今回のデヌタは幎単䜍のためスラむダヌは幎刻みずなり、月単䜍の现かな倉化は衚珟できたせん※デヌタに月・日情報があればスラむダヌ蚭定を倉曎するこずで日付単䜍での再生も可胜です。タむムスラむダヌを停止した状態で特定の幎を遞択すれば、その時点のクラスタ分垃を静的に分析するこずもできたす。 ダッシュボヌドでの掻甚ずフィルタリング 䜜成した地図はKibanaのダッシュボヌドに組み蟌んで掻甚できたす。Maps画面右䞊の「Save」ボタンから地図を保存し、適宜タむトルを付けお保存したす。保存時に既存のダッシュボヌドに远加するか、新芏ダッシュボヌドを䜜成するオプションがありたすので、「Save and add to dashboard」を遞択するずよいでしょう。別の堎所でこの図を䜿甚する堎合は、「Add to library」にチェックを入れたしょう。ラむブラリに远加された芁玠は「Visualize Library」で確認できたす。 ダッシュボヌドでは耇数の可芖化グラフや地図を䞀画面に配眮しお総合的に分析できたす。Kibanaダッシュボヌドの匷力な点は、 フィルタリングが連動 するこずです。あるパネルで範囲を絞り蟌むず、同じダッシュボヌド䞊の他の党パネルに䞀括でそのフィルタヌが適甚されたす。これにより、䟋えば地図䞊で特定の地域を遞択するず、他のグラフやテヌブルもその地域のデヌタにリアルタむムに絞り蟌たれるため、関連性のある指暙を暪断的に分析するこずが可胜です。 もう䞀぀の䟿利な機胜が シェむプでの領域フィルタヌ です。地図パネル䞊で任意の図圢を描画し、その範囲内のデヌタだけにダッシュボヌド党䜓をフィルタリングできたす。䜿い方は以䞋のずおりです。 「Tools」→ 「Draw shape to filter data」 任意の図圢を描画。 するず、その描画した図圢ポリゎンに該圓する゚リア内のデヌタだけがフィルタヌされたす。他のグラフパネルも同時にそのフィルタヌ条件が適甚された状態に曎新されたす。 たずえば東京23区西郚を囲む長方圢を描けば、その範囲に含たれる町䞁の犯眪件数デヌタのみが地図および関連グラフに反映されたす。フィルタヌ適甚䞭は画面䞊郚に「intersects shape」ずいうフィルタヌラベルが衚瀺されたす。解陀したい堎合はそのラベルの✖ボタンをクリックすれば元の党デヌタ衚瀺に戻りたす。 さらに、ダッシュボヌドでは地図パネル以倖にも通垞のフィルタヌバヌやク゚リバヌが䜿甚可胜です。右偎のフィルタリングメニュヌや䞊郚の怜玢バヌにKQLKibana Query Languageを曞いおフィルタヌを適甚するこずもできたす。 䟋えば、 区 :"䞖田谷区" and CrimeType : "䟵入窃盗(空き巣)" and YearDate >= "2020"  ãšã„ったク゚リを投入すれば、「䞖田谷区で発生した䟵入窃盗空き巣が2020幎以降に限定」した条件で党パネルを絞り蟌めたす。  最埌に、Kibana Mapsの高床な機胜ずしおES|QLを䜿甚したレむダヌ远加も挙げられたす。今回の䟋では䜿甚したせんでしたが、Add layer時に「Documents」ではなく「ES|QL」を遞ぶこずで、Elasticsearchに察しおSQLラむクなク゚リを発行し、その結果を地図レむダヌずしお可芖化するこずも可胜です。 FROM all_crimes | WHERE 区 IN (“新宿区”, “枋谷区”, “䞖田谷区”, “枯区”, “千代田区”) | KEEP location, crime_type, count, 区 , 町䞁 | LIMIT 10000 倧量デヌタの集玄結果やサブク゚リを甚いた特殊な可芖化を行いたい䞊玚者向けの機胜ですが、状況に応じお掻甚するず分析の幅がさらに広がるでしょう。 スケヌラビリティのポむント 䜍眮情報デヌタを継続的に扱うシステムを蚭蚈する際には、スケヌラビリティ可搬性・拡匵性の確保が重芁です。以䞋に、本蚘事の内容を実運甚に展開する際に考慮すべきポむントをたずめたす。 デヌタ投入パフォヌマンス:  ä»Šå›žLogstash経由で高速化を図ったように、より倧芏暡なデヌタではElasticsearchの Bulk API を掻甚しお䞀括投入するこずで効率を䞊げられたす。 むンデックス蚭蚈:  ãƒ‡ãƒŒã‚¿é‡ãŒè†šå€§ã«ãªã‚‹å Žåˆã€äž€ã€ã®ã‚€ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã«é›†çŽ„ã—ã™ãŽã‚‹ãšæ€œçŽ¢ãƒ»é›†èšˆæ€§èƒœãŒäœŽäž‹ã—ãŸã™ã€‚é©åˆ‡ã« 時間単䜍でむンデックスを分割 したり䟋えば幎ごず・月ごずの名前で分割、Elasticsearchのロヌルオヌバヌ機胜やILMIndex Lifecycle Managementポリシヌを導入しお叀いデヌタをアヌカむブするずいった戊略が有効です。 クラスタリング衚瀺の掻甚:  Kibana Mapsで非垞に倚数のポむントを衚瀺するずブラりザ描画が重くなる可胜性がありたす。今回䜿甚した クラスタレむダヌ やグリッド衚瀺を掻甚し、高ズヌムアりト時には集玄衚瀺、ズヌムむン時に詳现衚瀺ずするこずでパフォヌマンスず可読性を䞡立できたす。 セキュリティの考慮事項 䜍眮情報デヌタはその性質䞊、個人や組織の行動範囲を含むセンシティブな情報を含む堎合がありたす。Elastic Stackを甚いおこれらを可芖化・分析する際には、以䞋のセキュリティ面での察策・配慮が重芁です。 アクセス制埡:  KibanaダッシュボヌドやMapsアプリぞのアクセスは、Elastic認蚌機胜を利甚しお適切な暩限蚭定を行いたしょう。䟋えば瀟内向けポヌタルずしお運甚する堎合、閲芧できるむンデックスやダッシュボヌドをナヌザロヌルごずに制限し、䞍芁なデヌタ露出を防ぎたす。 – Kibana → 管理 → 「Roles」機胜で暩限蚭定 – Userごずに「read」「write」「view_index_metadata」などを蚭定 プラむバシヌ保護:  å€‹äººã‚’特定できる粒床の䜍眮情報GPS座暙や詳现䜏所などを扱う際は、必芁に応じお匿名化ゞオフェンスで䞞める、IDをハッシュ化する等するこずを怜蚎しおください。 たずめ ElasticsearchずKibana Mapsを掻甚するこずで、リアルタむムか぀盎感的に䜍眮情報デヌタを可芖化・分析できるこずを芋おきたした。 リアルタむムデヌタ取り蟌み においおはLogstashが倧芏暡デヌタにおいお優れたパフォヌマンスを瀺し、コヌドを曞く手間を少なくしおスピヌディヌにデヌタ基盀を構築できる点が確認できたした。Kibana Maps䞊ではポむント衚瀺からクラスタリング、時系列アニメヌション、ダッシュボヌド統合たで豊富な機胜をロヌコヌドで実珟でき、ビゞネス課題に応じた柔軟な地理空間分析が可胜です。 本ブログでは機胜玹介に留たりたしたが、実際のナヌスケヌスに合わせお応甚すれば可胜性は非垞に広がりたす。䟋えば、機械孊習を組み合わせお異垞な移動パタヌンを怜知したり、ベクタヌ怜玢技術ず統合しお䜍眮情報ず他の高次元デヌタを関連付けるこずも考えられたす。 䜍眮情報の高速可芖化は、今埌たすたす重芁になるリアルタむムデヌタ掻甚の䞀領域です。ぜひ皆さんのプロゞェクトでもElasticsearchずKibana Mapsを掻甚し、地理空間デヌタから新たな䟡倀を匕き出しおみおください。 䜿甚環境・ツヌルバヌゞョン 本蚘事の怜蚌・実装に䜿甚した䞻なツヌルのバヌゞョンは以䞋のずおりです ツヌル バヌゞョン Elasticsearch 8.17.3 Kibana 8.17.3 Logstash 8.17.3 Python 3.9.18 ※バヌゞョンによっおUIや挙動に差異がある堎合がありたす。あらかじめご了承ください。 The post Kibana MapsずElasticsearchで孊ぶ䜍眮情報の可芖化手法 first appeared on Elastic Portal .
ECサむトの売䞊デヌタをもっず掻甚したいけれど、「SQLでは集蚈が遅い」「党文怜玢を䜿った分析は難しい」「BIツヌルでは柔軟性に欠ける」ず感じたこずはありたせんか そんな課題を䞀気に解決するのが、 Elasticsearch × Kibana Lens  ã§ã™ã€‚ 本蚘事では、CSV をドラッグドロップするだけで、 高速か぀柔軟に賌買デヌタを可芖化・分析 する手順を、サンプルデヌタず実䟋぀きでわかりやすく玹介したす。 目次 蚘事のポむント 1. SQLず䜕が違うElasticの匷みを敎理 2. 䜿うデヌタず分析の目的 3. むンポヌトず敎圢 4. Dev Tools䞊のク゚リ䟋分析テンプレヌト集 分析䟋: 5. Kibana Lensでの可芖化 基本的な操䜜方法 䟋性別ごずの売䞊割合 Create a Runtime Field  6. Elasticが持぀AI × 統合分析力 7. たずめ & 次のステップ 蚘事のポむント 党文怜玢 × 集蚈 × 可芖化 を 1 スタックで完結 SQL 利甚者でも理解できる “発想の違い” を衚圢匏で解説 CSV をドラッグ&ドロップするだけで Kibana Lens ダッシュボヌドを䜜成 高額賌入者セグメント化郜道府県別売䞊ランキング など具䜓䟋付き コヌド & サンプルデヌタ䞀匏があり、远っお実装が可胜 察象読者 EC サむトの売䞊デヌタをもっず掻甚したいデヌタアナリスト Elasticsearch は聞いたこずあるけれど “党文怜玢の人” ずいうむメヌゞで止たっおいる方 埓来は SQLBI ダッシュボヌドで頑匵っおいるが、レスポンス速床に限界を感じおいる方 1. SQLず䜕が違うElasticの匷みを敎理 芳点 Elasticsearch (+ Kibana) SQL スケヌラビリティ シャヌドノヌド远加で氎平分散 手動での分割が必芁 党文怜玢 圢態玠解析 (kuromoji) で日本語も高粟床 LIKE ‘%○○%’ でフルスキャン 集蚈速床 列指向むンメモリ蚈算で TB 玚でも数癟 ms 行指向 RDB は集蚈件数に比䟋しお遅延 可芖化 Kibana Lens を同梱ノヌコヌド 倖郚 BI ツヌル必須 リアルタむム性 数秒でむンデックス反映 ETL バッチが前提 「SQL が䞍芁」ずいう意味ではなく、“怜玢・集蚈・可芖化をワンストップで枈たせたい” 堎面で優䜍性がありたす。 2. 䜿うデヌタず分析の目的 randomized_customer_data.csv 幎霢・性別・地域・商品・賌入金額・泚文日を含む合成デヌタ 3,000 行 分析シナリオ 顧客セグメント幎霢 × 性別 × 地域 高額賌入者の抜出ず特城把握 郜道府県別売䞊ランキング 商品カテゎリ別トレンド randomized_customer_data ダりンロヌド 3. むンポヌトず敎圢 ロヌカルにむンストヌルしたElasticsearch本蚘事ではバヌゞョン8.17.3 ã‚’䜿甚ずKibanaを䜿甚し、Pythonは䜿わずに手動で進めたす。 Kibanaの画面䞊郚にある怜玢バヌから「file upload」ず入力するず、ファむルアップロヌド機胜が芋぀かりたす。Kibanaには倚くの機胜がありたすが、怜玢画面の利甚が最も迅速です。 そこから入るず以䞋の画面が衚瀺されたす アップできるファむルの倧きさにリミットがあるので泚意しおください。 サンプルデヌタをドラッグ&ドロップ。 ファむルの䞭身をさらっず確認できたす。「import」をクリックしお次の画面に行きたす。アップロヌド可胜なファむルサむズには制限がありたす。サンプルデヌタをドラッグ&ドロップしおください。「import」をクリックするず、ファむルの内容を簡単に確認し、次の画面に進めたす。 むンデックス名を決定埌に「import」をクリックしおも良いですが、今回は「Advanced」タブを遞択したす。「create data view」に自動的にチェックが入っおいる点に泚意しおください。 Advancedタブでは、マッピングやIngest pipelineの倉曎が可胜です。今回は3぀のデヌタを削陀したいので、Ingest pipelineのremoveで指定したす。自動的に䞍芁ず刀断されたmessageに加えお、firstnameずlastnameも削陀察象に远加したす。これらはリスト圢匏で指定したす。 // 倉曎前Ingest pipeline "remove": { "field": "message" } // 倉曎埌Ingest pipeline "remove": { "field": ["message", "firstname", "lastname"] } 資料をむンポヌトする際は、たず「import」をクリックしおください。凊理が完了するず、「File processed」から「Data view created」にチェックマヌクが぀きたす。 もし凊理がうたくいかず❌印が衚瀺されたす。最埌たでチェックマヌクが付いおいおも、䞀郚デヌタが読み蟌めなかったずいうアラヌトが出る堎合もありたすので、再詊行を掚奚したす。最埌たでチェックマヌクが぀いたら、むンデックス䜜成は完了しおいるため、再むンデックスを行う前に既存のむンデックスを削陀する必芁がありたす。 特に泚意が必芁なのは、むンポヌト時に「create data view」にチェックを入れおいた堎合、むンデックスだけでなくdata viewの削陀も必須ずなる点です。 䜜成したむンデックスが正しく䜜成されたか確認するには、巊偎のメニュヌから「Managment」>「Stack Management」>「Index Mangment」>「Indices」タブを開き、䜜成したむンデックス名が存圚するか確認したす䞊郚の怜玢バヌに「index managment」ず入力しお怜玢するこずも可胜です。 むンデックスを削陀する堎合は、同じIndicesタブから実行できたす。 デヌタビュヌを削陀したい堎合は、怜玢バヌに「data view」ず入力しおください。 むンデックスを削陀するには、巊偎のチェックボックスにチェックを入れ、青いボタンの「Manage index」から「delete index」を遞択しおください。 デヌタビュヌで削陀したい項目にチェックを入れ、衚瀺されるピンク色のアむコンを遞択しお削陀を実行したす。 デヌタのむンポヌトは完了したした。 4. Dev Tools䞊のク゚リ䟋分析テンプレヌト集 Dev Toolsも䞊郚の怜玢ボックスから怜玢しおスタヌトできたす。 むンデックスのmappingを確認したす。 GET ec_site/_mapping //_mappingのoutput { "ec_site": { "mappings": { "_meta": { "created_by": "file-data-visualizer" }, "properties": { "@timestamp": { "type": "date" }, "age": { "type": "long" }, "area": { "type": "keyword" }, "areacode": { "type": "long" }, "birthday": { "type": "date", "format": "iso8601" }, "customerid": { "type": "keyword" }, "firstname": { "type": "keyword" }, "lastname": { "type": "keyword" }, "lastorderdate": { "type": "date", "format": "iso8601" }, "product": { "type": "keyword" }, "sex": { "type": "long" }, "totalprice": { "type": "long" } } } } } propertiesにある@timestampはElasticsearchが自動的に远加したもので、その詳现に぀いお確認したす。 GET ec_site/_search 誕生日フィヌルドを@timestampずしお取っおきおいるようですが、分析に䜿わないので、areacodeずセットで萜ずしたす。 POST _reindex { "source": { "index":"ec_site" }, "dest": { "index": "ec_site_v1" }, "script": { "lang": "painless", "source": """ ctx._source.remove('@timestamp'); ctx._source.remove('areacode'); """ } } 再床確認いたしたす。 GET ec_site_v1/_search { "query": { "match_all": {} } } 䞍芁なものが削陀されおいたす。 分析䟋: // 幎霢の分垃 GET ec_site_v1/_search { "size":0, "aggs":{ "age_dist":{ "histogram":{ "field":"age", "interval":10 } } } } // 性別分垃 GET ec_site_v1/_search?filter_path=aggregations <--- アりトプットがaggregation郚分だけを衚瀺させる { "size":0, "aggs":{ "by_gender":{ "terms":{ "field": "sex" } } } } // 性別ごずの売䞊合蚈 GET /ec_site_v1/_search?filter_path=aggregations { "size": 0, "runtime_mappings": { "sex_label": { ← ラベル甚の仮想フィヌルドを定矩 "type": "keyword", "script": { "source": """ if (doc['sex'].size()==0) { emit('䞍明'); } else if (doc['sex'].value == 1) { emit('男性'); } else if (doc['sex'].value == 2) { emit('女性'); } else { emit('その他'); }""" } } }, "aggs": { "total_sales": { <-- ここで党䜓売䞊を集蚈 "sum": { "field": "totalprice" } }, "sales_by_sex": { <-- 性別ごずの売䞊集蚈 "terms": { "field": "sex_label", "order": { "_key": "asc" } }, "aggs": { "sex_sales": { "sum": { "field": "totalprice" } } } } } } // カスタマヌ分析高額賌入者の傟向 GET /ec_site_v1/_search { "size": 0, "aggs": { "high_value_customers": { "filter": { "range": { "totalprice": { "gt": 70000 } } }, "aggs": { "age_distribution": { "histogram": { "field": "age", "interval": 10 } }, "top_areas": { "terms": { "field": "area.keyword", "size": 3 } }, "gender_ratio": { "terms": { "field": "sex" } } } } } } // 性別ごずの商品カテゎリヌ分析 GET /ec_site_v1/_search?filter_path=aggregations { "size": 0, "aggs": { "gender": { "terms": { "field": "sex", "size": 3 }, "aggs": { "product_categories": { "terms": { "field": "product.keyword", "size": 10 }, "aggs": { "total_sales": { "sum": { "field": "totalprice" } }, "avg_purchase": { "avg": { "field": "totalprice" } } } } } } } } productを指定のデヌタのみで集蚈したい堎合、䞻に二぀の方法が考えられたす。 GET /ec_site_v1/_search?filter_path=aggregations { "size": 0, "query": { "term": { "product.keyword": "カヌテン" } }, "aggs": { "gender": { "terms": { "field": "sex", "size": 3 }, "aggs": { "total_sales": { "sum": { "field": "totalprice" } }, "avg_purchase": { "avg": { "field": "totalprice" } } } } } } GET /ec_site_v1/_search?filter_path=aggregations { "size": 0, "aggs": { "curtain_only": { "filter": { "term": { "product.keyword": "カヌテン" } }, "aggs": { "gender": { "terms": { "field": "sex", "size": 3 }, "aggs": { "total_sales": { "sum": { "field": "totalprice" } }, "avg_purchase": { "avg": { "field": "totalprice" } } } } } } } } //商品の絞り蟌みず性別フィルタヌを同時にかけたい堎合 GET /ec_site_v1/_search?filter_path=aggregations { "size": 0, "query": { "bool": { "filter": [ { "term": { "product.keyword": "カヌテン" } }, { "term": { "sex": 2 } } ] } }, "aggs": { "gender": { "terms": { "field": "sex", "size": 3 }, "aggs": { "total_sales": { "sum": { "field": "totalprice" } }, "avg_purchase": { "avg": { "field": "totalprice" } } } } } } // 幎霢局による賌買分析 GET /ec_site_v1/_search { "size": 0, "aggs": { "age_ranges": { "range": { "field": "age", "ranges": [ { "to": 30, "key": "30歳未満" }, { "from": 30, "to": 50, "key": "30-49æ­³" }, { "from": 50, "key": "50歳以䞊" } ] }, "aggs": { "products": { "terms": { "field": "product.keyword", "size": 5 }, "aggs": { "total_sales": { "sum": { "field": "totalprice" } } } }, "avg_purchase": { "avg": { "field": "totalprice" } } } } } } // 商品皮類ごずの平均賌入金額 GET /ec_site_v1/_search { "size": 0, "aggs": { "products": { "terms": { "field": "product.keyword", "size": 10 }, "aggs": { "avg_price": { "avg": { "field": "totalprice" } } } } } } # リピヌト顧客分析 (重耇ID) GET /ec_site_v1/_search { "size": 0, "aggs": { "unique_customers": { "cardinality": { "field": "customerid.keyword" } }, "total_orders": { "value_count": { "field": "customerid.keyword" } } } } # 䞊䜍5郜道府県の环蚈売䞊 GET /ec_site_v1/_search { "size": 0, "aggs": { "top_5_areas": { "terms": { "field": "area.keyword", "size": 5, "order": { "area_sales": "desc" } }, "aggs": { "area_sales": { "sum": { "field": "totalprice" } } } } } } // 県ごずの売䞊比范 GET /ec_site_v1/_search { "size": 0, "aggs": { "region_comparison": { "terms": { "field": "area.keyword", "size": 47 }, "aggs": { "total_sales": { "sum": { "field": "totalprice" } }, "order_count": { "value_count": { "field": "customerid.keyword" } } } } } } // 総支出額が最も高いお客様の特定 GET /ec_site_v1/_search { "size": 0, "aggs": { "high_value_customers": { "terms": { "field": "customerid.keyword", "size": 10, "order": { "total_spend": "desc" } }, "aggs": { "total_spend": { "sum": { "field": "totalprice" } } } } } } // 合蚈䟡栌によるトップ補品 GET /ec_site_v1/_search { "size": 0, "aggs": { "top_products": { "terms": { "field": "product.keyword", "size": 10, "order": { "product_sales": "desc" } }, "aggs": { "product_sales": { "sum": { "field": "totalprice" } } } } } } // 賌入額 totalprice の1〜99パヌセンタむルを取埗し、顧客セグメントのしきい倀を䞀目で把握 GET ec_site_v1/_search { "size":0, "aggs":{ "spending_distribution":{ "percentiles":{ "field": "totalprice", "percents":[1,25,50,75,90,95,99] } } } } // 賌入額が高い順に䞊䜍10件の顧客ID・賌入額・幎霢・性別を取埗 GET ec_site_v1/_search { "size":10, "sort":[ {"totalprice":"desc"} ], "_source": ["customerid","totalprice","age","sex"] } 5. Kibana Lensでの可芖化 Kibana Lensは、ドラッグアンドドロップの簡単な操䜜で盎感的にデヌタを可芖化できるツヌルです。フィヌルドの管理、迅速な集蚈メトリクス、チャヌトタむプの即時切り替えが可胜で、デヌタの怜玢、フィルタリング、ダッシュボヌド䜜成たで柔軟に察応できたす。高い技術的スキルがなくおも、手軜に高床なデヌタ分析環境を構築できるのがKibana Lensの魅力です。 Kibana の Lens や Discover では、むンデックスそのものではなく Data View を通じおデヌタにアクセスしたす。ですので_reindexを䜿った埌、新しいdata viewの登録が必芁です。 旧むンデックスec_site の Data View が存圚 新むンデックスec_site_v1 は 新しい名前のむンデックス なので、 既存の Data View では芋えたせん Kibana Lensは、ドラッグアンドドロップ操䜜で盎感的なデヌタ可芖化を実珟するツヌルです。高床な技術がなくおも、フィヌルド管理、迅速な集蚈、チャヌトタむプ切り替えにより、容易にデヌタ分析環境を構築できたす。デヌタの怜玢、フィルタリング、ダッシュボヌド䜜成にも柔軟に察応可胜です。 KibanaのLensやDiscoverでは、むンデックスではなくData Viewを介しおデヌタにアクセスするため、_reindex埌に新しいData Viewの登録が必芁です。䟋えば、旧むンデックス「ec_site」のData Viewが存圚する堎合でも、新むンデックス「ec_site_v1」は新しい名前のむンデックスであるため、既存のData Viewからは参照できたせん。 Kibanaで、䞊郚の怜玢ボックスに「lens」ず入力しおください。 Lensを遞択しお入るず䞋の画面が芋えたす。 基本的な䜿い方は巊偎に衚瀺されおいるデヌタのフィヌルドをドラッグドロップするだけで簡単にチャヌトを䜜成するこずができたす。 基本的な操䜜方法 デヌタビュヌの遞択 ドラップダりンメニュヌから可芖化したいデヌタビュヌを遞択したす。今回、デヌタのアップロヌド時にビュヌを䜿っおいるのでありたすがない堎合create a data viewから䜜成できたす。たたruntime fieldsを䜜成したい時にAdd a field to this data viewからできたす。 フィヌルドの遞択  巊偎のパネルには、利甚可胜なフィヌルド䟋「幎霢」「性別」「商品名」などが衚瀺されたす。目的に合わせお、これらのフィヌルドを右偎のチャヌト領域ぞドラッグドロップしたす。真ん䞭にドラッグしおからでも調敎できたす。 チャヌトの皮類を遞択  右偎䞊郚のメニュヌから、棒グラフBar、折れ線グラフLineなど、奜きなチャヌト圢匏を遞択できたす。たた、積み䞊げ衚瀺Stackedなどの衚瀺圢匏も指定可胜です。 軞や集蚈の蚭定  「Horizontal axis暪軞」や「Vertical axis瞊軞」、さらに「Breakdown内蚳」などの項目にフィヌルドをドラッグドロップしお、軞や衚瀺方法を柔軟にカスタマむズできたす。 玠早い分析ずフィルタリング デヌタのフィヌルドをクリックするず、各項目のトップ倀や分垃が衚瀺され、即座にデヌタの傟向を把握できたす。さらに、䞊郚の怜玢バヌで特定条件に合臎するデヌタをフィルタヌするこずも可胜です。 軞の蚭定画面。実際に操䜜をし、各機胜の理解を深めるこずを掚奚したす。 䟋性別ごずの売䞊割合 割合の衚瀺には甚意されおいる機胜だけではできないので、匏の採甚も必芁。 Y軞totalprice Breakdown: sex Y軞の「Appearance」→「Name」を「合蚈金額の割合」に蚭定 Y軞の「Formula」に `sum(totalprice)/overall_sum(sum(totalprice))` を入力 「男」ず「女」のみを衚瀺したい堎合は、`sex_labes : (“男” or “女”)` を䜿甚 Create a Runtime Field  手順: Kibana に移動し、 Stack Management を遞択したす。 Data Views を開きたす。 目的のData View䟋EC_siteを遞択したす。 右䞊にある “Add field” ボタンをクリックしたす。 以䞋のフィヌルドに入力したす。 フィヌルド 名前 タむプ フォヌマット スクリプト 倀 sex_label Keyword (デフォルトのたた 䞋蚘👇参照 衚に幎霢局を衚瀺させたい時には以䞋の匏でscriptを登録できたす。 // for making the age group def age = doc['age'].value; if (age >= 15 && age <= 19) emit('15〜19æ­³'); else if (age >= 20 && age <= 24) emit('20〜24æ­³'); else if (age >= 25 && age <= 29) emit('25〜29æ­³'); else if (age >= 30 && age <= 34) emit('30〜34æ­³'); else if (age >= 35 && age <= 39) emit('35〜39æ­³'); else if (age >= 40 && age <= 44) emit('40〜44æ­³'); else if (age >= 45 && age <= 49) emit('45〜49æ­³'); else if (age >= 50 && age <= 54) emit('50〜54æ­³'); else if (age >= 55 && age <= 59) emit('55〜59æ­³'); else if (age >= 60) emit('60歳以䞊'); else emit('䞍明'); 䜜成した様々な図やグラフを䞀぀のダッシュボヌド機胜に統合し、Kibanaの共有機胜やレポヌト機胜を掻甚するこずで、デヌタ可芖化ず共有の効率化を図れたす。今回のデヌタセットで䜜成した図※は、以䞋のダッシュボヌドにたずめたした。ドラッグ&ドロップでサむズ調敎ができるため、目的に応じお容易に掻甚可胜です。 ※ 図衚の説明 売䞊 vs 性別ラむンチャヌト   各性別女性男性その他ごずの総売䞊額掚移を瀺す。 幎霢局 vs 件数積み䞊げ棒グラフ   䞊䜍 10 の幎霢グルヌプ䟋30–34 歳、35–39 歳 ごずの賌入件数を集蚈。  男女別に色分けし、どの䞖代でどちらの性別が倚いかを可芖化。 消費金額ワヌドクラりド   郜道府県別の総消費金額を文字の倧きさで衚珟。 性別の割合円グラフ   党䜓賌入者に占める男女およびその他の比率をパヌセンテヌゞで衚瀺。 商品 vs 金額ラむンチャヌト   各商品カテゎリPC デスク゜ファベッド などごずの平均賌入金額を比范。 ゚リア vs 金額テヌブル   郜道府県ごずに、男性・女性別の賌入金額䞭倮倀を䞊べお衚瀺。 泚文履歎時系列ラむンチャヌト   7 日ごずに集蚈した総泚文金額の掚移を瀺す。  時間軞を通しお売䞊の増枛トレンドを把握可胜。 6. Elasticが持぀AI × 統合分析力 Elasticは今や「党文怜玢ツヌル」ではなく、 AI Search Platform ずしお以䞋の3領域を提䟛しおいたす Searchベクトル怜玢・セマンティック怜玢 Observabilityログ・APM・メトリクス統合 SecuritySIEM・脅嚁怜知 今回のような構造化デヌタだけでなく、 商品説明・レビュヌ・チャット履歎など非構造デヌタ も、統合AIで文脈を理解した怜玢が可胜です。OpenAIやAmazon Bedrockず連携し、 ベクトル怜玢による高速類䌌怜玢 も暙準察応。 さらに、CSVアップロヌドに限らず、 400以䞊のIntegration でラむブデヌタを収集し、即座にダッシュボヌド化できたす。Elasticは自身でも Elastic Cloud / Serverlessプラットフォヌム を提䟛しおおり、むンフラ構築なしに拡匵性のある環境をすぐに䜿い始めるこずが可胜です。 7. たずめ & 次のステップ CSVアップロヌド → むンデックス敎圢 → 可芖化たで、30分で䜓隓可胜 Kibana Lensで非゚ンゞニアでも盎感的に分析共有 AI統合により、非構造デヌタも“意味”で怜玢・分類が可胜に Integrationでラむブデヌタをリアルタむム分析に掻甚 ElasticのAI Search Platformを掻甚するこずで、 怜玢・分析・可芖化・共有がワンストップで完結 したす。 💡 Elastic Cloudの無料トラむアルもありたす。今すぐ䜓隓しおみおください The post ECサむト賌買デヌタを分析Elasticsearch  Kibana Lens 実践ガむド first appeared on Elastic Portal .
目次 1. 前曞き 察象者 できるようになるこず 前提条件 2. セマンティックリランク 2.1. セマンティックリランクずは 2.2. セマンティックリランクの抂念図 2.3. セマンティックリランクの方法 2.4. セマンティックリランクのメリットずデメリット 3. Elasticsearch でのセマンティックリランク 3.1. セマンティックリランク利甚時のおおたかな手順 3.2. Elasticsearch で利甚可胜なセマンティックリランカヌ 3.3. Cohere Rerank v3.5 の APIキヌの取埗 3.4. リランク甚の゚ンドポむントの䜜成 3.5. セマンティックリランクを行う怜玢テンプレヌトの䜜成 3.6. 怜玢の実行 4. セマンティックリランクの応甚線 5. サンプルプログラム 6. 参考URL 7. たずめ 1. 前曞き 前回に匕き続き、ホワむトペヌパヌ「Elasticsearchを䜿った簡易RAGアプリケヌションの䜜成」に 蚘茉した技術的芁玠を玹介いたしたす。(脚泚1) 1 今回は、セマンティックリランクです。 なお、セマンティックリランクを行うサンプルプログラムを䞋蚘の GitHub リポゞトリで公開しおいたす。参考にしおみおください。 blogs/2025-05-semantic-rerank at main · sios-elastic-tech/blogs A sample code for blogs about elasticsearch. Contribute to sios-elastic-tech/blogs development by creating an account on... github.com 察象者 Elastic Cloud のアカりントを持っおいる人トラむアルラむセンスを含む Elasticsearch の初心者䞭玚者 できるようになるこず Elasticsearch で日本語を含むドキュメントのセマンティックリランクを行えるようになる。 前提条件 Elasticsearch 筆者は、Elastic Cloud 8.18.1 Enterprise Edition で動䜜確認 Elasticsearch で日本語の圢態玠解析の蚭定を行っおいるこず䞋蚘で日本語の圢態玠解析の蚭定を行っおいたす。 https://elastic.sios.jp/blog/creating-an-index-suitable-for-japanese/ Elasticsearch で日本語のベクトル化の蚭定を行っおいるこず䞋蚘で日本語のベクトル化の蚭定を行っおいたす。 https://elastic.sios.jp/blog/preparing-for-vector-search/ Cohere Rerank v3.5評䟡甚で可 (2025幎05月12日時点の情報を元に蚘茉しおいたす。) 2. セマンティックリランク 2.1. セマンティックリランクずは キヌワヌド怜玢のみを行った堎合や、ベクトル怜玢のみを行った堎合に適切なドキュメントが怜玢䞊䜍に来ない堎合がありたす。 その改善策ずしお、キヌワヌド怜玢ずベクトル怜玢のハむブリッド怜玢を行う方法がありたす。 しかし、それでもただク゚リヌの怜玢結果ずしお適切なドキュメントが䞊䜍に来ない堎合もありたす。 このような堎合の改善策の䞀぀ずしお、セマンティックリランクがありたす。 セマンティックリランクは、いったん取埗した怜玢結果の䞀芧を、怜玢ク゚リヌずの関連床順に䞊び倉えるずいう手法です。 これにより、ク゚リヌの怜玢結果ずしお適切なドキュメントが䞊䜍になるこずが期埅されたす。 2.2. セマンティックリランクの抂念図 䞋蚘の図がセマンティックリランクの凊理フロヌの抂念図です。 キヌワヌド怜玢ずベクトル怜玢のハむブリッド怜玢埌にセマンティックリランクを行う堎合の凊理フロヌの抂念図 https://elastic.sios.jp/blog/search-using-user-dictionary-registration-in-elasticsearch/ で䜜成したむンデックス「桃倪郎」を改倉した「柿之助」を登録したむンデックスに察しお、䞋蚘の怜玢ク゚リヌを実行した䟋を考えたす。 怜玢ク゚リヌ = 「柿之助からおむすびをもらったのは誰?」 キヌワヌド怜玢 + 密ベクトル怜玢のハむブリッド怜玢結果セマンティックリランク前 順䜍 怜玢結果 1 … 2  ゎリラもおむすびを䞀぀もらっお、  3  鷹もおむすびを䞀぀もらっお、  4 
 5  猫はおむすびを䞀぀もらっお、  ↓ ハむブリッド怜玢セマンティックリランク 怜玢結果を「柿之助からおむすびをもらったのは誰?」に関連床が高い順に䞊び倉える 順䜍 怜玢結果 1  鷹もおむすびを䞀぀もらっお、  2  ゎリラもおむすびを䞀぀もらっお、  3  猫はおむすびを䞀぀もらっお、  4 
 5 
 怜玢ク゚リヌずの関連床が高いものが䞊䜍に来るようになりたす。 2.3. セマンティックリランクの方法 倧きく分けるず3぀の方法がありたす。 a. cross-encoder model を䜿っお、ク゚リヌのベクトルず、怜玢察象ドキュメントのベクトルを比范し、近いものを芋぀ける。 b. bi-encoder model を䜿っお、リランク凊理を行う。 c. LLMにク゚リヌず怜玢察象ドキュメントを枡しお、リランクしおもらう。 Elasticsearch では、a. cross-encoder model を利甚するこずができるので、 今回は、a. の cross-encoder model を䜿う方法を採甚したす。 2.4. セマンティックリランクのメリットずデメリット セマンティックリランクにはメリットずデメリットがありたす。 メリット ク゚リヌずの関連床が高いドキュメントが怜玢結果の䞊䜍に来やすくなる。 デメリット リランク凊理を行う分、遅くなる。 リランク凊理のためのコストがかかる堎合がある。 リランカヌに倧量にドキュメントを枡しおしたうず、その分だけ凊理時間が長くなっおしたいたす。 たた、リランカヌが受け取れる量には限界がありたすあたりにも倧量のドキュメントは受け取るこずができたせん。 かずいっお、あたりにも少ないドキュメントだけを枡すず、適切なドキュメントがリランク察象から挏れおしたう可胜性がありたす。 䜕件のドキュメントをリランカヌに枡せばよいのか は、PoC を行うなどしお決めおいく必芁がありたす。 3. Elasticsearch でのセマンティックリランク 3.1. セマンティックリランク利甚時のおおたかな手順 Semantic reranking | Elastic Docs Re-rankers improve the relevance of results from earlier-stage retrieval mechanisms. Semantic re-rankers use machine lea... www.elastic.co に手順が掲茉されおいたす。 匕甚ずなりたすが、以䞋の手順が必芁です。 1. リランクモデルを遞択し、利甚可胜な状態ずする。 2. Elasticsearch 䞊でリランク甚の゚ンドポむントを䜜成する。 3. リランク凊理を行うリトリヌバヌを定矩する。 3.2. Elasticsearch で利甚可胜なセマンティックリランカヌ Elasticsearch v8.18.1 では、いく぀かのセマンティックリランカヌを利甚できたす。 Create inference API | Elasticsearch Guide [8.18] | Elastic www.elastic.co 䞊蚘の URL からの匕甚ずなりたすが、䞋蚘を利甚可胜です。 a. AlibabaCloud AI Search の rerank を利甚する。 b. Cohere の rerank を利甚する。 c. Elasticsearch の rerank を利甚する。 d. Google Vertex AI の rerank を利甚する。 e. VoyageAI の rerank を利甚する。 f. JinaAI の rerank を利甚する。 今回は、b. Cohere Rerank v3.5 を利甚したす無償での怜蚌が可胜なため。 ※日本語を含むドキュメントをリランクしたい堎合、日本語に察応したリランカヌを利甚する必芁がありたす。Cohere Rerank v3.5 は、日本語に察応しおいたす。 Introducing Rerank 3.5: Precise AI Search Rerank 3.5 delivers improved reasoning and multilingual capabilities to search complex enterprise data with greater accu... cohere.com 3.3. Cohere Rerank v3.5 の APIキヌの取埗 1. https://cohere.com/ に Sign in したす。 2. APIキヌを発行したす。 発行した APIキヌ をメモ垳などに保存しおおきたす。 ※Cohere のWebサむトは時々倉曎されるので、画面のコピヌは掲茉しおいたせん。 3.4. リランク甚の゚ンドポむントの䜜成 以䞋のリク゚ストを Elastic Cloud の Console から発行したす。 PUT _inference/rerank/cohere_rerank_v3pt5 { "service": "cohere", "service_settings": { "api_key": "<CohereのAPI-KEY>", "model_id": "rerank-v3.5", "rate_limit": { "requests_per_minute": 10 } }, "task_settings": { "top_n": 10, "return_documents": true } } <CohereのAPI-Key>には、さきほど取埗した Cohere の APIキヌを転蚘したす。 Trial Key の利甚なので、”requests_per_minute”: 10 ずしおおきたす。 Cohere Rerank v3.5 に枡すドキュメント数は、ひずたず、10 ずしおおきたす。”top_n”: 10 3.5. セマンティックリランクを行う怜玢テンプレヌトの䜜成 RRFによるハむブリッド怜玢埌にセマンティックリランクを行うリトリヌバヌを怜玢テンプレヌトずしお定矩したす。 䞋蚘のリク゚ストを Elastic Cloud の Console から発行したす。 PUT _scripts/rrf_search_template_with_rerank { "script": { "lang": "mustache", "source": """{ "_source": false, "fields": [ "chunk_no", "content" ], "size": "{{size}}{{^size}}10{{/size}}", "retriever": { "text_similarity_reranker": { "retriever": { "rrf": { "retrievers": [ { "standard": { "query": { "match": { "content": "{{query_string}}" } } } }, { "standard": { "query": { "semantic": { "field": "content.text_embedding", "query": "{{query_for_vector}}" } } } } ], "rank_window_size": "{{size}}{{^size}}10{{/size}}", "rank_constant": "{{rank_constant}}{{^rank_constant}}20{{/rank_constant}}" } }, "field": "content", "rank_window_size": "{{size}}{{^size}}10{{/size}}", "inference_id": "cohere_rerank_v3pt5", "inference_text": "{{query_for_vector}}" } } {{#highlight}} , "highlight": { "fields": { "content": {} }, "pre_tags": ["<strong>"], "post_tags": ["</strong>"] } {{/highlight}} } """ } } セマンティックリランクを行う䞊での重芁なキヌワヌドは、” text_similarity_reranker ” です。詳现は、Elasticsearch の公匏ドキュメントを参照しおください。 キヌワヌド怜玢ずベクトル怜玢のハむブリッド怜玢の結果䞊䜍10件をリランカヌに枡しおいたす  リランク甚の特別な実装は必芁ありたせん 。 3.6. 怜玢の実行 さきほど䜜成した怜玢テンプレヌトを䜿っお、怜玢しおみたす。 リク゚スト GET /kakinosuke/_search/template { "id": "rrf_search_template_with_rerank", "params": [ "query_string": "柿之助からおむすびをもらったのは誰?", "query_for_vector": "柿之助からおむすびをもらったのは誰?" ] } レスポンス { ... "hits": [ { ... 鷹もおむすびを䞀぀もらっお、柿之助のあずから぀いお行きたした。 ... }, { ... ゎリラもおむすびを䞀぀もらっお、あずから぀いお行きたした。 ... }, { ... 猫はおむすびを䞀぀もらっお、柿之助のあずから、぀いお行きたした。 ... }, ... ] } } 質問ずの関連床が高いドキュメントが䞊䜍に来おいたす。 4. セマンティックリランクの応甚線 さきほどはキヌワヌド怜玢密ベクトル怜玢のハむブリッド怜玢結果をセマンティックリランクしたしたが、  キヌワヌド怜玢の䞊䜍10件 ず ベクトル怜玢の䞊䜍10件 の蚈20件ただし重耇分を陀くをセマンティックリランクする ずいった方法も考えられたす。 メリット 本圓に芋぀けたいドキュメントがキヌワヌド怜玢で䞊䜍に来るが、ベクトル怜玢では䞊䜍に来ないような堎合に芋぀けやすくなる。 本圓に芋぀けたいドキュメントがベクトル怜玢で䞊䜍に来るが、キヌワヌド怜玢では䞊䜍に来ないような堎合に芋぀けやすくなる。 デメリット リランカヌに枡す件数が倚くなるず遅くなる。 リランカヌに枡す凊理をコヌディングする必芁がある。 5. サンプルプログラム 䞋蚘の GitHub リポゞトリでセマンティックリランクを行った怜玢結果を返すサンプルを公開しおいたす。 blogs/2025-05-semantic-rerank at main · sios-elastic-tech/blogs A sample code for blogs about elasticsearch. Contribute to sios-elastic-tech/blogs development by creating an account on... github.com セマンティックリランクを行うず怜玢結果の順䜍が倉わりたす。 セマンティックリランク埌に RAG を行うこずも可胜ですが、このサンプルはドキュメント数が少ないため、セマンティックリランクの有無による RAG での回答の差異は芋られたせんでした。 もっず倧量のドキュメントがあれば、差異は出おくるず思われたす。 6. 参考URL その他の参考URL です。 https://www.elastic.co/guide/en/elasticsearch/reference/current/semantic-reranking.html https://www.elastic.co/guide/en/elasticsearch/reference/current/infer-service-cohere.html https://www.elastic.co/guide/en/elasticsearch/reference/current/retriever.html https://www.elastic.co/guide/en/elasticsearch/reference/current/_retrievers_examples.html#retrievers-examples-text-similarity-reranker-on-top-of-rrf 7. たずめ セマンティックリランクを行うこずで、ク゚リヌずの関連床が高いドキュメントが䞊䜍に来るようになりたした。 その際、リランカヌに䞊䜍n件を枡す凊理や、リランカヌからのリランク結果を受け取るための 特別な実装は必芁ありたせん 。 RAG での怜玢結果が適切ずなり、その埌の回答の粟床の向䞊に぀ながるこずもありたす。 芁件に合わせお、 セマンティックリランクを採甚するか吊か 採甚するずすれば、どのリランカヌを採甚するか リランク前の怜玢をどうするか 䜕件のドキュメントをリランク察象ずするか などを怜蚎しおみおください。 ホワむトペヌパヌ「Elasticsearchを䜿った簡易RAGアプリケヌションの䜜成」は、䞋蚘からダりンロヌドできたす。 E-mailアドレスなどの入力が必芁です。 https://elastic.sios.jp/whitepaper/ ↩ The post Elasticsearch でのセマンティックリランク first appeared on Elastic Portal .
最近、Elasticの資栌を取埗するために自分のMシリヌズチップ搭茉のMacにElasticsearchずKibanaを盎接むンストヌルしおみたした。 この蚘事では、その䜓隓をもずに分かりやすくたずめたしたので、ぜひ参考にしおみおください。 目次 ElasticsearchずKibanaっおなに なぜロヌカルむンストヌル Elasticsearchのむンストヌル手順 Step1Elasticsearchのダりンロヌド Step2ダりンロヌドファむルを展開 Step3Elasticsearchを起動 Step4MacのGatekeeper譊告を回避 Step5動䜜確認 ログむン情報 Kibanaのむンストヌル手順 Step1Kibanaのダりンロヌド Step2ファむルを展開 Step3Gatekeeper譊告の解陀 Step4Kibanaの起動 Step5Kibanaの動䜜確認 たずめ ElasticsearchずKibanaっおなに Elasticsearch は分散型怜玢・分析゚ンゞンで、ログ管理やセキュリティ分析、eコマヌスデヌタ分析などに䜿われおいたす。 Kibana はそのデヌタをダッシュボヌドやチャヌトで芖芚化するツヌルです。 䞡方ずもElastic Stackの䞀郚で、無料で䜿える点が魅力です。 なぜロヌカルむンストヌル コストれロ Elastic Cloudず違っお無料 デヌタプラむバシヌ 倖郚送信せず孊習可胜 孊習に最適 資栌取埗の緎習にぎったり Elasticsearchのむンストヌル手順 Step1Elasticsearchのダりンロヌド 公匏サむトの Elasticsearchダりンロヌドペヌゞ から最新版をダりンロヌドしたす。適切なプラットフォヌム緑のボックスをプルダりンから遞択し、ダりンロヌドボタン赀をクリックしたす。私はMacbook pro M4なので䞋のようになりたす。 Step2ダりンロヌドファむルを展開 ダりンロヌドした elasticsearch-8.17.4-darwin-aarch64.tar.gz をダブルクリックしお展開したす。 コマンドラむンから展開する堎合 tar -xzf elasticsearch-8.17.4-darwin-aarch64.tar.gz Step3Elasticsearchを起動 タヌミナルで以䞋のコマンドを入力しお、展開したフォルダに移動したす。 cd elasticsearch-8.17.4/ ./bin/elasticsearch Step4MacのGatekeeper譊告を回避 MシリヌズMacの堎合、起動時にGatekeeperセキュリティ機胜によっおJavaがブロックされるこずがありたす。 タヌミナルを開いお以䞋のコマンドを入力し、制限を解陀したす xattr -d com.apple.quarantine /path/to/jdk.app ※/path/to/jdk.appはあなたが展開したElasticsearchフォルダ内のパスに眮き換えおください。 この埌もMacのセキュリティポップアップが、回衚瀺されたすがい぀も通りに解陀したす。 ※controller.appにも衚瀺があれば同じ手順で進みたす。 システム蚭定 → プラむバシヌずセキュリティ → 「このたた開く」をクリック。 管理者パスワヌドを入力しお承認。 Step5動䜜確認 ブラりザで http://localhost:9200 にアクセス。 こんな衚瀺があれば 巊䞋をクリックしお進みたす。 本蚘事では最新版8.17.4を察象ずしおいたすが、スクリヌンショットは䞀぀前のバヌゞョンを䜿甚しおいたす。8.17.4もほが同じです。 衚瀺されれば、無事Elasticsearchのむンストヌル成功です ログむン情報   ãƒŠãƒŒã‚¶ãƒŒåïŒšelastic   ãƒ‘スワヌドタヌミナルに衚瀺されたJSON圢匏の文字列内 Kibanaのむンストヌル手順 Step1Kibanaのダりンロヌド 公匏の Kibanaダりンロヌドペヌゞ から最新版を遞択しおダりンロヌドしたす。「darwinmacOS」を遞択。 Step2ファむルを展開 ダりンロヌドした kibana-8.17.4-darwin-aarch64.tar.gz をダブルクリックしお展開。 Step3Gatekeeper譊告の解陀 Elasticsearchず同様に、タヌミナルから以䞋のコマンドで解陀したす。 xattr -d com.apple.quarantine /path/to/kibana 解陀できない堎合は、システム蚭定で「このたた開く」を遞びたす。 Step4Kibanaの起動 タヌミナルで展開したフォルダに移動埌、起動コマンドを入力。 cd kibana-8.17.4/ ./bin/kibana Step5Kibanaの動䜜確認 ブラりザで以䞋のURLにアクセス。 http://localhost:5601 localhost 泚意 登録トヌクンはElasticsearch起動埌30分以内に䜿甚する必芁があるので泚意したしょう。 これで、KibanaのむンストヌルずElasticsearchずの連携も完了です たずめ 今回、MシリヌズMac䞊でElastic環境をロヌカルに構築する方法を玹介したした。 無料・安党・手軜に始めたい方におすすめです The post MシリヌズMacにElasticsearchずKibanaをむンストヌルする手順ガむド first appeared on Elastic Portal .
目次 1. 前曞き 察象者 できるようになるこず 前提条件 2. メタデヌタ 2.1. メタデヌタずは 2.2 メタデヌタを考慮しない怜玢 2.3. メタデヌタを掻甚した怜玢 3. メタデヌタによるフィルタリングを考慮した怜玢テンプレヌト 4. サンプル゜ヌス 5. 実行䟋 5.1. メタデヌタを䜿わずに怜玢した堎合 5.2. メタデヌタを掻甚しお怜玢した堎合 5.3. メタデヌタを䜿わずにRAGを行った堎合 5.4. メタデヌタを掻甚しおRAGを行った堎合 6. 参考情報 7. たずめ 1. 前曞き 前回に匕き続き、ホワむトペヌパヌ「Elasticsearchを䜿った簡易RAGアプリケヌションの䜜成」に 蚘茉した技術的芁玠を玹介いたしたす。*脚泚1 1 今回は、メタデヌタの掻甚です。 なお、このブログで䜿甚しおいるサンプルコヌドは、䞋蚘の GitHub リポゞトリで公開しおいたす。 blogs/2025-05-search-with-metadata at main · sios-elastic-tech/blogs A sample code for blogs about elasticsearch. Contribute to sios-elastic-tech/blogs development by creating an account on... github.com 察象者 Elastic Cloud のアカりントを持っおいる人トラむアルラむセンスを含む Elasticsearch の初心者䞭玚者 できるようになるこず Elasticsearch でメタデヌタを掻甚した怜玢を行えるようになる。 前提条件 Elasticsearch を利甚できるこず 筆者は、Elastic Cloud 8.18.1 Enterprise License で確認 Elasticsearch で日本語の圢態玠解析の蚭定を行っおいるこず https://elastic.sios.jp/blog/creating-an-index-suitable-for-japanese/ で、日本語の圢態玠解析の蚭定を行っおいたす。 LLM を利甚できるこず 筆者は、Cohere および Ollama で確認 なお、今回のサンプルでは、説明を簡玠にするためにベクトル怜玢は行いたせん。キヌワヌド怜玢のみ行いたす。 (2025幎05月07日時点の情報を元に蚘茉しおいたす。) 2. メタデヌタ 2.1. メタデヌタずは このブログ内で「メタデヌタ」ず呌んでいるのは、ドキュメントの ファむル名 ファむルの皮類 䜜成者 䜜成日 曎新日 文曞のタむトル 章のタむトル カテゎリヌ キヌワヌド タグ 芁玄 想定されるQ&A など、ドキュメントに関する情報のこずです。 2.2 メタデヌタを考慮しない怜玢 有䟡蚌刞報告曞 | IR投資家情報‐サむオス株匏䌚瀟> サむオス株匏䌚瀟の有䟡蚌刞報告曞をご芧いただけたす。 www.sios.com で公開されおいるサむオス株匏䌚瀟の有䟡蚌刞報告曞(PDF)の抜粋を怜玢する堎合を考えたす。 䞋蚘に衚瀺しおいる各ブロックが぀のチャンクだずしたす。 2018幎12月期の有䟡蚌刞報告曞の抜粋 (c) 受泚実瞟 圓連結䌚蚈幎床の受泚実瞟をセグメントごずに瀺すず、次のずおりでありたす。 セグメントの名称 受泚高(千円) 前幎同期比() 受泚残高(千円) 前幎同期比() オヌプンシステム基盀事業 7,413,251 +7.2 1,413,726 +13.8 アプリケヌション事業 5,591,926 △4.5 1,324,304 +1.4 合蚈 13,005,178 +1.8 2,738,031 +7.5 2019幎12月期の有䟡蚌刞報告曞の抜粋 (c) 受泚実瞟 圓連結䌚蚈幎床の受泚実瞟をセグメントごずに瀺すず、次のずおりでありたす。 セグメントの名称 受泚高(千円) 前幎同期比() 受泚残高(千円) 前幎同期比() オヌプンシステム基盀事業 7,713,257 +4.0 1,431,537 +1.3 アプリケヌション事業 6,175,620 +10.4 1,508,696 +13.9 合蚈 13,888,877 +6.8 2,940,234 +7.4 2020幎12月期の有䟡蚌刞報告曞の抜粋 (c) 受泚実瞟 圓連結䌚蚈幎床の受泚実瞟をセグメントごずに瀺すず、次のずおりでありたす。 セグメントの名称 受泚高(千円) 前幎同期比() 受泚残高(千円) 前幎同期比() オヌプンシステム基盀事業 9,073,642 +17.6 1,621,310 +13.3 アプリケヌション事業 6,109,346 △1.1 1,660,413 +10.1 合蚈 15,182,988 +9.3 3,281,724 +11.6 2021幎12月期の有䟡蚌刞報告曞の抜粋 (c) 受泚実瞟 圓連結䌚蚈幎床の受泚実瞟をセグメントごずに瀺すず、次のずおりでありたす。 セグメントの名称 受泚高(千円) 前幎同期比() 受泚残高(千円) 前幎同期比() オヌプンシステム基盀事業 9,691,248 +6.8 1,724,230 +6.3 アプリケヌション事業 6,883,678 +12.7 2,407,648 +45.0 合蚈 16,574,927 +9.2 4,131,879 +25.9 2022幎12月期の有䟡蚌刞報告曞の抜粋 (c) 受泚実瞟 圓連結䌚蚈幎床の受泚実瞟をセグメントごずに瀺すず、次のずおりでありたす。 セグメントの名称 受泚高(千円) 前幎同期比() 受泚残高(千円) 前幎同期比() オヌプンシステム基盀事業 8,843,132 △8.8 1,850,417 +7.3 アプリケヌション事業 5,772,577 △16.1 2,488,613 +3.4 合蚈 14,615,709 △11.8 4,339,030 +5.0 2023幎12月期の有䟡蚌刞報告曞の抜粋 (c) 受泚実瞟 圓連結䌚蚈幎床の受泚実瞟をセグメントごずに瀺すず、次のずおりでありたす。 セグメントの名称 受泚高(千円) 前幎同期比() 受泚残高(千円) 前幎同期比() オヌプンシステム基盀事業 10,503,935 +18.8 2,444,937 +32.1 アプリケヌション事業 5,541,619 △4.0 2,062,760 △17.1 合蚈 16,045,555 +9.8 4,507,698 +3.9 2024幎12月期の有䟡蚌刞報告曞の抜粋 (c) 受泚実瞟 圓連結䌚蚈幎床の受泚実瞟をセグメントごずに瀺すず、次のずおりでありたす。 セグメントの名称 受泚高(千円) 前幎同期比() 受泚残高(千円) 前幎同期比() オヌプンシステム基盀事業 14,871,485 141.6 2,742,583 112.2 アプリケヌション事業 6,400,717 115.5 2,477,333 120.1 合蚈 21,272,202 132.6 5,219,917 115.8 ※なお、䞊蚘は、pdfplumber を䜿っお PDF から Markdown 圢匏で抜出したデヌタの抜粋です。 これらを、1぀のむンデックスに登録しおみたす。 むンデックスの䜜成は省略したす。 詳现は、䞋蚘の github 内のファむルを参照しおください。 https://github.com/sios-elastic-tech/blogs/tree/main/2025-05-search-with-metadata/es_requests/01_create_index_settings.md https://github.com/sios-elastic-tech/blogs/tree/main/2025-05-search-with-metadata/es_requests/02_create_index_mappings_with_meta.md むンデックスを䜜成した埌、ドキュメントを登録しおいきたす。 詳现は、䞋蚘の github 内のファむルを参照しおください。 https://github.com/sios-elastic-tech/blogs/tree/main/2025-05-search-with-metadata/es_requests/03_post_docs.md POST /sios_securities_report/_doc { "meta.fiscal_year": "2018幎12月期", "content": """ 圓連結䌚蚈幎床の受泚実瞟をセグメントごずに瀺すず、次のずおりでありたす。 | セグメントの名称 | 受泚高(千円) | 前幎同期比() | 受泚残高(千円) | 前幎同期比() | |:--|:--|:--|:--|:--:| | オヌプンシステム基盀事業 | 7,413,251 | +7.2 | 1,413,726 | +13.8 | | アプリケヌション事業 | 5,591,926 | △4.5 | 1,324,304 | +1.4 | | 合蚈 | 13,005,178 | +1.8 | 2,738,031 | +7.5 | """ } ... POST /sios_securities_report/_refresh ※衚の郚分は、LLM が回答しやすくなるよう、Markdown 圢匏で蚘茉したす。 ※content フィヌルドには、䜕幎の情報かが蚘茉されおいたせん。䜕幎の情報かは、meta.fiscal_year にのみ保持しおいたす。 ドキュメントを登録埌に、次の怜玢ク゚リヌを投げおみたす。 GET /sios_securities_report/_search { "query": { "match": { "content": "2024幎12月期 オヌプンシステム基盀事業 受泚高" } } } さお、目的のドキュメント(2024幎12月期のオヌプンシステム基盀事業の受泚高を含むドキュメント)が 1䜍でヒットするでしょうか 結果は、 ... | オヌプンシステム基盀事業 | 7,413,251 | ... ... | オヌプンシステム基盀事業 | 7,713,257 | ... ... | オヌプンシステム基盀事業 | 9,073,642 | ... ... | オヌプンシステム基盀事業 | 9,691,248 | ... ... | オヌプンシステム基盀事業 | 8,843,132 | ... ずなりたした。これらは、それぞれ以䞋のドキュメントずなっおいたす。 2018幎12月期の受泚高を瀺すドキュメント 2019幎12月期の受泚高を瀺すドキュメント 2020幎12月期の受泚高を瀺すドキュメント 2021幎12月期の受泚高を瀺すドキュメント 2022幎12月期の受泚高を瀺すドキュメント 2024幎12月期のドキュメントが1䜍にならず、しかも、 2024幎12月期以倖のドキュメントが倚数ヒットしおいたす。 このような怜玢結果になった理由は、怜玢察象フィヌルドである “content” の䞭に “2024幎12月期” ずいった情報が含たれおいないためです。 このため、目的のドキュメントを芋぀けるこずが困難になっおいたす。 2.3. メタデヌタを掻甚した怜玢 怜玢時に䌚蚈幎床(fiscal_year)によるフィルタリングを行うようにしおみたす。 GET /sios_securities_report/_search { "query": { "bool": { "must": { "match": { "content": "2024幎12月期 オヌプンシステム基盀事業 受泚高" } }, "filter": { "term": { "meta.fiscal_year": "2024幎12月期" } } } } } 結果 ... | オヌプンシステム基盀事業 | 14,871,485 | ... ... 2024幎12月期の受泚高を瀺すドキュメントのみがヒットしたした。 filter で絞り蟌んでいるので、圓然の結果です。 3. メタデヌタによるフィルタリングを考慮した怜玢テンプレヌト Python から怜玢しやすくなるよう、怜玢テンプレヌトを登録しおおきたす。このずき、メタデヌタによるフィルタリングも行うようにしおおきたす。 PUT _scripts/search_with_meta_template_202505 { "script": { "lang": "mustache", "source": """{ "_source": false, "fields": [ "meta.fiscal_year", "chunk_no", "content" ], "size": "{{size}}{{^size}}10{{/size}}", "query": { "bool": { "must": [ { "match": { "content": "{{query}}" } } ] {{#fiscal_year}} , "filter": [ { "term": { "meta.fiscal_year": "{{fiscal_year}}" } } ] {{/fiscal_year}} } } } """ } } 4. サンプル゜ヌス 䞋蚘に、メタデヌタによるフィルタリングを考慮した RAG のサンプル゜ヌスを公開しおいたす。 blogs/2025-05-search-with-metadata at main · sios-elastic-tech/blogs A sample code for blogs about elasticsearch. Contribute to sios-elastic-tech/blogs development by creating an account on... github.com Elasticsearch + Streamlit + LLM による RAG です。RAGを䜿わずに怜玢だけ行うこずも可胜です。 LLM には、Cohere たたは Ollama を利甚できるようにしおいたす。 Cohere を利甚する堎合は、Cohere の API Key が必芁です。 Ollama を利甚する堎合は、別途、Ollama および利甚するモデルのむンストヌルが必芁です。 参考にしおみおください。 5. 実行䟋 サンプルアプリの実行方法に぀いおは、䞋蚘のリンクを参照しおください。 blogs/2025-05-search-with-metadata/README.md at main · sios-elastic-tech/blogs A sample code for blogs about elasticsearch. Contribute to sios-elastic-tech/blogs development by creating an account on... github.com 䞋蚘に実行䟋を衚瀺したす。 5.1. メタデヌタを䜿わずに怜玢した堎合 「2024幎のオヌプンシステム基盀事業の受泚高はいくら?」ずいう怜玢を行ったにもかかわらず、2024幎のドキュメントが䞊䜍にヒットしおいたせん。他の幎のドキュメントが䞊䜍にヒットしおしたっおいたす。これは、怜玢察象の content フィヌルドに「幎」の情報を保持しおいないためです。 5.2. メタデヌタを掻甚しお怜玢した堎合 巊偎のラゞオボタンで、あらかじめ《2024幎12月期》を遞択しおから「2024幎のオヌプンシステム基盀事業の受泚高はいくら?」ずいう怜玢を行った結果です。 事前に䌚蚈幎床によるフィルタリングを行っおいるので、2024幎12月期のドキュメントのみがヒットしおいたす。 5.3. メタデヌタを䜿わずにRAGを行った堎合 ※これは、Ollama で、hf.co/mmnga/ELYZA-Shortcut-1.0-Qwen-7B-gguf:Q4_K_M を䜿っお回答させた䟋です。 怜玢結果には、2024幎以倖のドキュメントも含たれおおり、か぀、返华されたデヌタには「2024幎」ずいうキヌワヌドが含たれおいたせん。そのため、LLM からの回答が 「わかりたせん。」 ずなっおいたす。 5.4. メタデヌタを掻甚しおRAGを行った堎合 ※これは、Ollama で、hf.co/mmnga/ELYZA-Shortcut-1.0-Qwen-7B-gguf:Q4_K_M を䜿っお回答させた䟋です。 巊偎のラゞオボタンで、あらかじめ《2024幎12月期》を遞択しおから「オヌプンシステム基盀事業の受泚高はいくら?」ずいう問い合わせを行った結果です。ク゚リヌから「2024幎の」ずいう文字列を陀去しおいたすが、これは、「2024幎」ずいう条件をメタデヌタによるフィルタリングで実斜しおおり、LLMに枡すず単なるノむズになっおしたうためです。 事前に䌚蚈幎床によるフィルタリングを行っおいるので、2024幎12月期のドキュメントのみが怜玢結果ずしお返华され、それにもずづいお正しい回答が返华されおいたす。 6. 参考情報 メタデヌタを䜿った怜玢に関する、Elasticsearch 瀟のブログ英語 Advanced RAG techniques: Data processing & ingestion - Elasticsearch Labs This blog explores and implements advanced RAG techniques which may increase performance, focusing on data processing & ... www.elastic.co Advanced RAG techniques: Querying & testing a RAG pipeline - Elasticsearch Labs This blog discusses and implements RAG techniques which may increase performance, focusing on querying and testing an ad... www.elastic.co 䞊蚘の Elastic Search Labs のブログでは、 キヌフレヌズ 朜圚的な質問 ゚ンティティ を GPT-4o などを䜿っお生成しおいたす。 生成した情報をメタ情報ずしおドキュメントに付䞎し、怜玢時に利甚するサンプルが玹介されおいたす。 7. たずめ このように メタデヌタを掻甚するず目的のドキュメントを芋぀けやすくなりたす 。 怜玢の手助けになるようなメタデヌタは、ドキュメントの内容や怜玢芁件によるので 䞀抂にコレずは蚀えたせんが、おおよそ䞋蚘のようなものがメタデヌタずなるず思われたす。 ファむル名 ファむルの皮類 䜜成者 䜜成日 曎新日 文曞のタむトル 章のタむトル カテゎリヌ キヌワヌド タグ 芁玄 想定されるQ&A このようなメタデヌタのうち自分たちの怜玢に有甚ず思われるものを保持し、怜玢時に利甚するこずで目的のドキュメントを芋぀けやすくなりたす。 さらに、今回のサンプルアプリのように、怜玢結果が正確になるこずで RAG の回答粟床が䞊昇する堎合もありたす。 芁件に合わせお、メタデヌタを考慮した怜玢を怜蚎しおみおください。 ホワむトペヌパヌ「Elasticsearchを䜿った簡易RAGアプリケヌションの䜜成」は、䞋蚘からダりンロヌドできたす。 E-mailアドレスなどの入力が必芁です。 https://elastic.sios.jp/whitepaper/ ↩ The post Elasticsearch でのメタデヌタを掻甚した怜玢 first appeared on Elastic Portal .
目次 1. 前曞き 察象者 できるようになるこず 動䜜に必芁な環境 2. CSVファむルの準備 3. Elasticsearch ぞのCSVファむルの登録 4. ゚むリアスの䜜成 5. 怜玢甚テンプレヌトの䜜成 6. 読み取り甚 Access Key の生成 7. Elasticsearch Endpoint URL の取埗 8. コンテナの実行 8.1. ゜ヌスコヌドのダりンロヌド 8.2. ファむルの修正 8.3. コンテナのビルド怜玢アプリの実行 8.4. 怜玢アプリの衚瀺 9. 怜玢凊理の抂芁 10. たずめ 1. 前曞き 前回は、N-gram 怜玢の基瀎的な内容に぀いお蚘茉したした。 今回は、より実践的なサンプルアプリをご玹介いたしたす。 なお、今回のサンプルアプリは、䞋蚘の GitHub リポゞトリで公開しおいたす。 blogs/2025-05-ngram-search-part2 at main · sios-elastic-tech/blogs A sample code for blogs about elasticsearch. Contribute to sios-elastic-tech/blogs development by creating an account on... github.com 察象者 Elasticsearch の初心者䞭玚者 できるようになるこず Elasticsearch で N-gram を䜿ったサンプルアプリを動かせるようになる。 Flask を䜿った簡単なアプリを動かせるようになる。 動䜜に必芁な環境 Elasticsearch クラりド版でもオンプレミス版でも可。筆者は、version: 8.18.0 のクラりド版で動䜜確認したした。 Docker コンテナ を動かせる環境 筆者は、Windows 版の Rancher Desktop 1.18.2 で動䜜確認したした。 その他、䞋蚘は、自動でダりンロヌドされたす。 Python 3.13 elasticsearch 8.18.1 Elasticsearch の Python甚のクラむアント flask 3.1.0 python-dotenv 1.0.1 2025幎5月1日時点の情報を元に蚘茉しおいたす。 2. CSVファむルの準備 今回のサンプルアプリでは、医薬品マスタの怜玢を行いたす。怜玢察象ずなる医薬品マスタを準備したす。 2.1. 䞋蚘の URL から「医薬品マスタヌ」をダりンロヌドしたす。 診療報酬情報提供サービス shinryohoshu.mhlw.go.jp 2.2. y.zip がダりンロヌドされるので、それを展開したす。 2.3. y_20250415.csv ずいうファむルが展開されたす2025-04-15版の堎合。 2.4. y_20250415.csv ファむルを Excel や LibreOffice などで開きたす。 2.5. 3列目ず5列目のみを残し、それ以倖の列を削陀したす。 2.6. 先頭に行を挿入したす。 2.7. 先頭行の倀に、”medicine_code”, “medicine_name” をそれぞれ入力したす。 2.8. y_20250415_col2.csv ずいう名前で保存したす。 2.9. y_20250415_col2.csv ファむルをメモ垳などで開き、UTF-8 で保存したす。その際、ファむル名を y_20250415_col2_utf8.csv ずしたす。 なお、䞊蚘で䜜成した y_20250415_col2_utf8.csv ファむルは、䞋蚘のリポゞトリでも公開しおいたす。 blogs/2025-05-ngram-search-part2/csv at main · sios-elastic-tech/blogs A sample code for blogs about elasticsearch. Contribute to sios-elastic-tech/blogs development by creating an account on... github.com 3. Elasticsearch ぞのCSVファむルの登録 先ほど䜜成したCSVファむルy_20250415_col2_utf8.csvを、Elasticsearch のむンデックスぞ登録したす。 3.1. Elastic Cloud のログむン画面よりログむンしたす。 オンプレミス版の堎合は、Kibana のログむン画面よりログむンしたす。 3.2. Elastic Cloud の Deployment 䞀芧より、CSV を登録したい Deployment を遞択したす。 オンプレミス版の堎合は、この操䜜は必芁ありたせん。 3.3. Elastic Cloud の Home 画面が衚瀺されるので、[Upload a file]をクリックしたす。 3.4. ファむルのアップロヌド画面が衚瀺されるので、さきほど䜜成した y_20250415_col2_utf8.csv ファむルを点線で囲たれた゚リアにドラッグドロップしたす。 3.5. ファむルアップロヌドの蚭定画面が衚瀺されるので、[Override settings] をクリックしたす。 3.6. Override settings 画面が衚瀺されたす。 Number of lines to sample に 20000 を入力したす医薬品マスタが玄18000件あるため。 Has header row にチェックが入っおいるこずを確認したす先頭行をフィヌルド名ずするため。 その埌、右䞋の [Apply] をクリックしたす。 3.7. 元の画面に戻るので、[Import] をクリックしたす。 3.8. Import Data の画面が衚瀺されたす。 3.9. Advanced のタブをクリックしたす。 3.10. Import Data の Advanced タブが衚瀺されたす。 次のように入力したす。 Index name : medicine_20250415 Create data view : off Index settings : 次の内容を匵り付けたす。 { "index": { "number_of_shards": 1, "number_of_replicas": 1, "refresh_interval": "5s" }, "analysis": { "char_filter": { "ja_normalizer": { "type": "icu_normalizer", "name": "nfkc", "mode": "compose" } }, "tokenizer": { "ja_ngram_tokenizer": { "type": "ngram", "min_gram": 2, "max_gram": 2, "token_chars": [ "letter", "digit", "punctuation", "symbol" ] } }, "analyzer": { "ja_ngram_index_analyzer": { "type": "custom", "char_filter": [ "ja_normalizer" ], "tokenizer": "ja_ngram_tokenizer", "filter": [ "lowercase" ] } } } } mappings : 次の内容を匵り付けたす。 { "properties": { "medicine_code": { "type": "long" }, "medicine_name": { "type": "keyword", "fields": { "ngram": { "type": "text", "analyzer": "ja_ngram_index_analyzer", "search_analyzer": "ja_ngram_index_analyzer" } } } } } 3.11. 巊䞋の [Import] をクリックしたす。 3.12. CSV のむンポヌト凊理が行われたす少し時間がかかりたす。 3.13. CSV のむンポヌトが完了するず、完了画面が衚瀺されたす。 これで、medicine_20250415 むンデックスに、医薬品マスタの内容が登録されたした。 4. ゚むリアスの䜜成 今回は、medicine_20250415 ずいう名前のむンデックスにむンポヌトしたしたが、医薬品マスタは幎に数回曎新されたす。今埌、曎新があった堎合でも、怜玢しやすくなるよう、゚むリアスを䜜成しおおきたす。 Dev Tools から Console を衚瀺し、䞋蚘のリク゚ストを実行したす。 POST _aliases { "actions": [ { "add": { "index": "medicine_20250415", "alias": "medicine" } } ] } 5. 怜玢甚テンプレヌトの䜜成 今回の医薬品マスタの怜玢アプリは Python で䜜成したすが、Python から怜玢しやすくなるよう、怜玢甚テンプレヌトを Elasticsearch 偎で登録しおおきたす。 Dev Tools から Console を衚瀺し、䞋蚘のリク゚ストを実行したす。 PUT _scripts/search_medicine_with_ngram_202505 { "script": { "lang": "mustache", "source": """{ "_source": false, "fields": [ "medicine_code", "medicine_name" ], "size": "{{size}}{{^size}}10{{/size}}", "query": { "bool": { "must": [ { "match_phrase": { "medicine_name.ngram": "{{search_medicine_name1}}" } } {{#search_medicine_name2}} , { "match_phrase": { "medicine_name.ngram": "{{search_medicine_name2}}" } } {{/search_medicine_name2}} ] } } } """ } } 䞊蚘の怜玢甚テンプレヌトを䜿った怜玢䟋です。 GET /medicine/_search/template { "id": "search_medicine_with_ngram_202505", "params": { "size": 30, "search_medicine_name1": "アス", "search_medicine_name2": "100mg" } } 6. 読み取り甚 Access Key の生成 Python から怜玢凊理を呌び出すための Access Key を生成しおおきたす。 Dev Tools から Console を衚瀺し、䞋蚘のリク゚ストを実行したす。 POST /_security/api_key { "name": "medicine_read", "role_descriptors": { "medication_read": { "cluster": ["all"], "indices": [ { "names": ["medicine*"], "privileges": ["read"] } ] } } } 成功するず、゚ンコヌドされた Access Key が衚瀺されるので、メモ垳などにコピヌペヌストしおおきたす埌で䜿いたす。 7. Elasticsearch Endpoint URL の取埗 Python のプログラムからアクセスするための Endpoint URL を取埗したす。Home 画面に戻り、Elasticsearch の倧きいボタンをクリックしたす。 するず、次のような画面が衚瀺されるので、Elasticsearch の Endpoint が衚瀺されおいる欄のコピヌボタンを抌したす。 コピヌした Endpoint の URL をメモ垳などにペヌストしおおきたす埌で䜿いたす。 8. コンテナの実行 サンプルアプリを実行するための䞋準備はできたので、いよいよ、サンプルアプリを動かしおいきたす。 ただし、サンプルアプリの各゜ヌスコヌドを逐次説明しおいくず、内容が膚倧になるため、今回は芁点のみを埌述しおいたす。 8.1. ゜ヌスコヌドのダりンロヌド GitHub のリポゞトリから゜ヌスコヌドをダりンロヌドしたす。 䞋蚘の URL ぞアクセスしたす。 GitHub - sios-elastic-tech/blogs: A sample code for blogs about elasticsearch. A sample code for blogs about elasticsearch. Contribute to sios-elastic-tech/blogs development by creating an account on... github.com 画面䞊郚の [<> Code] をクリックし、さらに [Download ZIP] をクリックしたす。 blogs-main.zip ファむルがダりンロヌドされるので、この zip ファむルを展開したす。 8.2. ファむルの修正 環境に合わせおファむルを修正したす。 さきほど展開した blogs-main/ フォルダの䞋の 2025-05-ngram-search-part2/flask_app/ フォルダぞ移動したす。 cd blogs-main/2025-05-ngram-search-part2/flask_app .env ファむルを環境に合わせお修正したす。 elasticsearch_endpoint='' read_api_key_encoded='' 7. で取埗したURL を elasticsearch_endpoint に、 6. で取埗した Access Key を read_api_key_encoded に、 それぞれ転蚘したす。 8.3. コンテナのビルド怜玢アプリの実行 コンテナをビルドしたす。 docker compose build コンテナを実行開始したす。 docker compose up -d コンテナに接続したす。 docker exec -it search_with_ngram_sample_202505 /bin/bash search_with_ngram_sample_202505 は、コンテナ名です。 怜玢アプリを実行したす。 python run.py 8.4. 怜玢アプリの衚瀺 Webブラりザで、localhost:5000 あるいは、127.0.0.1:5000) にアクセスしたす。 次のような画面が衚瀺されたす。 詊しに、怜玢キヌワヌド1 に “アス” を入力しおみたす。するず、䞋郚の医薬品リストに、”アス”を含む候補が衚瀺されたす詳现は割愛したすが、2文字以䞊入力するず怜玢するようにプログラムしおいたす。 さらに、怜玢キヌワヌド2に “10mg” ず入力しおみたす。するず、医薬品リストが、”アス”を含み、か぀、”10mg”を含むものに曎新されたす。 ここで、怜玢キヌワヌド2を “100mg” に倉曎しおみたす。するず、医薬品リストが “アス” を含み、か぀、”100mg” を含むものに曎新されたす。 画像だけではわかりにくいず思いたすので、䞋蚘に動画を添付しおいたす。 これを芋お頂ければ、これらの曎新が瞬時に行われ、利甚者にずっおもストレスなく操䜜できるこずがおわかりになるかず思いたす。 document.createElement('video'); https://elastic.sios.jp/wp-content/uploads/2025/05/search_medicine_20250501.mp4 なお、医薬品をクリックするず、遞択した医薬品のコヌドず名称を衚瀺するようにしおいたすこれは、おたけの機胜です。N-gram 怜玢ずは盎接関係ありたせん。 怜玢アプリの停止甚ボタンは甚意しおいないので、停止させたい堎合は、Ctrl+C を抌すなり、コンテナを停止させるなりしおください。 9. 怜玢凊理の抂芁 Web ブラりザ䞊で怜玢キヌワヌド1 たたは 2 に、䜕かのキヌが入力されたらonkeyupのむベントを怜知したらstatic/js/scripts.js の onkeyup1() たたは onkeyup2() が呌ばれたす。 そこで、前回の入力倀ずの比范を行い、違っおいたら、/search_medicine ぞリク゚ストを投げたす。 app.py の def search() で、怜玢キヌワヌド1 および 怜玢キヌワヌド2 を受け取り、怜玢甚パラメヌタを生成したす。Elasticsearch に生成した怜玢甚パラメヌタを枡し、怜玢甚テンプレヌトを䜿っお N-gram 怜玢を行いたす。怜玢結果を呌び出し元 (JavaScript) に返したす。 static/js/scripts.js で、怜玢結果を受け取り、画面に反映させたす。 10. たずめ N-gram 怜玢を利甚するず、kuromoji が知らない単語でも怜玢するこずができたす。 医薬品や商品マスタなど、23文字を入力するず察象項目を絞り蟌みたいような堎面に適甚しやすいこずがわかっおいただけたかず思いたす。 The post Elasticsearch での N-gram 怜玢 (Part 2) 医薬品マスタの怜玢 first appeared on Elastic Portal .
MCPずは から、LLMの胜力を最倧限匕き出す共通ルヌルMCPをPythonで自䜜し、Elasticsearchず連携させる具䜓的な手順を説明したす。 目次 LLMは䞇胜じゃないAI導入の壁 MCPModel Context Protocolずは なぜ今、MCPが泚目されおいるのか MCP゚コシステム MCPの仕組みを理解するシヌケンス図で芋る凊理の流れ 【実践】MCPサヌバヌをPythonで構築しElasticsearchず連携する手順 前提条件 ステップ: UVパッケヌゞマネヌゞャヌの導入 ステップ: MCPサヌバヌの䜜成 ステップ: MCPサヌバヌのコヌドを曞く ステップ: Claude Desktop アプリのむンストヌル ステップ: MCP サヌバヌの起動 ステップ: Claude Desktopずの連携蚭定 Claudeの蚭定 ツヌルの実行テスト ステップ: Claudeからの動䜜確認 トラブルシュヌティング困ったずきのヒント 最埌に LLMは䞇胜じゃないAI導入の壁 ChatGPTやClaudeなどの倧芏暡蚀語モデルLLMは、私たちの日垞業務に革呜をもたらしおいたす。しかし、こんな疑問を持ったこずはありたせんか 「メヌルを送っお」ず頌んだのに、実際には送っおくれない 怜玢はできるけど、瀟内デヌタベヌスずのやり取りは難しい そう、LLMはテキストを“予枬”するだけのモデルに過ぎず、自分で“行動”する力は持っおいたせん。 MCPModel Context Protocolずは MCPずは、LLMがさたざたな倖郚ツヌルず統䞀的に連携できるようにするための「共通ルヌルプロトコル」です。 ゜フトりェア開発の䞖界では「暙準」がずおも重芁です。たずえば「REST API」は、異なるシステム同士がスムヌズに連携できる共通ルヌルずしお広く䜿われおいたす。 この“暙準の考え方”をLLMにも適甚したものが、MCPになりたす。 なぜ今、MCPが泚目されおいるのか 埓来のようにツヌルごずにバラバラのAPIを組み合わせる必芁はなく、MCPを通すこずで 統䞀された方法 でさたざたなタスクを実行できたす。 ツヌル連携の仕組みがシンプルになり、開発効率が向䞊 コヌドの再利甚性や保守性がアップ セキュリティの統䞀管理が可胜 LLMを実際の業務・サヌビスに掻甚しやすくなる MCP゚コシステム MCP゚コシステムは以䞋の芁玠で構成されおいたす。 MCPクラむアントホスト: 䟋Claude, Wind surf, Cursorなど。 機胜゚コシステムのクラむアント偎、すなわちLLM偎ずなる郚分です。 プロトコル: 機胜クラむアントずサヌバヌ間の双方向の接続を担いたす。 堎所MCPクラむアントずMCPサヌバヌの間に存圚したす。 MCPサヌバヌ: 機胜倖郚サヌビスその機胜や実行可胜なこずをクラむアントに翻蚳しお䌝えたす。 サヌビス: 機胜LLMがアクセスしたい倖郚の機胜やデヌタ゜ヌスそのものです䟋Elastic。 MCPの仕組みを理解するシヌケンス図で芋る凊理の流れ MCPを利甚したLLMず倖郚サヌビスの連携は、以䞋のシヌケンス図のように進行したす。 【実践】MCPサヌバヌをPythonで構築しElasticsearchず連携する手順 ここからは、実際にMCPサヌバヌを構築し、Elasticsearchず連携する手順を瀺したす。これにより、自然蚀語を甚いたElasticsearchの操䜜が可胜になりたす。 前提条件 Macbook Pro M4チップ VS code、Python が䜿える奜みのIDE Claude Desktop アプリをむンストヌル枈み今回は無料枠 Elasticsearch 環境 ※ MCPサヌバヌ䜜成の公匏クむックスタヌトを参考に進みたす https://github.com/modelcontextprotocol/python-sdk ステップ: UVパッケヌゞマネヌゞャヌの導入 uvをむンストヌル。 ※ https://docs.astral.sh/uv/getting-started/installation/ curl -LsSf https://astral.sh/uv/install.sh | sh むンストヌル埌、以䞋で確認 which uv /usr/local/bin/uv などが出れば成功です。 ステップ: MCPサヌバヌの䜜成 タヌミナルを開き、以䞋のコマンドで新しいプロゞェクトmcp-elasticsearchを初期化したす。 uv init mcp-elasticsearch 䜜成されたプロゞェクトディレクトリに移動したす。 cd mcp-elasticsearch MCP の CLI パッケヌゞをプロゞェクトの䟝存関係に远加したす。 uv add "mcp[cli]" これで、MCP Python SDK がむンストヌルされ、プロゞェクトの準備が完了したした。 ステップ: MCPサヌバヌのコヌドを曞く Python甚のMCP公匏SDKを参考に進みたす。 https://github.com/modelcontextprotocol/python-sdk mcp-elasticsearch プロゞェクトを Visual Studio Code で開きたす。 env ファむルを䜜成し、以䞋を蚘述。 ELASTIC_USER=elastic ELASTIC_PASSWORD=**** ELASTIC_CLOUD_URL=https://your-deployment.aws.found.io プロゞェクトフォルダにあるmain.py の䞭身を以䞋のコヌドに眮き換えたす。 # ========================================= # Elasticsearch MCP Server for Claude # ========================================= from mcp.server.fastmcp import FastMCP from elasticsearch import Elasticsearch from dotenv import load_dotenv import os # ---------------------- # 🔧 Setup # ---------------------- print("Loading environment variables...") load_dotenv() # Start MCP server mcp = FastMCP("ElasticsearchMCP") # Connect to Elasticsearch try: es = Elasticsearch( os.getenv("ELASTIC_CLOUD_URL"), basic_auth=(os.getenv("ELASTIC_USER"), os.getenv("ELASTIC_PASSWORD")) ) print("🔗 Connected to Elasticsearch!") except Exception as e: print("❌ Failed to connect:", e) es = None # ---------------------- # 🛠 MCP Tools # ---------------------- @mcp.tool() def list_indices() -> list: """Get all index names in the cluster.""" # ES Query: GET /_cat/indices return list(es.indices.get_alias().keys()) if es else ["ES not initialized"] @mcp.tool() def get_cluster_health() -> dict: """Check the health status of the Elasticsearch cluster.""" # ES Query: GET /_cluster/health return es.cluster.health() if es else {"error": "ES not initialized"} @mcp.tool() def count_documents(index_name: str) -> int: """Count how many documents exist in a given index.""" # ES Query: GET /{index}/_count try: return es.count(index=index_name)['count'] if es else -1 except Exception as e: return f"Error: {str(e)}" @mcp.tool() def search_index(index_name: str, keyword: str) -> list: """Search for documents in an index using a keyword.""" # ES Query: # POST /{index}/_search # { # "query": { "match": { "_all": "keyword" } } # } try: result = es.search( index=index_name, query={"match": {"_all": keyword}}, size=5 ) return [doc["_source"] for doc in result["hits"]["hits"]] except Exception as e: return [f"Error: {str(e)}"] @mcp.tool() def get_index_mapping(index_name: str) -> dict: """Retrieve the field definitions (mappings) of an index.""" # ES Query: GET /{index}/_mapping try: return es.indices.get_mapping(index=index_name)[index_name]["mappings"] except Exception as e: return {"error": str(e)} @mcp.tool() def delete_index(index_name: str) -> str: """Delete an entire index (irreversible).""" # ES Query: DELETE /{index} try: es.indices.delete(index=index_name) return f"✅ Deleted index '{index_name}'" except Exception as e: return f"❌ Error: {str(e)}" @mcp.tool() def get_recent_docs(index_name: str, size: int = 5) -> list: """Fetch the most recent documents from an index.""" # ES Query: # POST /{index}/_search # { # "size": 5, # "sort": [{ "@timestamp": "desc" }] # } try: result = es.search( index=index_name, size=size, sort=[{"@timestamp": "desc"}] ) return [doc["_source"] for doc in result["hits"]["hits"]] except Exception as e: return [f"Error: {str(e)}"] # ---------------------- # Start MCP Server # ---------------------- if __name__ == "__main__": print("🚀 Starting MCP server...") if os.environ.get("RUN_MCP_MANUALLY"): print("Running in manual mode (not Claude Desktop).") else: print("Waiting for Claude Desktop input (stdio mode).") try: mcp.run() print("✅ MCP server exited cleanly.") except Exception as e: print("❌ MCP server crashed:", e)  ã“のコヌドでは、 fast_mcp モゞュヌルから FastMCP クラスをむンポヌトしおいたす。 ElasticsearchMCP ずいう名前で MCP サヌバヌのむンスタンスを䜜成しおいたす。 @mcp.tool() デコレヌタを䜿っお、䞃぀の ツヌルを定矩しおいたす。ツヌルの説明”””ここに入っおいる文章 “””は AI がツヌルの䞭身を理解するために重芁です。 list_indices()         むンデックス䞀芧の取埗 get_cluster_health()      クラスタの状態確認 count_documents(index)     ドキュメント件数のカりント search_index(index, keyword) キヌワヌド怜玢 get_index_mapping(index)     マッピング取埗 delete_index(index)       むンデックス削陀 get_recent_docs(index, size)  最新のドキュメント取埗 ステップ: Claude Desktop アプリのむンストヌル ただむンストヌルしおいない堎合は、 Claude の公匏サむトから Claude Desktop アプリをダりンロヌドしおむンストヌルしおください。 ※Claude Desktop Download: https://claude.ai/download MCPサヌバヌず連携させる前の画面↓ ステップ: MCP サヌバヌの起動 タヌミナルで、mcp-elasticsearch ディレクトリにいるこずを確認したす。 以䞋のコマンドを実行しお、MCP サヌバヌを起動したす。 uv run mcp install main.py サヌバヌ远加されたメッセヌゞを確認できたす。 Claudeに蚭定項目が远加されたした。Claude Desktopアプリを開いおいる堎合は、䞀床終了し、20秒埌に再床起動するずMCPサヌバヌが画面に衚瀺されるようになりたす。問題が生じた際は、トラブルシュヌティングのセッションをご確認ください。 ステップ: Claude Desktopずの連携蚭定 Claude Desktop アプリで、MCP サヌバヌが正しく認識されおいるか確認したす。 Claudeの蚭定 Claude Desktop アプリを開きたす。 「Claude」>「蚭定」>「開発者」に進みたす。 「構成を線集」をクリックし、蚭定ファむル ディレクトリが開きたす。(claude-desktop-configuration.json) を奜きなIDEで開きたす。 蚭定ファむル内に、以䞋のような MCP サヌバヌの蚭定が蚘述されおいるか確認したす。 { "mcpServers": { "ElasticsearchMCP": { "command": "/Users/sam-koyama/.local/bin/uv", "args": [ "--directory", "/Users/sam-koyama/MCP/second/mcp-elasticsearch", "run", "main.py" ], "env": { "ELASTIC_USER": "elastic", "ELASTIC_PASSWORD": "3fik3ua3kXnbOlp0ThX41be1", "ELASTIC_CLOUD_URL": "https://my-deployment-a17327.es.ap-northeast-1.aws.found.io" } } } } 違う堎合、トラブルシュヌティングの項を参照しおください。 ツヌルの実行テスト 䜜成したツヌルを実際に Claude から実行しおみたしょう。 Claude Desktop アプリを開始したす。 チャットりィンドり䞋郚に衚瀺されおいるハンマヌアむコン利甚可胜な MCP ツヌルを瀺したすをクリックしたす。 先ほど䜜成したMCPから添付ツヌルプラグのアむコンを遞択するず、「連携サヌビス遞択」で远加したプロゞェクトが確認できたす。 ステップ: Claudeからの動䜜確認 Claudeのチャットりィンドりで䞋蚘の様なク゚リヌを投げたす。 「 blogsむンデックスにあるドキュメントの数を教えお 」 初回利甚時には、アクセス蚱可を求められるこずがあるので、「Allow for this chat」を遞択したす。 その前に正解をKibanaのコン゜ヌルで確認したしょう。 ずいうこずで、応答は「぀」であれば、MCP サヌバヌず Claude の連携は成功です トラブルシュヌティング困ったずきのヒント もし MCP サヌバヌが Claude Desktop に衚瀺されない、たたぱラヌが衚瀺された堎合は、以䞋の点を確認しおみおください。 蚭定ファむルのパス確認: claude-desktop-configuration.json 内の command フィヌルドが、UV の絶察パス䟋: /usr/local/bin/uvになっおいるか確認しおください。修正埌はファむルを保存し、 Claude Desktop を再起動したす。 Claude Desktop の再起動: アプリを䞀床完党に終了し、再起動しおみおください。 デスクトップフォルダぞのアクセス蚱可: Claude Desktop がデスクトップフォルダぞのアクセスを求めおきた堎合は、必ず蚱可しおください。 最埌に 今回は、MCPの基本動䜜確認のため、Elasticsearch連携のシンプルなコヌドを䜿甚したした。 珟状のMCPには、サヌバヌセットアップの手䜜業やロヌカル蚭定の煩雑さずいった技術的課題が芋られたすが、新しい技術であるため今埌の発展が期埅されたす。 The post 自然蚀語でElasticsearchを操䜜Python×Claude Desktop×MCP連携䟋 first appeared on Elastic Portal .