文書10万件から語ごとの並びを作りました。最もありふれた語は99990件を含みます。
全部を見るのと1倍です。一方1000番目の語なら436件で、229倍の差がつきます。
索引が短くするのは、見に行く文書の数です。語によって、その数が桁で違います。
Elasticsearchで扱う単位は、索引です。公式は索引はElasticsearchで保管の基本となる単位であり、データとやりとりする水準でもあると定めています。
その中では、語から文書へ引ける形でデータが並べ直されています。どれだけ効くかを、その並びを実際に作って数えました。
文書10万件・語2万種です。語の出やすさには偏りを付けてあります。
文書 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の記事で扱いました。
ありふれた語ほど効かない。効くのは珍しい語。
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つの語をどちらも含む文書を探す。短い並びから当たるかどうかで走査が変わる 組み合わせ 長いほうから 短いほうから 差 ありふれた語+1000番目 99,990件 436件 229倍 10番目+1000番目 50,386件 436件 116倍 1000番目+真ん中 436件 35件 12倍
同じ条件でも、当たる順番で229倍違います。長いほうから当たれば99990件、短いほうからなら436件です。
1行目に注目してください。ありふれた語が混ざっていても、もう1語が珍しければ速くなります。
4番目が効きます。期間で分けて持てば、探す範囲がその期間の分だけになります。かけらに分けるのと同じ考え方です。
走査する量は、短いほうの並びで決まる。
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つあたりを扱える大きさに保つためです。
Elasticsearchが分けて持つ理由は、公式に書かれています。
各かけらは自己完結したLuceneの索引であり、どれだけのデータを効率よく扱えるかについて現実的な限りがある。だからデータを複数のかけらに分けることで、個々のかけらの性能を保つという記述です。
前の計測でいえば、索引の項目は合わせて424万件でした。文書10万件でこの量です。
1文書あたり60語なので、項目は文書数に比例します。100万件なら4240万件です。
並びの長さも比例します。1000番目の語は436件でしたが、文書が10倍なら4360件になります。229倍という比は変わりません。
つまり比は保たれるが、絶対の量は増えます。だから分ける必要が出てきます。
分ける単位が検索の条件と合っていれば、探す範囲そのものを減らせます。期間で分けて期間で絞る形が典型です。
合っていなければ、すべてのかけらに聞いて結果を合わせることになります。分けた数だけ問い合わせが増えます。
鍵から置き場所が決まる仕組みで同じ問題を扱ったのがDynamoDBの記事です。分けても偏りが消えない場合を数えました。
語の出やすさの偏りは式で作ったもので、実際の文書の分布ではありません。1文書60語という値も置いたものです。索引は語ごとに文書番号を並べただけの単純な形で、実際の実装はこれを縮めて持つため、量はここより小さくなります。ここで見せているのは、索引の効き目が語ごとに桁で違うこと、組み合わせでは短い並びが効くことの2つです。
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
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る