12.8. Pruebas y depuración de la búsqueda de texto #

12.8.1. Prueba de Configuración
12.8.2. Pruebas del analizador
12.8.3. Prueba de Diccionario

El comportamiento de una configuración de búsqueda de texto personalizada puede volverse confuso fácilmente. Las funciones descritas en esta sección son útiles para probar objetos de búsqueda de texto. Puedes probar una configuración completa, o probar los analizadores y diccionarios por separado.

12.8.1. Prueba de Configuración #

La función ts_debug permite probar fácilmente una configuración de búsqueda de texto.

ts_debug([ config regconfig, ] document text,
         OUT alias text,
         OUT description text,
         OUT token text,
         OUT dictionaries regdictionary[],
         OUT dictionary regdictionary,
         OUT lexemes text[])
         returns setof record

ts_debug muestra información sobre cada token del documento (document) tal como es producido por el analizador y procesado por los diccionarios configurados. Utiliza la configuración especificada por config, o default_text_search_config si se omite ese argumento.

ts_debug devuelve una fila para cada token identificado en el texto por el analizador. Las columnas devueltas son:

  • alias text — nombre corto del tipo de token

  • description text — descripción del tipo de token

  • token text — texto del token

  • dictionaries regdictionary[] — los diccionarios seleccionados por la configuración para este tipo de token

  • dictionary regdictionary — el diccionario que reconoció el token, o NULL si ninguno lo hizo

  • lexemes text[] — los lexemas producidos por el diccionario que reconoció el token, o NULL si ninguno lo hizo; un array vacío ({}) significa que fue reconocido como una palabra vacía

Aquí tienes un ejemplo sencillo:

SELECT * FROM ts_debug('english', 'a fat  cat sat on a mat - it ate a fat rats');
   alias   |   description   | token |  dictionaries  |  dictionary  | lexemes
-----------+-----------------+-------+----------------+--------------+---------
 asciiword | Word, all ASCII | a     | {english_stem} | english_stem | {}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | fat   | {english_stem} | english_stem | {fat}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | cat   | {english_stem} | english_stem | {cat}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | sat   | {english_stem} | english_stem | {sat}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | on    | {english_stem} | english_stem | {}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | a     | {english_stem} | english_stem | {}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | mat   | {english_stem} | english_stem | {mat}
 blank     | Space symbols   |       | {}             |              |
 blank     | Space symbols   | -     | {}             |              |
 asciiword | Word, all ASCII | it    | {english_stem} | english_stem | {}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | ate   | {english_stem} | english_stem | {ate}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | a     | {english_stem} | english_stem | {}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | fat   | {english_stem} | english_stem | {fat}
 blank     | Space symbols   |       | {}             |              |
 asciiword | Word, all ASCII | rats  | {english_stem} | english_stem | {rat}

Para una demostración más detallada, primero creamos una configuración public.english y un diccionario Ispell para el idioma inglés:

CREATE TEXT SEARCH CONFIGURATION public.english ( COPY = pg_catalog.english );

CREATE TEXT SEARCH DICTIONARY english_ispell (
    TEMPLATE = ispell,
    DictFile = english,
    AffFile = english,
    StopWords = english
);

ALTER TEXT SEARCH CONFIGURATION public.english
   ALTER MAPPING FOR asciiword WITH english_ispell, english_stem;
SELECT * FROM ts_debug('public.english', 'The Brightest supernovaes');
   alias   |   description   |    token    |         dictionaries          |   dictionary   |   lexemes
-----------+-----------------+-------------+-------------------------------+----------------+-------------
 asciiword | Word, all ASCII | The         | {english_ispell,english_stem} | english_ispell | {}
 blank     | Space symbols   |             | {}                            |                |
 asciiword | Word, all ASCII | Brightest   | {english_ispell,english_stem} | english_ispell | {bright}
 blank     | Space symbols   |             | {}                            |                |
 asciiword | Word, all ASCII | supernovaes | {english_ispell,english_stem} | english_stem   | {supernova}

En este ejemplo, la palabra Brightest fue reconocida por el analizador como una palabra ASCII (alias asciiword). Para este tipo de token, la lista de diccionarios es english_ispell y english_stem. La palabra fue reconocida por english_ispell, que la redujo al sustantivo bright. La palabra supernovaes es desconocida para el diccionario english_ispell, por lo que fue pasada al siguiente diccionario y, afortunadamente, fue reconocida (de hecho, english_stem es un diccionario Snowball que reconoce todo; por eso fue colocado al final de la lista de diccionarios).

