Los analizadores de búsqueda de texto se encargan de dividir el texto crudo del documento en tokens e identificar el tipo de cada token, donde el conjunto de tipos posibles es definido por el propio analizador. Ten en cuenta que el analizador no modifica el texto en absoluto — simplemente identifica los límites de palabras plausibles. Debido a este alcance limitado, hay menos necesidad de analizadores personalizados específicos de la aplicación de la que hay para diccionarios personalizados. Actualmente, PostgreSQL proporciona solo un analizador integrado, el cual ha demostrado ser útil para una amplia gama de aplicaciones.
El analizador integrado se llama pg_catalog.default.
Reconoce 23 tipos de tokens, que se muestran en la Table 12.1.
Table 12.1. Tipos de tokens del analizador predeterminado
| Alias | Descripción | Ejemplo |
|---|---|---|
asciiword | Palabra, todas letras ASCII | elephant |
word | Palabra, todas letras | mañana |
numword | Palabra, letras y dígitos | beta1 |
asciihword | Palabra con guión, todas ASCII | up-to-date |
hword | Palabra con guión, todas letras | lógico-matemática |
numhword | Palabra con guión, letras y dígitos | postgresql-beta1 |
hword_asciipart | Parte de palabra con guión, todas ASCII | postgresql en el contexto postgresql-beta1 |
hword_part | Parte de palabra con guión, todas letras | lógico o matemática
en el contexto lógico-matemática |
hword_numpart | Parte de palabra con guión, letras y dígitos | beta1 en el contexto
postgresql-beta1 |
email | Dirección de correo electrónico | [email protected] |
protocol | Cabecera de protocolo | http:// |
url | URL | example.com/stuff/index.html |
host | Host | example.com |
url_path | Ruta de URL | /stuff/index.html, en el contexto de una URL |
file | Nombre de archivo o ruta | /usr/local/foo.txt, si no está dentro de una URL |
sfloat | Notación científica | -1.234e56 |
float | Notación decimal | -1.234 |
int | Entero con signo | -1234 |
uint | Entero sin signo | 1234 |
version | Número de versión | 8.3.0 |
tag | Etiqueta XML | <a href="dictionaries.html"> |
entity | Entidad XML | & |
blank | Símbolos de espacio | (cualquier espacio en blanco o puntuación no reconocida de otra manera) |
La noción del analizador de una “letra” está determinada por la configuración de
localización de la base de datos, específicamente por lc_ctype. Las palabras que contienen
únicamente las letras ASCII básicas se reportan como un tipo de token separado, ya que
a veces es útil distinguirlas. En la mayoría de las lenguas europeas, los tipos de
token word and asciiword deben tratarse de la misma manera.
email no admite todos los caracteres de correo electrónico válidos según lo
definido por la RFC 5322.
Específicamente, los únicos caracteres no alfanuméricos admitidos para los
nombres de usuario de correo electrónico son el punto, el guión y el guión bajo.
tag no admite todos los nombres de etiqueta válidos según lo definido por la
Recomendación W3C, XML.
Específicamente, los únicos nombres de etiqueta admitidos son los que comienzan con una
letra ASCII, un guión bajo o dos puntos, y contienen solo letras, dígitos,
guiones, guiones bajos, puntos y dos puntos. tag también
incluye comentarios XML que comienzan con <!-- y terminan
con -->, y declaraciones XML (pero ten en cuenta que esto
incluye cualquier cosa que comience con <?x y termine con
>).
Es posible que el analizador produzca tokens solapados a partir de un mismo fragmento de texto. Como ejemplo, una palabra con guión se reportará tanto como la palabra completa como cada uno de sus componentes:
SELECT alias, description, token FROM ts_debug('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
Este comportamiento es deseable ya que permite que las búsquedas funcionen tanto para toda la palabra compuesta como para los componentes. Aquí tienes otro ejemplo ilustrativo:
SELECT alias, description, token FROM ts_debug('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