mcpField
E
elasticsearch

elasticsearch

github.com/full-stack-skillsデータ・データベース183 回インストール4 週間前に更新
リポジトリ

elasticsearch について

Elasticsearchを扱う人向けの技術リファレンススキルで、検索、分析、ベクトル検索、クラスター運用を対象とします。判断フロー、クエリ一覧、例、よくある落とし穴を通じて、用途と制約を解説します。

主な機能

  1. 01全文検索と構造化クエリのリファレンス
  2. 02集計分析と地理空間クエリの案内
  3. 03ベクトル検索とKNN検索のガイド
  4. 04マッピング、シャード、クラスター運用
  5. 05よくある問題とトラブルシューティング

活用シーン

  1. 01商品や文書の検索設計
  2. 02ログやメトリクスの分析と集計レポート作成
  3. 03ベクトル検索や地理空間クエリの設定
  4. 04クラスター、クエリ、ページネーションの問題調査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/full-stack-skills/database-skills --skill elasticsearch

インストール後、Claude Code で/elasticsearchを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

LICENSE.txt
agents/
openai.yaml
examples/
01-fulltext-search.md
02-aggregation-report.md
03-reindex-zero-downtime.md
04-cluster-monitoring.md
references/
01-query-dsl-fulltext.md
02-query-dsl-term.md
03-aggregations-metric.md
04-aggregations-bucket.md
05-mapping-types.md
06-analyzers.md
07-cluster-ops.md
08-elk-integration.md

詳細

Elasticsearch — 分布式搜索与分析引擎

Elasticsearch 是基于 Apache Lucene 的分布式搜索和分析引擎,提供近实时的全文搜索、结构化搜索、聚合分析、地理空间查询和向量搜索能力。

Workflow — 从数据到搜索的 5 步决策流程

遇到 ES 相关需求时按以下顺序决策:

Step 1: 明确场景
├── 全文搜索?                    → Step 2
├── 结构化数据分析 (日志/指标)?   → Step 2
├── 向量/KNN 搜索?               → references/ 向量搜索
├── 地理空间查询?                 → references/ 地理查询
├── 集群运维/性能问题?             → references/ 07-cluster-ops
└── 数据管道/日志采集?             → references/ 08-elk-integration

Step 2: 设计索引 (Mapping + Analyzer)
├── 确定字段类型 (text/keyword/date/geo/nested…)
├── 选择分词器 (standard/ik/pinyin/自定义)
├── 规划主分片数 (每个分片 20-50GB), 建后不可改
└── 设置别名用于零停机重建

Step 3: 写入数据
├── Index API (单条), Bulk API (批量, 5-15MB/批)
├── _update (部分更新), _update_by_query (条件更新)
└── Logstash/Filebeat (日志采集管道)

Step 4: 构建查询
├── 全文搜索: match / multi_match / query_string
├── 精确过滤: term / terms / range / exists / bool filter
├── 复合查询: bool (must/should/filter/must_not)
├── 聚合分析: terms + avg → references/ 聚合专题
└── 排序/分页: sort / search_after (深度分页) / scroll (导出)

Step 5: 持续优化
├── 性能问题?  → Profile API + 慢查询日志
├── 数据增长?  → ILM + Rollover 自动化 (references/ 07-cluster-ops)
├── Mapping 变更? → Reindex + Alias 零停机 (examples/03)
└── 查询优化?  → filter 优先 query, 避免 script, 限制 _source

When to Use / When NOT to

✅ 使用 ES❌ 不要用 ES
全文搜索 — 商品/文章/文档关键词搜索复杂事务 — 需要 ACID/多表 JOIN, 选 PostgreSQL
日志/指标分析 — ELK Stack 日志场景键值缓存 — 简单 KV 查询, 选 Redis
搜索型应用 — 电商/知识库/文档管理强 Schema 约束 — 需要外键/触发器, 选 RDBMS
聚合/仪表盘 — 实时统计 + Kibana 可视化海量文档存储无需搜索 — 选 MongoDB
地理空间查询 — 附近的人/POI/地理围栏纯 OLAP 分析 — PB 级离线分析, 选 ClickHouse
向量搜索 — 语义相似度/RAG 检索消息队列 — 选 Kafka/Pulsar

核心原则:Elasticsearch 是搜索服务器,不是关系型数据库的替代品。

Boundary — 能力边界

✅ 完全适用⚠️ 有条件适用❌ 不适用
全文搜索、模糊搜索、相关性排序强一致性(ES 是近实时,默认 1s refresh)代替关系型数据库做核心业务存储
日志/指标聚合分析 (Kibana)秒级以下数据可见性(需调 refresh_interval)复杂 JOIN 查询(ES 有有限 nested 支持)
地理空间、自动补全、搜索建议极高写入量(需调优线程池和批量写入)ACID 事务保证
文档搜索、知识库、RAG 检索50+ 节点大集群(需专用协调节点)存储二进制大文件(存 OSS 路径)
时序数据 + ILM 滚动PB 级深度分页(需 search_after / PIT)强关联约束数据模型
向量搜索 (dense_vector + KNN)自定义分词器(需先测试分析效果)替代 Kafka 做消息队列

