PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 19/12/2018 10:36:01

fabrice_as
Membre

Caractères spéciaux dans les recherches full text

Bonjour,

Le moteur full text de PostgreSQL est vraiment super et relativement facile à implémenter avec les différents tutos que vous avez réalisé.

J'indexe le contenu de document et globalement cela se passe bien.
En revanche je rencontre des problèmes avec certaines termes comme C++ ou C# ou autre termes contenant des caractères spéciaux qui ne sont pas inclus dans les texte vectorisés.
Y-a-t-il un moyen d'intégrer ces mots dans les recherches ?

Merci d'avance

Fabrice

Hors ligne

#2 19/12/2018 11:31:51

gleu
Administrateur

Re : Caractères spéciaux dans les recherches full text

Avez-vous essayé de créer un dictionnaire des synonymes pour transformer C++ en cplusplus par exemple ? (jamais essayé, mais ce serait le premier test que je ferais)


Guillaume.

Hors ligne

#3 19/12/2018 11:51:22

fabrice_as
Membre

Re : Caractères spéciaux dans les recherches full text

Je n'ai pas essayé de dictionnaire de synonyme, il faut que je regarde comment ça marche

Hors ligne

#4 19/12/2018 13:02:50

fabrice_as
Membre

Re : Caractères spéciaux dans les recherches full text

Je viens d'essayer il semblerait que le parser agisse en premier en retirant les caractères spéciaux pour générer les tokens avant d'utiliser les dictionnaires

Hors ligne

#5 20/12/2018 14:05:00

dverite
Membre

Re : Caractères spéciaux dans les recherches full text

Effectivement il faudrait mettre un analyseur lexical alternatif, sans quoi dans  "C++" par exemple les + produisent le même lexème qu'un espace:

=# select ts_debug('C++');
                           ts_debug                           
--------------------------------------------------------------
(asciiword,"Word, all ASCII",C,{french_stem},french_stem,{})
(blank,"Space symbols",+,{},,)
(blank,"Space symbols",+,{},,)

Il est possible de faire une configuration texte avec son propre analyseur lexical, mais il faut l'écrire en C.
Un exemple ici: https://github.com/postgrespro/pg_tsparser

Hors ligne

#6 28/01/2019 17:37:01

fabrice_as
Membre

Re : Caractères spéciaux dans les recherches full text

Bonjour Merci pour vos reponses

Peut-on mixer plusieurs parser dans la meme BDD sur différents champs?

Il y a dans les contrib un test parser qui parse sur les espaces sans caractères alternatifs
exemple je veux indexer une liste de mots séparés par des espaces contenus dans un champ.

Peut-on sans problème utiliser par exemple une config fulltext pour un indexer champ et une autre différente pour indexer un autre champ?


Merci

Hors ligne

#7 28/01/2019 17:51:57

dverite
Membre

Re : Caractères spéciaux dans les recherches full text

De mémoire le parser est relié à une configuration de recherche (TEXT SEARCH CONFIGURATION): on peut en avoir plusieurs par base et donner cette configuration comme argument "regconfig" aux fonctions comme to_tsvector ou to_tsquery.

Hors ligne

#8 28/01/2019 18:06:58

fabrice_as
Membre

Re : Caractères spéciaux dans les recherches full text

Merci

C'est ce que j'avais vu mais je me demandais quels étaient les effets de bords possibles?

Hors ligne

#9 28/01/2019 18:09:31

dverite
Membre

Re : Caractères spéciaux dans les recherches full text

Tant que vous ne mettez pas votre configuration spécifique en tant que conf par défaut (via default_text_search_config) postgres ne va pas l'utiliser implicitement, donc pas d'effet de bord à craindre.

Hors ligne

#10 30/01/2019 09:53:16

fabrice_as
Membre

Re : Caractères spéciaux dans les recherches full text

OK j'ai testé

2 config FTS
- French standard
- Custom avec le testparser

2 champs text avec du contenu vers 2 champs ts_vector via 2 triggerupdate (1 config FTS differente pour chaque trigger) + 1 index GIN pour chaque champ ts_vector

Lorsque je fait fait des ts_query sur ces L'un ou l'autre des champs les index sont utilisés et les recherches sont rapides

Si je fait une recherche combinant les 2 champs ts_vector les recherches sont beaucoup plus longue et les index ne sont pas utilisés

J'ai fait un test avec avec un seul index GIN comprenant ts_vector1 et ts_vector2 la c'est super rapide pour les recherches combinées

Je n'ai jamais utilisé d'index composé sur des champs ts_vector, que pensez-vous de cette solution?
Pour info, les données textes ne changent pas  après enregistrement

Merci

Hors ligne

#11 30/01/2019 13:29:30

dverite
Membre

Re : Caractères spéciaux dans les recherches full text

On peut voir l'EXPLAIN ANALYZE de la requête lente et la requête de création de l'index composé ?

Hors ligne

Pied de page des forums