🔎

【OpenSearch】wildcard型 vs kuromoji。ストレージ容量の差を実際に測ってみた

に公開

【OpenSearch】wildcard型 vs kuromoji。ストレージ容量の差を実際に測ってみた

こんにちは!インターンでエンジニアをしているおさぴーです。

現在、OpenSearchでの検索機能を開発しているのですが、「部分一致検索をどう実現するか」で悩んでいました。
よく「wildcard型はストレージを圧迫する」とか「text型で形態素解析(kuromoji)するのが定石」と言われますが、「実際のところ、どれくらい差が出るの?」 という点が気になったので、PoC(概念実証)で検証してみました!

結論から言うと、「意外と差がないから、厳密な検索をしたいならwildcardもありかも?」 という面白い結果になりました。


背景と悩み

以前、こちらの記事でも書いたのですが、検索精度とパフォーマンスのバランスは常に課題です。

今回は、約10,000文字のランダムな日本語テキストが入る memo フィールドを対象にしました。
「厳密にフィルタリングしたいけど、容量が増えすぎるのは怖い…」という不安を解消するために、以下の3パターンで容量を比較しました。

  1. text型(kuromojiアナライザー)
  2. wildcard型
  3. keyword型(比較用のベースライン)

検証環境

  • ドキュメント数: 100,000件
  • データ内容: memo フィールドに1万文字程度のテキストを生成
  • 計測方法: _cat/indices_stats/segments を使用してインデックスサイズを抽出

驚きの結果:容量の差はたったの1.5倍?

1件あたりの「memoフィールドのみ」の平均容量を算出したところ、以下のようになりました。

マッピング形式 1件あたりのmemo容量 インデックス全体のサイズ
keyword型 (参考) 約 0 KB (ベース) 1.0 GB
text型 (kuromoji) 約 2.1 KB 1.2 GB
wildcard型 約 3.1 KB 1.6 GB

※全体サイズからkeyword型(ベース)を引いて算出

考察:1.5倍をどう見るか

巷では「wildcardは重い」というイメージがありますが、今回の検証ではkuromojiを使った場合と比較して、容量の増加は1.5倍程度に収まりました。

「容量が数倍〜十数倍に膨れ上がる」という恐怖に怯えていたのですが、この程度の差であれば、「漏れのない厳密なフィルタリング(部分一致)」が求められる要件なら、wildcard型を採用するメリットの方が大きいと感じました。


別論点:kuromojiは本当に必要?

検証の過程で、「もしフィルター(完全一致や前方一致)にしか使わないのであれば、そもそもtext型(kuromoji)を追加する必要はあるのか?」という疑問も湧きました。

kuromojiを入れるだけで1件あたり2KB強のコストがかかります。
全文検索(「東京」で検索して「東京都」をヒットさせる等)が不要で、特定のワードが含まれているかを厳密にチェックしたいだけなら、「思い切ってkuromojiを外してwildcardに寄せる」 という選択肢もアリかもしれません。


今回の学び

  • データで語る大切さ: 「なんとなく重そう」で避けるのではなく、実際にインデックスを張ってサイズを見ることで、自信を持って設計を選べるようになりました。
  • トレードオフの再確認: ストレージの1.5倍増を許容して「検索の厳密性」を取るか、それとも節約するか。プロジェクトの要件次第ですが、判断材料が揃ったのが大きな収穫です。

このPoCの結果をもとに、チームで最適なマッピングを相談してみようと思います!


参考リンク

Discussion