16.04前書きフルテキスト検索(FTS)は、データベースで結果を見つけるために検索エンジンが使用する手法です。ショップ、検索エンジン、新聞などのWebサイトでの検索結果の出力に使用できます。具体的には、FTSは_documents_を取得します。これは、テキストデータを含むデータベースエンティティであり、検索条件に完全には一致しません。これは、たとえば、ユーザーが「猫と犬」を検索する場合、FTSに裏付けられたアプリケーションは、単語(「猫」または「犬」のみ)を含む結果を返すことができることを意味します。(「犬と猫」)、または単語の変形(「猫」または「犬」)が含まれています。これにより、ユーザーが何を意味しているのかを推測し、より関連性の高い結果をより迅速に返すという点で、アプリケーションに利点がもたらされます。技術的に言えば、PostgreSQLのようなデータベース管理システム(DBMS)は通常、LIKE句を使用した部分的なテキスト検索を許可します。これらの要求は、大規模なデータセットではパフォーマンスが低下する傾向があります。ユーザーの正確な入力との一致に制限されているため、関連情報を含むドキュメントがあっても、クエリは結果を生成しない場合があります。FTSを使用すると、より高度なツールに余分な依存関係を導入することなく、より強力なテキスト検索エンジンを構築できます。このチュートリアルでは、PostgreSQLを使用して架空のニュースWebサイトの記事を含むデータを保存し、FTSを使用してデータベースにクエリを実行し、最適な一致のみを選択する方法を学習します。最後のステップとして、全文検索クエリのパフォーマンス改善を実装します。前提条件このガイドを始める前に、次のものが必要です。16.04サーバー-rootユーザー。16.04にPostgreSQLをインストールして使用する方法]ガイドに従ってインストールされたPostgreSQL。このチュートリアルでは、このガイドで設定した「++」データベースとユーザーを使用します。+`パッケージがあることを確認してください。手順1-サンプルデータの作成まず、全文検索プラグインをテストするためのデータが必要なので、サンプルデータを作成しましょう。テキスト値を持つ独自のテーブルがある場合は、手順2に進んで、適切な置換を行うことができます。それ以外の場合、最初のステップは、サーバーからPostgreSQLデータベースに接続することです。同じホストから接続しているため、デフォルトではパスワードを入力する必要はありません。sammyこれにより、操作中のデータベース名を示すインタラクティブなPostgreSQLセッションが確立されます。この例では、「+」です。=#+`データベースコマンドプロンプトが表示されます。+」というサンプルテーブルを作成します。この表の各エントリは、タイトル、コンテンツ、著者名、一意の識別子を含むニュース記事を表します。+」を持つテーブルのプライマリインデックスです。これは、データベースインデックスに自動的に移動する一意の識別子です。このインデックスについては、パフォーマンスの改善を検討する際にステップ3で詳しく説明します。+`コマンドを使用してテーブルにサンプルデータを追加します。以下のコマンドのこのサンプルデータは、いくつかのサンプルニュース記事を表しています。'Jo');データベースに検索するデータがあるので、クエリを作成してみてください。ステップ2-ドキュメントの準備と検索ここでの最初のステップは、データベーステーブルから複数のテキスト列を持つ1つのドキュメントを構築することです。次に、結果の文字列を単語のベクトルに変換できます。これがクエリで使用されます。to_tsvector()+`を使用して、すべての列をまとめる必要があります。1;これにより、最初のレコードがドキュメント全体として返され、検索に使用される変換されたバージョンも返されます。`の語数よりも少ないことに気付くかもしれません。一部の単語は異なり、すべての単語にはセミコロンと数字が付加されています。to_tsvector()+`が各単語を正規化して同じ単語の異形を検出できるようにし、結果をアルファベット順にソートするためです。この数字は、「+ドキュメント」における世界の位置です。正規化された単語が複数回現れる場合、追加のカンマ区切りの位置があります。これで、「Explorations」という用語を検索することにより、この変換されたドキュメントを使用してFTS機能を利用できます。to_tsquery('Explorations');ここで使用した関数と演算子を調べてみましょう。to_tsvector()+`と同じ方法で入力を減らすテキスト検索条件に変換します。この関数を使用して、使用する言語と、結果にすべての単語を含める必要があるのか​​、その1つだけを含めるのかを指定できます。」と一致するかどうかを識別します。false」を返します。WHERE」基準の一部として簡単に使用できます。Ethan検索に使用した単語は「Explorations」でしたが、クエリは「Exploring」という単語を含むドキュメントを返しました。+`演算子を使用すると、空の結果になります。FTS用のドキュメントを準備する方法とクエリを構成する方法がわかったので、FTSのパフォーマンスを改善する方法を見てみましょう。ステップ3-FTSパフォーマンスの改善FTSクエリを使用するたびにドキュメントを生成することは、大規模なデータセットまたは小規模なサーバーを使用する場合のパフォーマンスの問題になる可能性があります。これに対する良い解決策は、ここで実装しますが、行を挿入するときに変換されたドキュメントを生成し、他のデータとともに保存することです。このように、毎回生成する代わりに、クエリで取得することができます。`+`という追加の列を作成します。tsvector;ここで、別のクエリを使用してデータをテーブルに挿入する必要があります。+」列に追加する必要があります。+`列に空の値を追加する必要があります。次に、生成された値で更新する必要があります。+`コマンドを使用して、不足しているデータを追加します。NULL;これらの行をテーブルに追加するとパフォーマンスが向上しますが、大規模なデータセットでは、データベースがテーブル全体をスキャンして検索条件に一致する行を見つける必要があるため、依然として問題が発生する可能性があります。これに対する簡単な解決策は、インデックスを使用することです。_データベースインデックス_は、データ取得操作のパフォーマンスを向上させるメインデータとは別にデータを格納するデータ構造です。テーブルの内容が変更されると、追加の書き込みと比較的小さなストレージスペースのコストで更新されます。その小さなサイズと調整されたデータ構造により、クエリの選択にメイン表スペースを使用するよりもはるかに効率的にインデックスを操作できます。最終的に、インデックスは、特別なデータ構造とアルゴリズムを使用して検索することにより、データベースが行をすばやく見つけるのに役立ちます。[いくつかの種類のインデックス]があります。このユースケースに最も関連するのは、GiSTインデックスとGINインデックスです。それらの主な違いは、テーブルからドキュメントを取得できる速度です。GINは、新しいデータを追加するときはビルドが遅くなりますが、クエリは速くなります。GISTはより高速に構築されますが、追加のデータ読み取りが必要です。GiSTはデータの取得がGINの約3倍遅いため、ここでGINインデックスを作成します。SELECT`クエリももう少しシンプルになりました。Cure');出力は次のようになります。+`でデータベースコンソールを終了できます。結論このガイドでは、PostgreSQLでの全文検索の使用方法について説明しました。これには、メタデータドキュメントの準備と保存、パフォーマンスの向上のためのインデックスの使用が含まれます。[全文検索に関するPostgreSQLの公式ドキュメント]をご覧ください。