核心概念速查

概念ES 术语关系型 DB 类比关键说明深度参考
Index索引Table存储文档的逻辑命名空间,名称必须小写references/05
Document文档RowJSON 格式基本数据单元,不可变(update = delete+index)—
Shard分片Partition水平切分单元,主分片数建后不可改,推荐 20-50GB/分片references/07
Replica副本Replica冗余副本提供高可用和读扩展,可动态调整references/07
Mapping映射Schema定义字段类型和分词配置,已有字段类型不可修改references/05
Analyzer分词器—text 字段必须配置,决定搜索质量references/06

查询 DSL 速查

查询类别核心查询用途深度参考
全文查询match / match_phrase / multi_match / query_string文本分词搜索、短语匹配、多字段搜索references/01
精确查询term / terms / range / exists / idskeyword 字段精确匹配、范围过滤、存在检查references/02
复合查询bool (must/filter/should/must_not)90% 搜索需求可用 bool 实现references/02
嵌套/父子nested / has_child / has_parent对象内跨字段关联、父子关系查询references/02
地理查询geo_distance / geo_bounding_box / geo_shape附近查询、矩形区域、复杂地理形状见 geospatial 技能
向量查询knn 参数 / k-NN 插件语义相似度、RAG 检索references/05
特殊查询fuzzy / wildcard / regexp / script / percolate模糊纠错、通配符、脚本、反向搜索references/02

聚合速查

聚合类型核心聚合类似 SQL深度参考
指标聚合avg / sum / min / max / stats / cardinality / percentilesAVG / SUM / COUNT(DISTINCT) / PERCENTILEreferences/03
桶聚合terms / date_histogram / histogram / range / filtersGROUP BY / 日期分组 / 区间分组 / 过滤分组references/04
管道聚合derivative / moving_fn / bucket_script / bucket_selector环比 / 移动平均 / 子聚合计算 / HAVINGreferences/04

集群运维概述

运维领域关键要点深度参考
节点类型Master(3个专用) + Data(SSD) + Coordinating(大查询)references/07
分片管理分配/再平衡/reroute/延迟分配references/07
快照备份S3/FS/GCS 仓库, SLM 自动管理, 增量快照references/07
ILM 生命周期hot → warm → cold → frozen → delete 自动化references/07
监控命令_cluster/health, _cat/nodes, _cat/shards, hot_threadsreferences/07
安全RBAC 角色, 字段/文档级安全, TLS, API Keyreferences/07

落とし穴 — よくある落とし穴とアンチパターン

#落とし穴問題解決策
1term クエリで text フィールドを検索text はトークン分割されるため、完全一致する値が見つかりませんmatch または .keyword サブフィールドを使用します
2from+size による深いページネーション深くなるほど遅くなり、最終的に OOM が発生します(上限 10000)深いページネーションには search_after、エクスポートには scroll/PIT を使用します
3インデックス作成後にプライマリシャード数を変更作成後は変更できません事前に計画するか、インデックスを再作成します(reindex)
4すべてのフィールドに text を使用集計/ソートでエラーが発生しますtext + keyword のマルチフィールドを使用します
5動的マッピングに依存タイムスタンプが long などとして認識されます本番環境では mapping を明示的に設定します
6ネストされたオブジェクトに通常のクエリを使用フィールド間の関連条件が誤って一致します必ず nested クエリを使用します
7シャードが多すぎる、または少なすぎる多すぎると管理のオーバーヘッドが大きく、少なすぎると拡張できませんシャードあたり 20-50GB にします
8大量書き込みを最適化しない頻繁な refresh により小さなセグメントが大量に生成されますrefresh を無効化(-1)し、Bulk API を使い、レプリカを 0 にします
9filter キャッシュを無視重複して計算され、パフォーマンスが低下しますスコア計算が不要な条件は filter に入れます
10wildcard/regexp による前方一致検索転置インデックスを利用できず、パフォーマンスが非常に低下しますprefix または edge_ngram を使用します
11スクリプトクエリの乱用キャッシュできず、パフォーマンスが低下し、デバッグも困難ですingest pipeline で前処理します
12クラスターロールを分離しないData の GC により Master が切断されます専用の Master ノードを 3 台用意します
13ログインデックスに ILM がないインデックスが無制限に増加しますILM でロールオーバー/圧縮/削除を自動化します
14ignore_above を無視keyword が長すぎるとインデックス作成に失敗しますignore_above: 256 を設定します
15text フィールドで fielddata を有効にするメモリ消費が大きくなります代わりに .keyword マルチフィールドを使用します

よくある質問

