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