RAG・検索基盤

Elasticsearchとは|ありふれた語で引くと、全文書を見るのと1倍しか変わらなかった

索引は何を短くするのかどの語なら効くのか組み合わせるとどうなるのか

文書10万件から語ごとの並びを作りました。最もありふれた語は99990件を含みます。

全部を見るのと1倍です。一方1000番目の語なら436件で、229倍の差がつきます。

この記事の要点

  • ありふれた語で1倍
  • 1000番目で229倍
  • 真ん中の語で2857倍
  • 短い並びから当たる

ありふれた語で引くと、全文書を見るのと1倍しか変わらなかった

索引が短くするのは、見に行く文書の数です。語によって、その数が桁で違います。

Elasticsearchで扱う単位は、索引です。公式は索引はElasticsearchで保管の基本となる単位であり、データとやりとりする水準でもあると定めています。

その中では、語から文書へ引ける形でデータが並べ直されています。どれだけ効くかを、その並びを実際に作って数えました。

語ごとの並びの長さ

文書10万件・語2万種です。語の出やすさには偏りを付けてあります。

text
文書 100,000件・語 20,000種。1文書は 60語まで持つ
語から文書へ引く索引の項目は合わせて 4,244,011件

引く語            その語を含む文書  全文書に対する割合  全部を見る場合との比
最もありふれた語                   99,990件              99.99%                    1倍
10番目                       50,386件              50.39%                    2倍
1000番目                        436件               0.44%                  229倍
真ん中の語                          35件               0.03%                 2857倍

最もありふれた語は99990件を含みます。全文書を見るのと変わりません。

1000番目の語なら436件です。229倍の差になります。

この差が意味すること

索引はあることを保証する仕組みではありません。並びが短ければ速く、長ければ速くなりません。

だから「索引があるのに遅い」は起こります。その語の並びが長いだけです。

条件で行を探す仕組みでも同じことが起きます。該当する行が多ければ索引をたどるほうが遅くなる話はPostgreSQLの記事で扱いました。

ありふれた語ほど効かない。効くのは珍しい語。

ありふれた語99990件を含む。全部を見るのと1倍珍しい語35件を含む。2857倍の差がつく最もありふれた語(1倍)10番目(2倍)1000番目(229倍)真ん中の語(2857倍)文書10万件・語2万種での実測。索引を持っていても、左側の語では効き目がない。
図1 ── 語の順位と、索引の効き目
出典Elastic 公式ドキュメント「Index basics」2026-08-18 確認
An index is the fundamental unit of storage in Elasticsearch, and the level at which you interact with your data.
原文Elastic 公式ドキュメント「Index basics」 この内容の有効期限2027-02-18

組み合わせたときは、短い並びから当たるかどうかで決まる

2つの語をどちらも含む文書を探すなら、走査する量は短いほうの並びで決まります。

Elasticsearchは索引を分けて持ちます。公式は裏側では、Elasticsearchは各索引をかけらに分け、それらをまとまりの中の節へ配ると説明しています。

分けても、1つの語の並びが長いことは変わりません。効くのは組み合わせ方のほうです。

2語を組み合わせる

text
2つの語をどちらも含む文書を探す。短い並びから当たるかどうかで走査が変わる

組み合わせ                長いほうから  短いほうから  差
ありふれた語+1000番目                  99,990件          436件    229倍
10番目+1000番目                    50,386件          436件    116倍
1000番目+真ん中                        436件           35件     12倍

同じ条件でも、当たる順番で229倍違います。長いほうから当たれば99990件、短いほうからなら436件です。

1行目に注目してください。ありふれた語が混ざっていても、もう1語が珍しければ速くなります

書く側にできること

  1. 絞り込みの条件を足す。短い並びを1つ作る
  2. ありふれた語だけの検索を避ける。効き目がない
  3. 語の出現数を先に知る。どちらが短いか分かる
  4. 期間で区切る。並びそのものを短くする