Q1: ES はリレーショナルデータベースの代替ですか? いいえ。ES は検索サーバーであり、ACID トランザクション、外部キー、複雑な JOIN をサポートしていません。適切なアーキテクチャは、業務データを RDBMS に保存し、ES を検索と集計に使用することです。

Q2: データを書き込んでから検索可能になるまで、どのくらいかかりますか? ほぼリアルタイムです。書き込みデータはまず buffer に入り、デフォルトでは 1s 後の refresh で検索可能になります。refresh_interval を調整するか、?refresh パラメーターを追加できます。

Q3: text フィールドと keyword フィールドの違いは何ですか? text:トークン分割してインデックス化され、match 検索をサポートしますが、ソート/集計はサポートしません。keyword:値全体をインデックス化し、term 検索、ソート、集計をサポートします。

Q4: プライマリシャード数を変更できないのはなぜですか? ルーティングルールが hash(_id) % shards であり、変更すると既存データの場所を特定できなくなるためです。変更するには reindex が必要です。

Q5: シャード数はどのように選べばよいですか? シャードあたり 20-50GB にします。元データが 500GB の場合、プライマリシャードは 10-25 個です。ノードあたりのシャード数は、ヒープメモリ 1GB につき ≤25 個にします。

Q6: ES の検索が高速なのはなぜですか? 転置インデックスにより、各語句がドキュメントのリストにマッピングされ、検索時に直接特定できます。さらに、シャードによる並列処理と filter キャッシュを利用します。

Q7: 集計(Aggregation)とは何ですか? Bucket = GROUP BY によるグループ化、Metric = AVG/SUM/COUNT、Pipeline = 集計結果の再分析です。詳細は references/03、references/04 を参照してください。

Q8: Green/Yellow/Red の状態とは何ですか? Green=すべて正常、Yellow=プライマリシャードは正常だがレプリカが未割り当て、Red=プライマリシャードが失われています。

Q9: ダウンタイムなしでインデックスを再作成するにはどうすればよいですか? Alias + Reindex:新しいインデックスを作成 → データを Reindex → Alias をアトミックに切り替え → 古いインデックスを削除します。examples/03 を参照してください。

Q10: ES と Solr はどちらを選べばよいですか? ES はクラスタ管理が組み込みで、1s でほぼリアルタイム検索ができ、強力な集計機能があり、ELK エコシステムも充実しています。Solr は ZK に依存し、設定が複雑です。

Q11: Mapping は変更できますか? フィールドの追加はできますが、既存フィールドの型(text→keyword など)は変更できません。インデックスの再作成が必要です。

Q12: search_after と from+size の違いは何ですか? from+size は深いページネーションで OOM が発生します(上限 10000)。search_after はソート値に基づいてページを進めるため、深さに関係なくパフォーマンスが一定です。

Q13: データはどのようにバックアップすればよいですか? Snapshot API で S3/GCS/FS にバックアップします。SLM による自動管理を推奨します。増分スナップショットには変更分のみが保存されます。

Q14: クエリが遅い場合、どのように調査すればよいですか? Profile API → スロークエリログ → filter vs query → segments 数 → GC ログ。

Q15: ILM でどのような問題を解決できますか? ロールオーバー(サイズ/時間のしきい値)、自動移行(ホット→ウォーム→コールド)、自動圧縮、自動削除を実行できます。

キーワード

elasticsearch, ES, 検索エンジン, 全文検索, 転置インデックス, Lucene, index, mapping, document, shard, replica, analyzer, ik, pinyin, クエリ DSL, match, term, bool, filter, range, multi_match, query_string, nested, geo, aggregation, 集計, terms, date_histogram, avg, sum, cardinality, percentiles, pipeline, reindex, bulk, scroll, search_after, ILM, rollover, force_merge, alias, snapshot, cluster, ELK, Logstash, Kibana, Filebeat, KNN, dense_vector, ベクトル検索, painless, ingest pipeline, RBAC, profile API, スロークエリ, ダウンタイムなし

参考資料

  • references/01-query-dsl-fulltext.md — 全文検索(match/multi_match/query_string)
  • references/02-query-dsl-term.md — 完全一致検索と複合検索(term/range/bool)
  • references/03-aggregations-metric.md — 指標集計(avg/sum/stats/cardinality/percentiles)
  • references/04-aggregations-bucket.md — バケット集計(terms/date_histogram/range)
  • references/05-mapping-types.md — マッピングとフィールド型の詳細
  • references/06-analyzers.md — トークナイザー(標準/IK/pinyin/カスタム)
  • references/07-cluster-ops.md — クラスター運用(シャード/監視/スナップショット/ILM)
  • references/08-elk-integration.md — Logstash/Filebeat/Kibana の設定
  • examples/01-fulltext-search.md — 全文検索の実践
  • examples/02-aggregation-report.md — 集計レポートの実践
  • examples/03-reindex-zero-downtime.md — ダウンタイムなしのインデックス再作成
  • examples/04-cluster-monitoring.md — クラスター監視の実践

コメント