12.7. Exemplo de configuração #

Uma configuração de procura de texto completo especifica todas as opções necessárias para transformar um documento em um tsvector: o analisador a ser usado para quebrar o texto em tokens, e os dicionários a serem usados para transformar cada token em lexema. Todas as chamadas às funções to_tsvector ou to_tsquery precisam de uma configuração de procura de texto para realizar seu processamento. O parâmetro de configuração default_text_search_config especifica o nome da configuração padrão usada pelas funções de procura de texto quando o parâmetro de configuração explícito é omitido. Pode ser definido no arquivo postgresql.conf, ou para uma sessão individual usando o comando SET.

Estão disponíveis várias configurações de procura de texto completo predefinidas, podendo ser criadas configurações personalizadas facilmente. Para facilitar o gerenciamento de objetos de procura de texto, está disponível um conjunto de comandos SQL, e há vários comandos psql que exibem informações sobre objetos de procura de texto (Seção 12.10).

Como exemplo, será criada a configuração pg, começando pela duplicação da configuração interna de english:

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

Será criada uma lista de sinônimos específica do PostgreSQL, armazenada no arquivo $SHAREDIR/tsearch_data/pg_dict.syn. O conteúdo do arquivo se parece com:

postgres    pg
pgsql       pg
postgresql  pg

O dicionário de sinônimos será definido assim:

CREATE TEXT SEARCH DICTIONARY pg_dict (
    TEMPLATE = synonym,
    SYNONYMS = pg_dict
);

Em seguida, será criado o dicionário de procura de texto completo Ispell, english_ispell que possui seus próprios arquivos de configuração:

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

Agora podem ser configurados os mapeamentos para palavras na configuração pg:

ALTER TEXT SEARCH CONFIGURATION pg
    ALTER MAPPING FOR asciiword, asciihword, hword_asciipart,
                      word, hword, hword_part
    WITH pg_dict, english_ispell, english_stem;

Optou-se por não indexar ou procurar alguns tipos de token que a configuração interna manipula:

ALTER TEXT SEARCH CONFIGURATION pg
    DROP MAPPING FOR email, url, url_path, sfloat, float;

Agora a configuração pode ser testada:

SELECT alias, token, dictionaries, dictionary
FROM ts_debug('public.pg', '
PostgreSQL, the highly scalable, SQL compliant, open source object-relational
database management system, is now undergoing beta testing of the next
version of our software.
');

      alias      |       token       |             dictionaries              |   dictionary
-----------------+-------------------+---------------------------------------+----------------
 blank           |                  +| {}                                    |
                 |                   |                                       |
 asciiword       | PostgreSQL        | {pg_dict,english_ispell,english_stem} | pg_dict
 blank           | ,                 | {}                                    |
 asciiword       | the               | {pg_dict,english_ispell,english_stem} | english_ispell
 blank           |                   | {}                                    |
 asciiword       | highly            | {pg_dict,english_ispell,english_stem} | english_ispell
 blank           |                   | {}                                    |
 asciiword       | scalable          | {pg_dict,english_ispell,english_stem} | english_ispell
 blank           | ,                 | {}                                    |
 asciiword       | SQL               | {pg_dict,english_ispell,english_stem} | english_ispell
 blank           |                   | {}                                    |
 asciiword       | compliant         | {pg_dict,english_ispell,english_stem} | english_ispell
 blank           | ,                 | {}                                    |
 asciiword       | open              | {pg_dict,english_ispell,english_stem} | english_ispell
 blank           |                   | {}                                    |
 asciiword       | source            | {pg_dict,english_ispell,english_stem} | english_ispell
 blank           |                   | {}                                    |
 asciihword      | object-relational | {pg_dict,english_ispell,english_stem} | english_stem
 hword_asciipart | object            | {pg_dict,english_ispell,english_stem} | english_ispell
 blank           | -                 | {}                                    |
 hword_asciipart | relational        | {pg_dict,english_ispell,english_stem} | english_ispell
 blank           |                  +| {}                                    |
                 |                   |                                       |
 asciiword       | database          | {pg_dict,english_ispell,english_stem} | english_ispell
 blank           |                   | {}                                    |
 asciiword       | management        | {pg_dict,english_ispell,english_stem} | english_ispell
 blank           |                   | {}                                    |
 asciiword       | system            | {pg_dict,english_ispell,english_stem} | english_ispell
 blank           | ,                 | {}                                    |
 asciiword       | is                | {pg_dict,english_ispell,english_stem} | english_ispell
 blank           |                   | {}                                    |
 asciiword       | now               | {pg_dict,english_ispell,english_stem} | english_ispell
 blank           |                   | {}                                    |
 asciiword       | undergoing        | {pg_dict,english_ispell,english_stem} | english_ispell
 blank           |                   | {}                                    |
 asciiword       | beta              | {pg_dict,english_ispell,english_stem} | english_ispell
 blank           |                   | {}                                    |
 asciiword       | testing           | {pg_dict,english_ispell,english_stem} | english_ispell
 blank           |                   | {}                                    |
 asciiword       | of                | {pg_dict,english_ispell,english_stem} | english_ispell
 blank           |                   | {}                                    |
 asciiword       | the               | {pg_dict,english_ispell,english_stem} | english_ispell
 blank           |                   | {}                                    |
 asciiword       | next              | {pg_dict,english_ispell,english_stem} | english_ispell
 blank           |                  +| {}                                    |
                 |                   |                                       |
 asciiword       | version           | {pg_dict,english_ispell,english_stem} | english_ispell
 blank           |                   | {}                                    |
 asciiword       | of                | {pg_dict,english_ispell,english_stem} | english_ispell
 blank           |                   | {}                                    |
 asciiword       | our               | {pg_dict,english_ispell,english_stem} | english_ispell
 blank           |                   | {}                                    |
 asciiword       | software          | {pg_dict,english_ispell,english_stem} | english_ispell
 blank           | .                +| {}                                    |
                 |                   |                                       |
(52 linhas)

O próximo passo é definir a sessão para usar a nova configuração, criada no esquema public, como padrão:

=> \dF
   List of text search configurations
 Schema  | Name | Description
---------+------+-------------
 public  | pg   |

SET default_text_search_config = 'public.pg';
SET

SHOW default_text_search_config;
 default_text_search_config
----------------------------
 public.pg