4番目が効きます。期間で分けて持てば、探す範囲がその期間の分だけになります。かけらに分けるのと同じ考え方です。

走査する量は、短いほうの並びで決まる。

検索が遅い並びが長いありふれた語で引いている99990件を走査している索引があっても効かない当たる順番が悪い長いほうから当たっている短い並びが使われていない229倍の差が出る範囲が広い期間で区切っていない全期間を探している分けて持てば縮むMECE の根拠:遅さの出どころで分けているため、どの場合も必ずどれか1つに入る文書10万件での実測。1つ目は語の性質、2つ目は当たり方、3つ目は持ち方の問題。
図2 ── 検索が遅いときにたどる道筋
出典Elastic 公式ドキュメント「Index basics」2026-08-18 確認
Behind the scenes, Elasticsearch divides each index into shards and distributes them across the nodes in your cluster.
原文Elastic 公式ドキュメント「Index basics」 この内容の有効期限2027-02-18

1つのかけらが抱えられる量に上限がある

分けるのは速さのためだけではありません。1つあたりを扱える大きさに保つためです。

Elasticsearchが分けて持つ理由は、公式に書かれています。

各かけらは自己完結したLuceneの索引であり、どれだけのデータを効率よく扱えるかについて現実的な限りがある。だからデータを複数のかけらに分けることで、個々のかけらの性能を保つという記述です。

前の計測でいえば、索引の項目は合わせて424万件でした。文書10万件でこの量です。

量の増え方

1文書あたり60語なので、項目は文書数に比例します。100万件なら4240万件です。

並びの長さも比例します。1000番目の語は436件でしたが、文書が10倍なら4360件になります。229倍という比は変わりません。

つまり比は保たれるが、絶対の量は増えます。だから分ける必要が出てきます。

分ける単位の選び方

分ける単位が検索の条件と合っていれば、探す範囲そのものを減らせます。期間で分けて期間で絞る形が典型です。

合っていなければ、すべてのかけらに聞いて結果を合わせることになります。分けた数だけ問い合わせが増えます。

鍵から置き場所が決まる仕組みで同じ問題を扱ったのがDynamoDBの記事です。分けても偏りが消えない場合を数えました。

余談 この計測での注意

語の出やすさの偏りは式で作ったもので、実際の文書の分布ではありません。1文書60語という値も置いたものです。索引は語ごとに文書番号を並べただけの単純な形で、実際の実装はこれを縮めて持つため、量はここより小さくなります。ここで見せているのは、索引の効き目が語ごとに桁で違うこと、組み合わせでは短い並びが効くことの2つです。

出典Elastic 公式ドキュメント「Index basics」2026-08-18 確認
Each shard is a self-contained Apache Lucene index with practical limits on how much data it can efficiently manage, so splitting data across multiple shards keeps individual shards performant.
原文Elastic 公式ドキュメント「Index basics」 この内容の有効期限2027-02-18

よくある質問

Elasticsearchの索引は何を短くしますか
見に行く文書の数です。この計測では、1000番目に多い語なら10万件が436件になりました。
どんな語でも効きますか
効きません。最もありふれた語は99990件を含み、全文書を見るのとほぼ同じでした。
語を組み合わせるとどうなりますか
短い並びから当たれば走査が減ります。ありふれた語と1000番目の組み合わせで229倍の差でした。
なぜ分けて持つのですか
1つのまとまりが効率よく扱える量に限りがあるためです。分けることで1つあたりを保ちます。

まとめ

  • 語から文書を引く
  • 効き目は語によって違う
  • 短い並びから当たる
  • 1つが大きすぎると分ける

今日から始められること

  1. よく検索される語の出現数を数える
  2. 全文書に対する割合を出す
  3. ありふれた語だけの検索がないか探す
  4. 1つのまとまりが抱える量を確かめる

実務で組んだElasticsearchのワークフローには、値段が付きます

同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。

出品の仕組みを見る