★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' 'quote' '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の値には検索される字句単位が格納され、それらは& (論理積)、| (論理和)、!(否定)論理演算子を遵守することで組み合わせられます。 括弧を使用して演算子を強制的にグループ化することができます。

 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つ以上の重み文字をもったラベルを付けることができます。 これにより、こうした一致に関する重みの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'