導入
データベースシステムの最も一般的な機能の1つは、指定されたクエリに従って項目を検索する機能です。従来のデータベースクエリは、システムツールとデータ構造に精通したユーザーによる構造化されたコマンドに適していますが、ユーザーに公開されている検索機能のほとんどは、異なる技術を使用しています。
この記事では、全文検索の背後にある考え方を紹介します。この種のテキスト処理と検索が従来のデータベースクエリとどのように異なるか、そして多くの場合に役立つ理由について説明します。インデックス作成およびクエリプロセス中に、取得する結果に影響を与えるためにできる決定のいくつかを探り、必要な結果を得るためにこれらのシステムと対話する際に生じるトレードオフのいくつかについて説明します。
The Prisma Data Platformは、本番環境でのデータベースへのアクセスを簡素化するのに役立ちます。Prisma Clientを使用してデータベース接続を管理している場合、Prisma Data Platformは本番ワークロードをより簡単に管理するのに役立つかもしれません。
全文検索とは?
全文検索とは、データベースシステム内のドキュメントの完全なテキストを検索できるようにする一連の技術の用語です。これは、メタデータ、部分的なテキストソース、およびその他の不完全な評価のみに依存する検索機能とは直接対立します。
通常のデータベースクエリとは対照的に、全文検索は言語認識型です。これは、意味的に意味のある結果を取得するために、保存されたドキュメントと検索自体の両方で使用される言語の理解に、ある程度のレベルで依存していることを意味します。
全文検索には、ユーザーのクエリに対する相対的な類似性に基づいて結果をランク付けし、ソートする機能もよく含まれます。これにより、エンジンは最も適切な結果を最初に表示したり、明示的に要求されない限り、ランクの低い項目を除外したりすることができます。
インデックスの重要性
多くのデータベース操作はインデックス作成によって改善できますが、全文検索は特に非同期インデックス作成プロセスに依存します。
インデックス作成とは、既存のドキュメントを解析してインデックスを構築するプロセスです。インデックスは、要求された項目を迅速に見つけるために特別に設計された、より小さく最適化された構造です。通常のデータベースインデックスがいくつかのフィールドを分析してインデックスを作成するのに対し、全文検索インデックスはドキュメントの完全なテキストを分析することによって作成されます。
インデックスがない場合、検索はシリアルスキャンと呼ばれるプロセスを完了する必要があります。このプロセスでは、システムがクエリ時に各項目を分析して、クエリ条件に一致するかどうかを確認します。Unixライクなシステムに詳しい人にとっては、クエリ中にファイルシステムをスキャンするfind
ツールを使用してファイル名を検索することと、定期的に更新されるインデックスに依存する高速なlocate
コマンドの違いに似ています。
インデックスの作成方法
インデックス作成プロセスは、いくつかの関連する段階で構成されています。まず、ドキュメントはパーサーによってスキャンされ、テキストが個々の「トークン」に分割されます。トークンは、システムに認識されている離散的な単語であり、品詞、類似する単語との関連性などに基づいて分類できます。
次に、トークンは言語レベルの意味の単位である「レクセム」に処理されます。このプロセス中に、関連する単語を単一のエントリにまとめるために用語が正規化されることが多く、これによりクエリエンジンは、リテラル検索のわずかなバリエーションである関連性の高い結果を返すことができます。
分析の結果は、クエリエンジンが関連性の高い結果を見つけ、各ドキュメントに関するさまざまな要素を比較できるように、最適化されたインデックスにソートして保存されます。インデックスには、各ドキュメントで見つかったレクセムに関する情報が含まれており、より洗練された検索条件に役立つように、位置データ、レクセム密度などの追加のコンテキストが含まれる場合があります。
インデックス作成プロセスのバランスをとる
全文インデックスを作成するために必要な一般的な手順について説明しましたが、インデックスと結果として得られるクエリ機能の形を決定するいくつかの重要な要素を省略しました。テキストをインデックス化する方法はたくさんあり、その方法を選択する方法は、検索機能のパフォーマンスと特性に大きな影響を与える可能性があります。
ほとんどすべてのインデックス作成プロセスで採用されている最適化の1つは、ストップワードの使用です。ストップワードとは、検索中に無関係である、またはあいまいすぎて役に立たないと見なされる単語のリストです。これらは通常、言語内で最も一般的な単語であり、関連性の高いコンテキストをほとんど含みません。英語の例としては、「the」、「a」、「it」などがあります。インデックス作成中に、ストップワードはインデックスから削除され、これによりインデックスが小さく保たれ、より関連性の高い検索が高速になります。
前述のように、インデックス作成プロセスでは、密接に関連するエントリを1つの項目にまとめることで、インデックスを小さく保ち、類似するクエリに対してより広範囲の結果を提供することもできます。これらの技術の1つである「ステミング」は、同じ単語の「語幹」のバリエーションである単語を結合します。たとえば、「cook」、「cooking」、「cooked」は1つのエントリに結合されます。他の技術では、シソーラスのような言語対応ツールを参照して同義語をマッピングしたり、単語の代わりになる可能性のあるフレーズを識別したりすることもあります。
多くの場合、インデックス作成中に行う決定は、クエリプロセス中に得られる検索結果の品質に影響を与えます。これは、検索効果のさまざまな側面を説明するために使用される技術用語である、再現率と適合率の優先順位付けのバランスとして議論されることがあります。
再現率とは、データセット内の関連結果の総数と比較して、返された関連結果の比率です。再現率の高いクエリは、可能な関連結果の大部分を検索します。
これに関連するのが検索の適合率であり、これは返された結果のうち実際にどれだけが関連していたかを記述します。適合率の高いクエリは、与えられたクエリにあまり関連性のない結果の数が限られています。
ストップワードのような技術は、分析から重要でない単語を除外することで、結果の適合率を高めることができます。一方、ステミングは、わずかな単語の違いのために関連する結果が欠落する可能性のあるインスタンスを捕捉することで、主に再現率を高めます。これら2つの概念は互いに影響し合うため、希望する関連性とボリュームの両方の結果が得られるようにインデックスを構築する際には、両方を考慮に入れる必要があります。
インデックス作成プロセスの最適化
ストップワードやステミング以外にも、データベース管理者がインデックス作成プロセスを最適化する方法は他にもあります。
一部のシステムでは、ドキュメント作成者がドキュメントテキストとともに、関連するキーワードのリストを提供できます。これらは、単語の適切なコンテキストについてインデクサーにヒントとして使用できるだけでなく、ドキュメントの意図する主要な主題を指示するのにも役立ちます。また、インデクサーが同形異義語(スペルは同じだが意味が異なる単語。「意地悪な」人と算術的な「平均」の違いなど)を区別するのにも役立ちます。
開発者と管理者は、使用されるパーサー、辞書、およびトークンの種類を指示することもできます。これらは、インデックス作成プロセス中にテキストがどのように処理され、分解され、分類されるかを決定します。解析アルゴリズムやインデックス作成パターンを変更すると、作成されるインデックスの構造、異なる種類のクエリでのパフォーマンス、および複雑なクエリに対応する柔軟性が変化する可能性があります。
将来のクエリに大きな影響を与える可能性のあるさらなる影響のポイントは、ドキュメントテキスト内のさまざまな要素を重み付けすることです。管理者は、たとえば、ドキュメントのフッターではなくタイトルに含まれる単語に、増加した「重み」、または関連性を割り当てることができます。システムによっては、これは非常に洗練されており、表現力がある場合があります。たとえば、ドキュメントタイトルを分析する際に、主題に特化した単語リストを使用して、ドキュメントごとに主題に関連する用語に重みを増やすことができます。
クエリエンジンへの影響
ほとんどの全文検索システムでは、実際のクエリプロセス中に表現力を許容することも重要です。クエリインターフェースは、この表現力をさまざまな方法で公開できます。
構造化された項目をクエリする際にユーザーが持つ制御レベルを高める最も簡単な方法の1つは、フィールドによる検索を許可することです。これは非構造化テキストではそれほど関連性がありませんが、著者、発行日、タイトル、ジャンルなどのフィールドを使用して検索するためにメタデータと組み合わせると非常に役立ちます。可能な値が少ないフィールドの場合、使いやすさを高めるために、検索可能にするのではなく、インターフェース内で直接選択できるようにすることができます。
複合クエリ演算子は、全文検索ツールがユーザーにクエリエンジンに影響を与えることを許可するもう1つの簡単な方法です。これにより、ユーザーは「and」のような単純なブール論理を使用してクエリを構造化し、存在する必要がある複数の用語を含めたり、「or」を使用して代替を含めたりできます。また、ユーザーが含めるべきではない用語のリスト、存在すべきフレーズ、またはテキスト内の単語間の近接度を考慮するクエリを提供することで、より複雑な機能を有効にすることもできます。
検索インターフェースがクエリエンジンに影響を与えるもう1つの重要な方法は、「厳密な」クエリモードを有効にすることです。通常操作中に近い一致を含めるのは役立つかもしれませんが、指定された正確な単語またはフレーズのみを検索する方が役立つ場合もあります。ユーザーがクエリモードをファジーマッチングと厳密マッチングの間で変更できるようにすることで、関連する結果が表示される可能性が高まります。
結論
この記事では、全文検索とは何かについて述べ、その背後にあるいくつかの核となる概念を紹介しました。全文検索と従来のデータベースクエリの違いについて議論し、このコンテキストでインデックスがなぜ極めて重要であるかを説明し、検索インデックスを設計する際に考慮する必要があるいくつかの要素について説明しました。
全文検索は、多くのニュアンス、最適化、バランスの考慮事項、実装を含む、信じられないほど広範なトピックです。この記事は決定的なリソースとなることを意図したものではありませんが、学習を続ける上で強固な概念的基盤となることを願っています。
The Prisma Data Platformは、本番環境でのデータベースへのアクセスを簡素化するのに役立ちます。Prisma Clientを使用してデータベース接続を管理している場合、Prisma Data Platformは本番ワークロードをより簡単に管理するのに役立つかもしれません。