テキスト検索パーサは、もとの文書テキストを分割してトークンに変換し、それぞれのトークンの型を識別子する役割を持っています。ここで、可能な型の集合は、パーサ自身が定義します。パーサは文書をまったく変更しないことに注意してください — それは、単に可能な単語の境界を識別するだけです。このような制限があるため、カスタム辞書を作るのに比べ、用途限定のカスタムパーサを作る必要性は少ないです。今のところ、PostgreSQLはたった一つの組み込みパーサを提供しています。これは広い範囲の用途に対して有用であると考えられています。
組み込みのパーサはpg_catalog.defaultというもので、23のトークンを理解します。
表 12-1. Default Parser's Token Types
| 別名 | 説明 | 例 |
|---|---|---|
| asciiword | 単語、すべてのASCII文字 | elephant |
| word | 単語、すべての文字 | mañana |
| numword | 単語、文字、数字 | beta1 |
| asciihword | ハイフンでつながれた単語、すべてのASCII | up-to-date |
| hword | ハイフンでつながれた単語、すべての文字 | lógico-matemática |
| numhword | ハイフンでつながれた単語、すべての文字、数字 | postgresql-beta1 |
| hword_asciipart | ハイフンでつながれた単語の一部、すべての ASCII | postgresql-beta1のpostgresql |
| hword_part | ハイフンでつながれた単語の一部、すべての文字 | lógico-matemáticaのlógicoまたはmatemática |
| hword_numpart | ハイフンでつながれた単語の文字+数字の部分 | postgresql-beta1のbeta1 |
| 電子メールアドレス | foo@example.com | |
| protocol | プロトコルヘッダー | http:// |
| url | URL | example.com/stuff/index.html |
| host | ホスト名 | example.com |
| url_path | URL中のパス名 | URL中の/stuff/index.html |
| file | ファイルまたはパス名 | URL中でない/usr/local/foo.txt |
| sfloat | 科学技術表記 | -1.234e56 |
| float | 10進表記 | -1.234 |
| int | 符号付き整数 | -1234 |
| uint | 符号なし整数 | 1234 |
| version | バージョン番号 | 8.3.0 |
| tag | XMLタグ | <a href="dictionaries.html"> |
| entity | XMLエンティティ | & |
| blank | 空白記号 | (他のものに解釈できない空白または句読点) |
注意: パーサにとっての"文字"は、データベースのロケールの設定、特にlc_ctypeによって決まります。基本的なASCIIのみを含む単語は、別のトークン型として報告されます。ときには、それらを他と区別することが有用だからです。ヨーロッパのたいていの言語では、word と asciiwordは、同じように扱われます。
パーサがテキストの同じ部分から重複したトークンを生成することはあり得ます。たとえば、ハイフン付の単語は、単語全体と、各部分の両方を報告します。例を示します。
SELECT alias, description, token FROM ts_debug('foo-bar-beta1');
alias | description | token
-----------------+------------------------------------------+---------------
numhword | Hyphenated word, letters and digits | foo-bar-beta1
hword_asciipart | Hyphenated word part, all ASCII | foo
blank | Space symbols | -
hword_asciipart | Hyphenated word part, all ASCII | bar
blank | Space symbols | -
hword_numpart | Hyphenated word part, letters and digits | beta1この挙動は好ましいのものです。単語全体と、各々の部分の両方に対して検索ができるからです。初歩的な別の例を示します。
SELECT alias, description, token FROM ts_debug('http://example.com/stuff/index.html');
alias | description | token
----------+---------------+------------------------------
protocol | Protocol head | http://
url | URL | example.com/stuff/index.html
host | Host | example.com
url_path | URL path | /stuff/index.html