PostgreSQLで全文検索を行う「tsquery」型の使い方とサンプルコード


  • tsquery型
    検索対象となる句を格納します。論理演算子 & (論理積)、| (論理和)、! (否定) を用いて、これらの句を組み合わせて使用することができます。
  • tsvector型
    文書を全文検索に最適化された形式で表現します。

tsquery型の使い方

tsquery型は、以下のいずれかの方法で生成できます。

  1. 文字列リテラルから直接生成する:
SELECT to_tsquery('りんご バナナ ミカン');
  1. to_tsquery 関数を使用して、解析済みの文書またはtsvector型から生成する:
SELECT to_tsquery('りんご バナナ ミカン'::text);
  1. plainto_tsquery 関数を使用して、単純なトークンリストから生成する:
SELECT plainto_tsquery('りんご バナナ ミカン');

生成された tsquery 型は、@@ 演算子を使用して、tsvector 型の列に対して検索を実行するために使用することができます。

SELECT * FROM documents
WHERE document_column @@ to_tsquery('りんご バナナ ミカン');

論理演算子の使用

& (論理積)、| (論理和)、! (否定) などの論理演算子を使用して、tsquery 型の値を組み合わせて、より複雑な検索条件を作成することができます。

  • ! (否定): 検索対象となる句を含まない文書を検索します。
  • | (論理和): 検索対象となるいずれかの句を含む文書を検索します。
  • & (論理積): 検索対象となるすべての句を含む文書を検索します。
SELECT * FROM documents
WHERE document_column @@ to_tsquery('りんご & !バナナ');

この例では、りんご は含まれているが、バナナ は含まれていない文書が検索されます。

括弧の使用

括弧を使用して、論理演算子のグループ化を明示的にすることができます。括弧がない場合、! 演算子は他の演算子よりも優先的に処理されます。

SELECT * FROM documents
WHERE document_column @@ to_tsquery('(りんご & バナナ) | ミカン');

この例では、(りんご & バナナ) または ミカン のいずれかを含む文書が検索されます。

tsquery 型には、以下の便利な機能が用意されています。

  • ワイルドカード検索: % 記号を使用して、部分一致検索を実行することができます。
  • フレーズ検索: 引用符で囲まれた文字列を使用して、フレーズ一致検索を実行することができます。
  • サフィックス検索: *: 演算子を使用して、単語の末尾一致検索を実行することができます。
  • プレフィックス検索: :* 演算子を使用して、単語の先頭一致検索を実行することができます。

これらの機能を組み合わせて使用することで、より高度な全文検索を実行することができます。

tsquery 型は、PostgreSQL の全文検索機能において重要な役割を果たします。この型を理解することで、自然言語の文書に対する効率的な検索クエリを作成することができます。

この解説が、PostgreSQLにおける tsquery 型のプログラミングについて理解を深めるのに役立つことを願っています。



単純な全文検索

この例では、document_column 列に格納されている文書に対して、りんご という単語を含む文書を検索します。

SELECT * FROM documents
WHERE document_column @@ to_tsquery('りんご');

論理演算子の使用

この例では、document_column 列に格納されている文書に対して、りんごバナナ の両方の単語を含む文書を検索します。

SELECT * FROM documents
WHERE document_column @@ to_tsquery('りんご & バナナ');

否定演算子の使用

SELECT * FROM documents
WHERE document_column @@ to_tsquery('!りんご');

プレフィックス検索

この例では、document_column 列に格納されている文書に対して、 で始まる単語を含む文書を検索します。

SELECT * FROM documents
WHERE document_column @@ to_tsquery(':*犬');

サフィックス検索

SELECT * FROM documents
WHERE document_column @@ to_tsquery('猫*:');

フレーズ検索

この例では、document_column 列に格納されている文書に対して、"おいしい 料理" というフレーズを含む文書を検索します。

SELECT * FROM documents
WHERE document_column @@ to_tsquery('"おいしい 料理"');

ワイルドカード検索

この例では、document_column 列に格納されている文書に対して、ネコ または イヌ という単語を含む文書を検索します。

SELECT * FROM documents
WHERE document_column @@ to_tsquery('ネコ | イヌ');

これらの例はほんの一例であり、tsquery型を使用して実行できる検索の種類は他にもたくさんあります。



単語検索

  • 短所: フレーズ検索や論理演算など、複雑な検索には不向き
  • 長所: シンプルで高速な検索が可能
SELECT * FROM documents
WHERE document_column LIKE '%りんご%';

LIKE句と正規表現

  • 短所: tsquery 型よりも処理速度が遅い
  • 長所: ある程度複雑な検索が可能
SELECT * FROM documents
WHERE document_column LIKE '%[犬|猫]%';

全文検索エンジン

  • 短所: PostgreSQL に組み込まれていないため、設定と運用が複雑になる
  • 長所: 高度な機能 (全文検索、ランキング、サジェストなど) を備えている

Solr や Elasticsearch などの外部検索エンジン

  • 短所: PostgreSQL との連携が複雑になる
  • 長所: スケーラビリティとパフォーマンスに優れている

カスタムインデックス

  • 短所: 作成と保守に時間と労力が必要
  • 長所: 特定の検索パターンに最適化できる

どの代替方法が最適かは、検索要件、パフォーマンス要件、スキルセットなどの要因によって異なります。

  • 要件
    特殊な要件がある場合は (例: 地理空間検索)、専用の検索エンジンが必要になる場合があります。
  • スキルセット
    すでに tsquery 型や全文検索エンジンを使用している場合は、それらを使い続ける方が効率的かもしれません。
  • パフォーマンス
    パフォーマンスが重要な場合は、tsquery 型または全文検索エンジンを使用することを検討してください。
  • 検索の複雑さ
    単純な単語検索であれば、LIKE 句で十分な場合があります。より複雑な検索の場合は、tsquery 型または全文検索エンジンの方が適している可能性があります。