★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

8.11. テキスト検索に関する型

PostgreSQLは、自然言語の文書の集合を通して検索を行い問い合わせに最も合致する文書を見つける機能である全文検索をサポートするために設計された2つのデータ型を提供します。 tsvector型はテキスト検索に最適化された形式で文書を表現します。 tsquery型は同様に問い合わせを表現します。 第12章ではこの機能を詳しく説明します。 また、9.13では、関連する関数や演算子を要約します。

8.11.1. tsvector

tsvectorの値は重複がない語彙素のソート済みリストです。 語彙素とは同じ単語の変種をまとめるために正規化された単語です(詳細は第12章を参照)。 以下の例に示すようにソートと重複除去は入力の際に自動的になされます。

SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector;
                      tsvector
----------------------------------------------------
 'a' 'and' 'ate' 'cat' 'fat' 'mat' 'on' 'rat' 'sat'

空白文字または句読点を含む語彙素を表現するには、引用符でくくってください。

SELECT $$the lexeme '    ' contains spaces$$::tsvector;
                 tsvector                  
-------------------------------------------
 '    ' 'contains' 'lexeme' 'spaces' 'the'

(この例と次の例では、リテラル内で引用符記号を二重にしなければならないことによる混乱を防ぐためにドル引用符付け文字列を使用します。) 引用符およびバックスラッシュが埋め込まれている場合は、以下のように二重にしなければなりません。

SELECT $$the lexeme 'Joe''s' contains a quote$$::tsvector;
                    tsvector                    
------------------------------------------------
 'Joe''s' 'a' 'contains' 'lexeme' 'quote' 'the'

オプションとして、語彙素に整数の位置を付けることもできます。

SELECT 'a:1 fat:2 cat:3 sat:4 on:5 a:6 mat:7 and:8 ate:9 a:10 fat:11 rat:12'::tsvector;
                                  tsvector
-------------------------------------------------------------------​------------
 'a':1,6,10 'and':8 'ate':9 'cat':3 'fat':2,11 'mat':7 'on':5 'rat':12 'sat':4

位置は通常、元の単語の文書中の位置を示します。 位置情報を近接順序に使用することができます。 位置の値は1から16383までで、これより大きな値は警告なく16383に設定されます。 同一語彙素に対する重複する位置項目は破棄されます。

位置を持つ語彙素はさらに重み付きのラベルを付与することができます。 ラベルはABCDを取ることができます。 Dはデフォルトですので、以下のように出力には現れません。

SELECT 'a:1A fat:2B,4C cat:5D'::tsvector;
          tsvector          
----------------------------
 'a':1A 'cat':5 'fat':2B,4C

典型的に重みは、例えば、表題の単語には本文の単語と異なる印をつけるといった、文書構造を反映させるために使用されます。 テキスト検索の順序付け関数は異なる重み印に異なる優先度を割り当てることができます。

tsvector型自体は単語の正規化を行わないことを理解することは重要です。 与えられる単語はアプリケーションのために適切に正規化されていると仮定しています。 以下に例を示します。

SELECT 'The Fat Rats'::tsvector;
      tsvector      
--------------------
 'Fat' 'Rats' 'The'

ほとんどの英文テキスト検索アプリケーションでは、上の単語は正規化されていないとみなされますが、tsvectorは気にしません。 検索用に単語を適切に正規化するために、生の文書テキストは通常to_tsvector経由で渡されます。

SELECT to_tsvector('english', 'The Fat Rats');
   to_tsvector   
-----------------
 'fat':2 'rat':3

これについても、詳細は第12章を参照してください。

8.11.2. tsquery

tsqueryの値には検索される語彙素が格納されます。 それらは論理演算子& (論理積)、| (論理和)、!(否定)および語句検索演算子<->(FOLLOWED BY)を組み合わせることができます。 FOLLOWED BY演算子には<N>という変化形もあり、Nは2つの検索される語彙素の距離を指定する数値型の定数です。 <-><1>は同じです。

括弧を使用して演算子を強制的にグループ化することができます。 括弧が無い場合、! (NOT)が最も強く結合し、<-> (FOLLOWED BY)が次に強く結合します。 次いで、& (AND)の結合が強く、 | (OR)の結合が最も弱くなります。

以下に例を示します:

SELECT 'fat & rat'::tsquery;
    tsquery    
---------------
 'fat' & 'rat'

SELECT 'fat & (rat | cat)'::tsquery;
          tsquery          
---------------------------
 'fat' & ( 'rat' | 'cat' )

SELECT 'fat & rat & ! cat'::tsquery;
        tsquery         
------------------------
 'fat' & 'rat' & !'cat'

省略することもできますが、tsquery内の語彙素に1つ以上の重み文字でラベルを付けることができます。 こうすると、これらの重みを持つtsvector語彙素のみに一致するように制限することになります。

SELECT 'fat:ab & cat'::tsquery;
    tsquery
------------------
 'fat':AB & 'cat'

同時に、tsquery内の語彙素は、前方一致を指定するため*でラベルを付けることができます。

SELECT 'super:*'::tsquery;
  tsquery  
-----------
 'super':*

この問い合わせではsuperで始まるtsvector中の全ての言葉と一致します。

語彙素の引用符規則は前に説明したtsvectorにおける語彙素と同じです。 また、tsvector同様、必要な単語の正規化はtsquery型に変換する前に行う必要があります。 こうした正規化の実行にはto_tsquery関数が簡便です。

SELECT to_tsquery('Fat:ab & Cats');
    to_tsquery    
------------------
 'fat':AB & 'cat'

to_tsqueryは他の言葉と同じように接頭辞を扱うことに注意してください。 以下の比較の例ではtrueを返します。

SELECT to_tsvector( 'postgraduate' ) @@ to_tsquery( 'postgres:*' );
 ?column?
----------
 t

これはpostgresにはpostgrの語幹を含んでいるためです。

SELECT to_tsvector( 'postgraduate' ), to_tsquery( 'postgres:*' );
  to_tsvector  | to_tsquery
---------------+------------
 'postgradu':1 | 'postgr':*

これはpostgraduateの語幹の形と一致します。