【OpenSearch】wildcard型 vs kuromoji。ストレージ容量の差を実際に測ってみた
【OpenSearch】wildcard型 vs kuromoji。ストレージ容量の差を実際に測ってみた
こんにちは!インターンでエンジニアをしているおさぴーです。
現在、OpenSearchでの検索機能を開発しているのですが、「部分一致検索をどう実現するか」で悩んでいました。
よく「wildcard型はストレージを圧迫する」とか「text型で形態素解析(kuromoji)するのが定石」と言われますが、「実際のところ、どれくらい差が出るの?」 という点が気になったので、PoC(概念実証)で検証してみました!
結論から言うと、「意外と差がないから、厳密な検索をしたいならwildcardもありかも?」 という面白い結果になりました。
背景と悩み
以前、こちらの記事でも書いたのですが、検索精度とパフォーマンスのバランスは常に課題です。
今回は、約10,000文字のランダムな日本語テキストが入る memo フィールドを対象にしました。
「厳密にフィルタリングしたいけど、容量が増えすぎるのは怖い…」という不安を解消するために、以下の3パターンで容量を比較しました。
- text型(kuromojiアナライザー)
- wildcard型
- 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の結果をもとに、チームで最適なマッピングを相談してみようと思います!
参考リンク
- 以前の考察記事: OpenSearchでの検索設計を考える
- 公式ドキュメント: OpenSearch Wildcard field type
Discussion