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.
La función ts_debug permite probar fácilmente una configuración de búsqueda de texto.
ts_debug([configregconfig, ]documenttext, OUTaliastext, OUTdescriptiontext, OUTtokentext, OUTdictionariesregdictionary[], OUTdictionaryregdictionary, OUTlexemestext[]) 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}
Las siguientes funciones permiten probar directamente un analizador de búsqueda de texto.
ts_parse(parser_nametext,documenttext, OUTtokidinteger, OUTtokentext) returnssetof recordts_parse(parser_oidoid,documenttext, OUTtokidinteger, OUTtokentext) returnssetof 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_nametext, OUTtokidinteger, OUTaliastext, OUTdescriptiontext) returnssetof recordts_token_type(parser_oidoid, OUTtokidinteger, OUTaliastext, OUTdescriptiontext) returnssetof 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
La función ts_lexize facilita la prueba de diccionarios.
ts_lexize(dictregdictionary,tokentext) returnstext[]
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
-----------
{}
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'