12.5. Analisadores #

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

AliasDescriçãoExemplo
asciiwordPalavra, todas letras ASCIIelefante
wordPalavra, todas letrasmanhã
numwordPalavra, letras e dígitosbeta1
asciihwordPalavra composta, todas ASCIIup-to-date
hwordPalavra composta, todas letraslógico-matemática
numhwordPalavra composta, letras e dígitospostgresql-beta1
hword_asciipartParte da palavra composta, todas ASCIIpostgresql no contexto postgresql-beta1
hword_partParte da palavra composta, todas letraslógico ou matemática no contexto lógico-matemática
hword_numpartParte da palavra composta, letras e dígitosbeta1 no contexto postgresql-beta1
emailEndereço de Emailfoo@example.com
protocolCabeçalho de protocolohttp://
urlURLexample.com/stuff/index.html
hostHospedeiroexample.com
url_pathCaminho de URL/stuff/index.html, no contexto de uma URL
fileNome de arquivo ou caminho/usr/local/foo.txt, se não estiver dentro de uma URL
sfloatNotação científica-1.234e56
floatNotação decimal-1.234
intInteiro com sinal-1234
uintInteiro sem sinal1234
versionNúmero de versão8.3.0
tagDeclaração XML<a href="dictionaries.html">
entityEntidade XML&amp;
blankSímbolos de espaço(qualquer espaço em branco ou pontuação não reconhecida de outra forma)

Nota

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)