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