12.5. Analizadores (Parsers) #

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

AliasDescripciónEjemplo
asciiwordPalabra, todas letras ASCIIelephant
wordPalabra, todas letrasmañana
numwordPalabra, letras y dígitosbeta1
asciihwordPalabra con guión, todas ASCIIup-to-date
hwordPalabra con guión, todas letraslógico-matemática
numhwordPalabra con guión, letras y dígitospostgresql-beta1
hword_asciipartParte de palabra con guión, todas ASCIIpostgresql en el contexto postgresql-beta1
hword_partParte de palabra con guión, todas letraslógico o matemática en el contexto lógico-matemática
hword_numpartParte de palabra con guión, letras y dígitosbeta1 en el contexto postgresql-beta1
emailDirección de correo electrónico[email protected]
protocolCabecera de protocolohttp://
urlURLexample.com/stuff/index.html
hostHostexample.com
url_pathRuta de URL/stuff/index.html, en el contexto de una URL
fileNombre de archivo o ruta/usr/local/foo.txt, si no está dentro de una URL
sfloatNotación científica-1.234e56
floatNotación decimal-1.234
intEntero con signo-1234
uintEntero sin signo1234
versionNúmero de versión8.3.0
tagEtiqueta XML<a href="dictionaries.html">
entityEntidad XML&amp;
blankSímbolos de espacio(cualquier espacio en blanco o puntuación no reconocida de otra manera)

Note

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