Le comportement d'une configuration personnalisée de recherche plein texte peut facilement devenir confus. Les fonctions décrites dans cette section sont utiles pour tester les objets de recherche plein texte. Vous pouvez tester une configuration complète ou tester séparément analyseurs et dictionnaires.
La fonction ts_debug
permet un test facile d'une
configuration de recherche plein texte.
ts_debug([config
regconfig
, ]document
text
, OUTalias
text
, OUTdescription
text
, OUTtoken
text
, OUTdictionaries
regdictionary[]
, OUTdictionary
regdictionary
, OUTlexemes
text[]
) returns setof record
ts_debug
affiche des informations sur chaque jeton d'un
document
tel qu'il est produit
par l'analyseur et traité par les dictionnaires configurés. Elle utilise la
configuration indiquée par config
,
ou default_text_search_config
si cet argument est omis.
ts_debug
renvoie une ligne pour chaque jeton identifié
dans le texte par l'analyseur. Les colonnes renvoyées sont :
alias
text
-- nom court
du type de jeton
description
text
--
description du type de jeton
token
text
-- texte du jeton
dictionaries
regdictionary[]
--
les dictionnaires sélectionnés par la configuration pour ce type de jeton
dictionary
regdictionary
--
le dictionnaire qui a reconnu le jeton, ou NULL
dans
le cas contraire
lexemes
text[]
-- le ou les
lexèmes produits par le dictionnaire qui a reconnu le jeton, ou
NULL
dans le cas contraire ; un tableau vide
({}
) signifie qu'il a été reconnu comme un terme
courant
Voici un exemple simple :
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}
Pour une démonstration plus importante, nous créons tout d'abord une
configuration public.english
et un dictionnaire
ispell pour l'anglais :
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}
Dans cet exemple, le mot Brightest
a été reconnu par
l'analyseur comme un mot ASCII
(alias
asciiword
). Pour ce type de jeton, la liste de dictionnaire
est english_ispell
et english_stem
. Le
mot a été reconnu par english_ispell
, qui l'a réduit avec
le mot bright
. Le mot supernovaes
est
inconnu dans le dictionnaire english_ispell
donc il
est passé au dictionnaire suivant et, heureusement, est reconnu (en fait,
english_stem
est un dictionnaire Snowball qui reconnaît
tout ; c'est pourquoi il est placé en dernier dans la liste des
dictionnaires).
Le mot The
est reconnu par le dictionnaire
english_ispell
comme étant un terme courant (Section 12.6.1) et n'est donc pas indexé. Les espaces
sont aussi ignorées, car la configuration ne fournit aucun dictionnaire
pour eux.
Vous pouvez réduire le volume en sortie en spécifiant explicitement les colonnes que vous voulez voir :
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}
Les fonctions suivantes permettent un test direct d'un analyseur de recherche plein texte.
ts_parse(parser_name
text
,document
text
, OUTtokid
integer
, OUTtoken
text
) returnssetof record
ts_parse(parser_oid
oid
,document
text
, OUTtokid
integer
, OUTtoken
text
) returnssetof record
ts_parse
analyse le document
indiqué et renvoie une série d'enregistrements, un pour chaque jeton produit
par l'analyse. Chaque enregistrement inclut un tokid
montrant le type de jeton affecté et un jeton (token
) qui
est le texte dudit jeton. Par exemple :
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
, OUTtokid
integer
, OUTalias
text
, OUTdescription
text
) returnssetof record
ts_token_type(parser_oid
oid
, OUTtokid
integer
, OUTalias
text
, OUTdescription
text
) returnssetof record
ts_token_type
renvoie une table qui décrit chaque type
de jeton que l'analyseur indiqué peut reconnaître. Pour chaque type de jeton,
la table donne l'entier tokid
que l'analyseur utilise pour
labeliser un jeton de ce type, l'alias
qui nomme le type
de jeton dans les commandes de configuration et une courte
description
. Par exemple :
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 fonction ts_lexize
facilite le test des
dictionnaires.
ts_lexize(dict
regdictionary
,token
text
) returnstext[]
ts_lexize
renvoie un tableau de lexèmes si le jeton
(token
) en entrée est connu du dictionnaire ou
un tableau vide si le jeton est connu du dictionnaire en tant que terme
courant, ou enfin NULL
si le mot n'est pas connu.
Exemples :
SELECT ts_lexize('english_stem', 'stars'); ts_lexize ----------- {star} SELECT ts_lexize('english_stem', 'a'); ts_lexize ----------- {}
La fonction ts_lexize
attend un seul jeton, pas du
texte. Voici un cas où cela peut devenir source de confusion :
SELECT ts_lexize('thesaurus_astro', 'supernovae stars') is null; ?column? ---------- t
Le dictionnaire thésaurus thesaurus_astro
connaît la
phrase supernovae stars
, mais
ts_lexize
échoue, car il ne peut pas analyser le texte
en entrée, mais le traite bien en tant
que simple jeton. Utilisez plainto_tsquery
ou
to_tsvector
pour tester les dictionnaires thésaurus.
Par exemple :
SELECT plainto_tsquery('supernovae stars'); plainto_tsquery ----------------- 'sn'