【ITニュース解説】Text Search with MongoDB and PostgreSQL
2025年09月20日に「Dev.to」が公開したITニュース「Text Search with MongoDB and PostgreSQL」について初心者にもわかりやすく解説しています。
ITニュース概要
MongoDBはBM25アルゴリズムに基づいた高機能な全文検索機能を標準搭載し、文書内の単語頻度や希少性、長さを考慮して関連度を評価する。一方、PostgreSQLの標準機能は単語出現頻度を重視し、高度な検索には拡張機能(例: pg_search)が必要となる。この記事は、両者の全文検索における関連度スコア付けの違いを比較解説した。
ITニュース解説
システムエンジニアを目指す皆さんにとって、データベース内の情報を効率よく探し出す技術は非常に重要だ。「全文検索」は、キーワードを使って文書全体から目的の情報を探し出し、その関連度を評価して、高い順に結果を並べる機能だ。この記事では、MongoDBとPostgreSQLという二つのデータベースが、この全文検索機能をどのように提供し、関連度の評価方法がどう違うのかを比較している。リンゴの絵文字を使った簡単な例を通して、それぞれのデータベースが情報をどのようにランク付けしているのかを見ていこう。
まずMongoDBだ。MongoDBはNoSQLデータベースの一種で、柔軟なデータ構造が特徴である。最近では、MongoDB Search Indexes(検索インデックス)という機能がコミュニティ版でも利用できるようになり、データベースに保存されたデータに対して直接全文検索を行えるようになった。これにより、別の検索システムにデータをコピーする手間なく、複雑な検索クエリを実行できるのが大きなメリットだ。
MongoDBの全文検索は、Luceneという強力な検索エンジンの基盤技術を取り入れたBM25というアルゴリズムを使って関連度を計算する。このBM25アルゴリズムは、主に3つの要素を組み合わせてスコアを決定する。
一つ目は「Term Frequency(TF、単語の出現頻度)」だ。これは、検索したい単語が文書の中に何回現れるかを示す。多く現れるほど関連度が高いと判断されるが、その効果は無限に上がるわけではない。出現回数が増えるにつれてスコアへの貢献度が徐々に小さくなる「逓減(ていげん)効果」というものが考慮される。
二つ目は「Inverse Document Frequency(IDF、逆文書頻度)」だ。これは、検索したい単語がデータベース全体でどれだけ珍しいかを示す指標である。検索語がほとんどの文書に現れるありふれた単語であれば、関連度が高いとは言えない。ごく一部の文書にしか現れない珍しい単語であれば、その単語が含まれる文書は重要だと判断される。IDFは、珍しい単語ほど高いスコアを与える役割を持つ。
三つ目は「Length Normalization(文書長正規化)」だ。これは文書の長さを考慮してスコアを調整する仕組みで、短い文書で単語が出現する方が、非常に長い文書で出現するよりも、文書全体への影響が大きいと判断される。つまり、短い文書の方が同じ条件でもスコアが高くなる傾向がある。
記事の例では、緑のリンゴの絵文字(🍏)が一つしか出現しない文書でも、赤のリンゴの絵文字(🍎)が複数出現する文書よりも高いスコアを得た。これは、緑のリンゴがデータベース全体で珍しい単語である(IDFが高い)ためだ。また、同じ数の赤のリンゴが含まれていても、短い文書の方がスコアが高くなるなど、BM25アルゴリズムの各要素がスコアに影響を与えている。さらに、データベースに無関係な文書を追加すると、IDFの値が変わり、既存の文書のスコアも変動するというBM25の重要な特性も示された。
次にPostgreSQLの全文検索機能だ。PostgreSQLはリレーショナルデータベースとして広く使われており、信頼性と拡張性が高いのが特徴である。PostgreSQLにも全文検索機能が組み込まれており、ts_rank_cdという関数を使って関連度を計算する。
しかし、PostgreSQLのデフォルトの全文検索の関連度評価は、MongoDBのBM25アルゴリズムとは異なり、主に「Term Frequency(TF、単語の出現頻度)」のみを考慮する。つまり、検索語が文書内に多く出現すればするほど、スコアも単純に比例して高くなる。記事の例では、赤のリンゴが6個含まれる文書のスコアは、2個含まれる文書の3倍、1個含まれる文書の6倍になっていた。
PostgreSQLのデフォルト機能では、前述のMongoDBが利用するような「Inverse Document Frequency(IDF、逆文書頻度)」は考慮されない。そのため、データベース全体の文書数が増減しても、個々の文書のスコアは変わらない。これは、検索語の希少性を考慮しないため、ありふれた単語であっても、たくさん出現すれば高いスコアがついてしまうという特徴がある。
ただし、PostgreSQLでも、ts_rank_cd関数に「正規化フラグ」というオプションを指定することで、文書の長さに応じてスコアを調整する(長い文書ほどスコアが下がるようにする)ことは可能だ。これはMongoDBのLength Normalizationと似ているが、あくまで文書の長さに基づく調整であり、真のIDFのような、データベース全体の文書分布を考慮した希少性評価ではない。したがって、PostgreSQLの組み込み全文検索は、単純な出現頻度に基づいた検索には適しているが、より洗練された関連性評価を求める場合には物足りないと感じるかもしれない。
しかし、PostgreSQLの強みはその「拡張性」にある。世界中の開発者によって様々な機能が拡張機能(エクステンション)として提供されており、それを追加することで、組み込み機能にはない高度な機能を利用できる。記事では、ParadeDBというPostgreSQLを基盤としたデータベースで利用できるpg_searchという拡張機能が紹介されている。このpg_searchは、MongoDBが採用しているBM25アルゴリズムをPostgreSQL上で実現するためのもので、LuceneにインスパイアされたTantivyという検索ライブラリを使用している。
このpg_search拡張を導入すれば、PostgreSQLでもMongoDBと同様に、TF、IDF、文書長正規化を考慮した、より高度な関連度スコアリングが可能になる。記事の例では、絵文字のような特殊な記号を検索語として使うと、トークン化(検索可能な単語に分解する処理)で問題が発生する可能性が示唆され、テキストの単語に置き換えることでより正確な結果が得られる様子が示された。これにより、PostgreSQLでも高度な全文検索を実現できることが分かる。ただし、このような拡張機能は、自分自身でインストールや設定が必要となる場合があり、またクラウド上のマネージドサービスでは利用できないこともある。
結論として、全文検索における関連度のスコアリングは、データベースシステムや採用されているアルゴリズムによって大きく異なる。MongoDBは、BM25アルゴリズムに基づく全文検索機能を組み込みで提供し、TF、IDF、文書長正規化を考慮した高度な関連度評価が可能である。特にIDFは、検索語の希少性を考慮するため、データベース全体の文書数によってスコアが変動するという特徴を持つ。
一方、PostgreSQLの組み込み全文検索機能は、主に単語の出現頻度(TF)に基づいたシンプルな評価を行う。IDFのような希少性評価は含まれない。しかし、PostgreSQLの大きな利点である拡張性を活用することで、pg_searchのような外部の拡張機能を追加し、BM25アルゴリズムによる高度な全文検索機能を実現できる。これは、PostgreSQLが利用者のニーズに合わせて柔軟にカスタマイズできることを示している。システムエンジニアを目指す皆さんにとって、これらの特徴を理解し、プロジェクトに最適な全文検索機能を選択できるようになることが重要だ。