La palabra The fue reconocida por el diccionario english_ispell como una palabra vacía (ver Section 12.6.1) y no será indexada. Los espacios también se descartan, ya que la configuración no proporciona ningún diccionario para ellos.

Puedes reducir el ancho de la salida especificando explícitamente qué columnas deseas ver:

SELECT alias, token, dictionary, lexemes
FROM ts_debug('public.english', 'The Brightest supernovaes');
   alias   |    token    |   dictionary   |   lexemes
-----------+-------------+----------------+-------------
 asciiword | The         | english_ispell | {}
 blank     |             |                |
 asciiword | Brightest   | english_ispell | {bright}
 blank     |             |                |
 asciiword | supernovaes | english_stem   | {supernova}

12.8.2. Pruebas del analizador #

Las siguientes funciones permiten probar directamente un analizador de búsqueda de texto.

ts_parse(parser_name text, document text,
         OUT tokid integer, OUT token text) returns setof record
ts_parse(parser_oid oid, document text,
         OUT tokid integer, OUT token text) returns setof record

ts_parse analiza el documento dado y devuelve una serie de registros, uno por cada token producido por el análisis. Cada registro incluye un tokid que muestra el tipo de token asignado y un token que es el texto del token. Por ejemplo:

SELECT * FROM ts_parse('default', '123 - a number');
 tokid | token
-------+--------
    22 | 123
    12 |
    12 | -
     1 | a
    12 |
     1 | number

ts_token_type(parser_name text, OUT tokid integer,
              OUT alias text, OUT description text) returns setof record
ts_token_type(parser_oid oid, OUT tokid integer,
              OUT alias text, OUT description text) returns setof record

ts_token_type devuelve una tabla que describe cada tipo de token que el analizador especificado puede reconocer. Para cada tipo de token, la tabla proporciona el entero tokid que el analizador utiliza para etiquetar un token de ese tipo, el alias (alias) que nombra el tipo de token en los comandos de configuración y una breve descripción (description). Por ejemplo:

SELECT * FROM ts_token_type('default');
 tokid |      alias      |               description
-------+-----------------+------------------------------------------
     1 | asciiword       | Word, all ASCII
     2 | word            | Word, all letters
     3 | numword         | Word, letters and digits
     4 | email           | Email address
     5 | url             | URL
     6 | host            | Host
     7 | sfloat          | Scientific notation
     8 | version         | Version number
     9 | hword_numpart   | Hyphenated word part, letters and digits
    10 | hword_part      | Hyphenated word part, all letters
    11 | hword_asciipart | Hyphenated word part, all ASCII
    12 | blank           | Space symbols
    13 | tag             | XML tag
    14 | protocol        | Protocol head
    15 | numhword        | Hyphenated word, letters and digits
    16 | asciihword      | Hyphenated word, all ASCII
    17 | hword           | Hyphenated word, all letters
    18 | url_path        | URL path
    19 | file            | File or path name
    20 | float           | Decimal notation
    21 | int             | Signed integer
    22 | uint            | Unsigned integer
    23 | entity          | XML entity

12.8.3. Prueba de Diccionario #

La función ts_lexize facilita la prueba de diccionarios.

ts_lexize(dict regdictionary, token text) returns text[]

ts_lexize devuelve un array de lexemas si el token de entrada es conocido por el diccionario, o un array vacío si el token es conocido por el diccionario pero es una palabra vacía, o NULL si es una palabra desconocida.

Ejemplos:

SELECT ts_lexize('english_stem', 'stars');
 ts_lexize
-----------
 {star}

SELECT ts_lexize('english_stem', 'a');
 ts_lexize
-----------
 {}

Note

La función ts_lexize espera un solo token, no texto. Aquí tienes un caso donde esto puede ser confuso:

SELECT ts_lexize('thesaurus_astro', 'supernovae stars') is null;
 ?column?
----------
 t

El diccionario de tesauro thesaurus_astro sí conoce la frase supernovae stars, pero ts_lexize falla ya que no analiza el texto de entrada, sino que lo trata como un solo token. Utiliza plainto_tsquery o to_tsvector para probar diccionarios de tesauro, por ejemplo:

SELECT plainto_tsquery('supernovae stars');
 plainto_tsquery
-----------------
 'sn'