テキスト検索のテストとデバッグ

PostgreSQL 8.4.1文書
前のページ | 巻戻し | 第 12章全文検索 | 早送り | 次のページ

# 12.8. テキスト検索のテストとデバッグ

カスタムテキスト検索設定の挙動は複雑になりがちで、結果として混乱を招くことになります。この章では、テキスト検索オブジェクトのテストの際に役に立つ関数を説明します。設定が完全かどうか、パーサと辞書を別々にテストすることなどが可能です。

## 12.8.1. 設定のテスト

`ts_debug`関数により、テキスト検索設定の容易なテストができます。

       ts_debug([ config regconfig, ] document text,
                OUT alias text,
                OUT description text,
                OUT token text,
                OUT dictionaries regdictionary[],
                OUT dictionary regdictionary,
                OUT lexemes text[])
                returns setof record

`ts_debug`は、パーサが生成し、設定された辞書が処理した`document`のすべてのトークンの情報を表示します。その際、`config`で指定した設定が使われます。引数が省略されると`default_text_search_config`が使われます。

`ts_debug`は、パーサが認識したテキスト中のトークンを1行 につき一つ返します。返却される列は以下です。

- `alias` `text` — トークン型の短縮名

- `description` `text` — トークン型の説明

- `token` `text` — トークンテキスト

- `dictionaries` `regdictionary[]` — 設定によってこのトークン型用に選択された辞書

- `dictionary` `regdictionary` — トークンを認識した辞書。もし認識した辞書がなければ `NULL`

- `lexemes` `text[]` — トークンを認識した辞書が生成した語彙素。もしどの辞書も認識しなければ`NULL`。(`{}`)が返った場合は、ストップワードとして認識されたことを示す

簡単な例を示します。

    SELECT * FROM ts_debug('english','a fat  cat sat on a mat - it ate a fat rats');
       alias   |   description   | token |  dictionaries  |  dictionary  | lexemes
    -----------+-----------------+-------+----------------+--------------+---------
     asciiword | Word, all ASCII | a     | {english_stem} | english_stem | {}
     blank     | Space symbols   |       | {}             |              |
     asciiword | Word, all ASCII | fat   | {english_stem} | english_stem | {fat}
     blank     | Space symbols   |       | {}             |              |
     asciiword | Word, all ASCII | cat   | {english_stem} | english_stem | {cat}
     blank     | Space symbols   |       | {}             |              |
     asciiword | Word, all ASCII | sat   | {english_stem} | english_stem | {sat}
     blank     | Space symbols   |       | {}             |              |
     asciiword | Word, all ASCII | on    | {english_stem} | english_stem | {}
     blank     | Space symbols   |       | {}             |              |
     asciiword | Word, all ASCII | a     | {english_stem} | english_stem | {}
     blank     | Space symbols   |       | {}             |              |
     asciiword | Word, all ASCII | mat   | {english_stem} | english_stem | {mat}
     blank     | Space symbols   |       | {}             |              |
     blank     | Space symbols   | -     | {}             |              |
     asciiword | Word, all ASCII | it    | {english_stem} | english_stem | {}
     blank     | Space symbols   |       | {}             |              |
     asciiword | Word, all ASCII | ate   | {english_stem} | english_stem | {ate}
     blank     | Space symbols   |       | {}             |              |
     asciiword | Word, all ASCII | a     | {english_stem} | english_stem | {}
     blank     | Space symbols   |       | {}             |              |
     asciiword | Word, all ASCII | fat   | {english_stem} | english_stem | {fat}
     blank     | Space symbols   |       | {}             |              |
     asciiword | Word, all ASCII | rats  | {english_stem} | english_stem | {rat}

もう少し高度なデモをお見せするために、まず英語用の`public.english`設定と、Ispell辞書を作ります。

    CREATE TEXT SEARCH CONFIGURATION public.english ( COPY = pg_catalog.english );

    CREATE TEXT SEARCH DICTIONARY english_ispell (
        TEMPLATE = ispell,
        DictFile = english,
        AffFile = english,
        StopWords = english
    );

    ALTER TEXT SEARCH CONFIGURATION public.english
       ALTER MAPPING FOR asciiword WITH english_ispell, english_stem;

    SELECT * FROM ts_debug('public.english','The Brightest supernovaes');
       alias   |   description   |    token    |         dictionaries          |   dictionary   |   lexemes
    -----------+-----------------+-------------+-------------------------------+----------------+-------------
     asciiword | Word, all ASCII | The         | {english_ispell,english_stem} | english_ispell | {}
     blank     | Space symbols   |             | {}                            |                |
     asciiword | Word, all ASCII | Brightest   | {english_ispell,english_stem} | english_ispell | {bright}
     blank     | Space symbols   |             | {}                            |                |
     asciiword | Word, all ASCII | supernovaes | {english_ispell,english_stem} | english_stem   | {supernova}

