Os analisadores de procura de texto completo são responsáveis por
dividir o texto bruto do documento em tokens
e identificar o tipo de cada token, onde o conjunto
de tipos possíveis é definido pelo próprio analisador.
Note que o analisador não modifica o texto de forma alguma —
ele apenas identifica limites possíveis de palavras.
Devido a este escopo limitado, há menos necessidade de analisadores
personalizados específicos para a aplicação do que de dicionários
personalizados.
No momento, o PostgreSQL fornece apenas
um analisador nativo, que se mostrou útil para uma ampla variedade
de aplicações.
O analisador nativo se chama pg_catalog.default.
Ele reconhece os 23 tipos de token mostrados na
Tabela 12.1.
Tabela 12.1. Tipos de token do analisador padrão
| Alias | Descrição | Exemplo |
|---|---|---|
asciiword | Palavra, todas letras ASCII | elefante |
word | Palavra, todas letras | manhã |
numword | Palavra, letras e dígitos | beta1 |
asciihword | Palavra composta, todas ASCII | up-to-date |
hword | Palavra composta, todas letras | lógico-matemática |
numhword | Palavra composta, letras e dígitos | postgresql-beta1 |
hword_asciipart | Parte da palavra composta, todas ASCII | postgresql no contexto postgresql-beta1 |
hword_part | Parte da palavra composta, todas letras | lógico ou matemática
no contexto lógico-matemática |
hword_numpart | Parte da palavra composta, letras e dígitos | beta1 no contexto
postgresql-beta1 |
email | Endereço de Email | foo@example.com |
protocol | Cabeçalho de protocolo | http:// |
url | URL | example.com/stuff/index.html |
host | Hospedeiro | example.com |
url_path | Caminho de URL | /stuff/index.html, no contexto de uma URL |
file | Nome de arquivo ou caminho | /usr/local/foo.txt, se não estiver dentro de uma URL |
sfloat | Notação científica | -1.234e56 |
float | Notação decimal | -1.234 |
int | Inteiro com sinal | -1234 |
uint | Inteiro sem sinal | 1234 |
version | Número de versão | 8.3.0 |
tag | Declaração XML | <a href="dictionaries.html"> |
entity | Entidade XML | & |
blank | Símbolos de espaço | (qualquer espaço em branco ou pontuação não reconhecida de outra forma) |
A noção do analisador sobre o que é uma “letra”,
é determinada pela configuração de localidade do banco de dados,
especificamente lc_ctype.
As palavras que contêm apenas as letras ASCII básicas são relatadas
como um tipo de token separado, porque é às vezes
útil distingui-las.
Na maioria dos idiomas europeus, os tipos de token
“word e
asciiword” devem ser tratados da mesma forma.
email não oferece suporte a todos os caracteres
de e-mail válidos conforme definido pelo
RFC 5322.
Especificamente, os únicos caracteres não alfanuméricos com suporte
para nomes de usuário de e-mail são ponto, hífen e sublinhado
(.-_).
tag não oferece suporte a todos os nomes de
declaração (tags) válidos
conforme definidos em
W3C Recommendation, XML.
Especificamente, os únicos nomes de declarações com suporte são
aqueles que começam com uma letra ASCII, sublinhado ou dois pontos
e que contêm apenas letras, dígitos, hífens, sublinhados, pontos
e dois pontos.
tag também inclui comentários XML que começam
com <!-- e terminam com -->,
e declarações XML (mas note que isto inclui tudo que começa com
<?x e termina com >).
É possível que o analisador produza tokens
sobrepostos para o mesmo pedaço de texto.
Como exemplo, uma palavra composta será relatada como a palavra
inteira, e como cada componente:
SELECT alias, description, token
FROM ts_debug('portuguese', '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
(6 linhas)
Este comportamento é desejado, porque permite que as procuras funcionem tanto para a palavra composta inteira, quanto para seus componentes. A seguir está outro exemplo instrutivo:
SELECT alias, description, token
FROM ts_debug('portuguese', '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 (4 linhas)
Exemplo 12.2. Exemplo do tradutor
Análise de texto em português
Neste exemplo é usada a primeira quadra do soneto “Mudam-se os tempos, mudam-se as vontades”, de Luís de Camões, para fazer a análise do texto.
SELECT alias, description, token, lexemes FROM ts_debug('portuguese',
$$Mudam-se os tempos, mudam-se as vontades,
muda-se o ser, muda-se a confiança;
todo o Mundo é composto de mudança,
tomando sempre novas qualidades.$$);
alias | description | token | lexemes
-----------------+---------------------------------+------------+------------
asciihword | Hyphenated word, all ASCII | Mudam-se | {mudam-s}
hword_asciipart | Hyphenated word part, all ASCII | Mudam | {mud}
blank | Space symbols | - |
hword_asciipart | Hyphenated word part, all ASCII | se | {}
blank | Space symbols | |
asciiword | Word, all ASCII | os | {}
blank | Space symbols | |
asciiword | Word, all ASCII | tempos | {temp}
blank | Space symbols | , |
asciihword | Hyphenated word, all ASCII | mudam-se | {mudam-s}
hword_asciipart | Hyphenated word part, all ASCII | mudam | {mud}
blank | Space symbols | - |
hword_asciipart | Hyphenated word part, all ASCII | se | {}
blank | Space symbols | |
asciiword | Word, all ASCII | as | {}
blank | Space symbols | |
asciiword | Word, all ASCII | vontades | {vontad}
blank | Space symbols | , +|
| | |
asciihword | Hyphenated word, all ASCII | muda-se | {muda-s}
hword_asciipart | Hyphenated word part, all ASCII | muda | {mud}
blank | Space symbols | - |
hword_asciipart | Hyphenated word part, all ASCII | se | {}
blank | Space symbols | |
asciiword | Word, all ASCII | o | {}
blank | Space symbols | |
asciiword | Word, all ASCII | ser | {ser}
blank | Space symbols | , |
asciihword | Hyphenated word, all ASCII | muda-se | {muda-s}
hword_asciipart | Hyphenated word part, all ASCII | muda | {mud}
blank | Space symbols | - |
hword_asciipart | Hyphenated word part, all ASCII | se | {}
blank | Space symbols | |
asciiword | Word, all ASCII | a | {}
blank | Space symbols | |
word | Word, all letters | confiança | {confianc}
blank | Space symbols | ; +|
| | |
asciiword | Word, all ASCII | todo | {tod}
blank | Space symbols | |
asciiword | Word, all ASCII | o | {}
blank | Space symbols | |
asciiword | Word, all ASCII | Mundo | {mund}
blank | Space symbols | |
word | Word, all letters | é | {é}
blank | Space symbols | |
asciiword | Word, all ASCII | composto | {compost}
blank | Space symbols | |
asciiword | Word, all ASCII | de | {}
blank | Space symbols | |
word | Word, all letters | mudança | {mudanc}
blank | Space symbols | , +|
| | |
asciiword | Word, all ASCII | tomando | {tom}
blank | Space symbols | |
asciiword | Word, all ASCII | sempre | {sempr}
blank | Space symbols | |
asciiword | Word, all ASCII | novas | {nov}
blank | Space symbols | |
asciiword | Word, all ASCII | qualidades | {qualidad}
blank | Space symbols | . |
(58 linhas)