この例では、単語`Brightest`は、`ASCII word` (エイリアスは`asciiword`)として認識されています。このトークン型のための辞書リストは`english_ispell` と`english_stem`です。この単語は`english_ispell`に認識され、名詞`bright`へと縮退されています。単語`supernovaes`は`english_ispell`辞書には認識されず、次の辞書に渡され、幸い認識されました(実際には、`english_stem`はSnowball辞書で、何でも認識します。それで、この辞書は辞書リストの最後に置かれているわけです)。

単語`The`は、`english_ispell`辞書によってストップワード(項12.6.1)として認識されており、インデックス付けされません。空白も捨てられます。この設定では空白に関する辞書が提供されていないからです。

明示的に見たい列を指定することにより、出力の幅を減らすことができます。

    SELECT alias, token, dictionary, lexemes
    FROM ts_debug('public.english','The Brightest supernovaes');
       alias   |    token    |   dictionary   |   lexemes
    -----------+-------------+----------------+-------------
     asciiword | The         | english_ispell | {}
     blank     |             |                |
     asciiword | Brightest   | english_ispell | {bright}
     blank     |             |                |
     asciiword | supernovaes | english_stem   | {supernova}

## 12.8.2. パーサのテスト

次にあげた関数により、テキスト検索パーサを直接テストすることができます。

       ts_parse(parser_name text, document text,
                OUT tokid integer, OUT token text) returns setof record
       ts_parse(parser_oid oid, document text,
                OUT tokid integer, OUT token text) returns setof record

`ts_parse`は与えられた`document`をパースし、パーサが生成したトークンを1行に1個もつ一連のレコードを返します。それぞれのレコードには、割り当てられたトークン型を示す`tokid`と、テキストのトークンである`token`が含まれます。 例を示します。

    SELECT * FROM ts_parse('default', '123 - a number');
     tokid | token
    -------+--------
        22 | 123
        12 |
        12 | -
         1 | a
        12 |
         1 | number

       ts_token_type(parser_name text, OUT tokid integer,
                     OUT alias text, OUT description text) returns setof record
       ts_token_type(parser_oid oid, OUT tokid integer,
                     OUT alias text, OUT description text) returns setof record

`ts_token_type`は、指定したパーサが認識できるトークン型を記述したテーブルを返します。各々のトークン型に対し、パーサがトークン型をラベル付けするのに使用する整数`tokid`、設定コマンド中のトークンの名前である`alias`、簡単な説明である`description`が含まれます。 例を示します。

    SELECT * FROM ts_token_type('default');
     tokid |      alias      |               description
    -------+-----------------+------------------------------------------
         1 | asciiword       | Word, all ASCII
         2 | word            | Word, all letters
         3 | numword         | Word, letters and digits
         4 | email           | Email address
         5 | url             | URL
         6 | host            | Host
         7 | sfloat          | Scientific notation
         8 | version         | Version number
         9 | hword_numpart   | Hyphenated word part, letters and digits
        10 | hword_part      | Hyphenated word part, all letters
        11 | hword_asciipart | Hyphenated word part, all ASCII
        12 | blank           | Space symbols
        13 | tag             | XML tag
        14 | protocol        | Protocol head
        15 | numhword        | Hyphenated word, letters and digits
        16 | asciihword      | Hyphenated word, all ASCII
        17 | hword           | Hyphenated word, all letters
        18 | url_path        | URL path
        19 | file            | File or path name
        20 | float           | Decimal notation
        21 | int             | Signed integer
        22 | uint            | Unsigned integer
        23 | entity          | XML entity

## 12.8.3. 辞書のテスト

`ts_lexize`関数は辞書のテストを支援します。

        ts_lexize(dict regdictionary, token text) returns text[]

`ts_lexize`は、入力`token`が辞書に認識されれば語彙素の配列を返します。辞書に認識され、それがストップワードである場合には空の配列を返します。認識されなければ`NULL`を返します。

例:

    SELECT ts_lexize('english_stem', 'stars');
     ts_lexize
    -----------
     {star}

    SELECT ts_lexize('english_stem', 'a');
     ts_lexize
    -----------
     {}

> 注意: `ts_lexize`関数には、テキストではなく単一のトークンを与えます。これを間違えると次のようになります。

>     SELECT ts_lexize('thesaurus_astro','supernovae stars') is null;
>      ?column?
>     ----------
>      t

> 類語辞書`thesaurus_astro`は語句`supernovae stars`を認識しますが、`ts_lexize`はしません。なぜなら、入力をテキストではなく、単一のトークンとして扱うからです。類語辞書をテストするには、`plainto_tsquery`または`to_tsvector`を使ってください。例を示します。

>     SELECT plainto_tsquery('supernovae stars');
>      plainto_tsquery
>     -----------------
>      'sn'

前のページ | ホーム | 次のページ
設定例 | 上に戻る | GiSTおよびGINインデックス種類