Correspondances multiples de synonymes dans la recherche de texte intégral dans PostgreSQL
-
05-07-2019 - |
Question
J'essaie d'effectuer une recherche en texte intégral dans PostgreSQL 8.3. Cela a fonctionné à merveille. J'ai donc ajouté une correspondance de synonyme (par exemple, 'bob' == 'robert') à l'aide d'un dictionnaire de synonymes. Cela fonctionne très bien aussi. Mais j'ai remarqué que cela ne permettait apparemment à un mot que d'avoir un synonyme. Autrement dit, "al" ne peut être "albert" et "allen".
Est-ce correct? Est-il possible d’avoir plusieurs correspondances de dictionnaire dans un dictionnaire de synonymes PostgreSQL?
Pour référence, voici mon exemple de fichier de dictionnaire:
bob robert
bobby robert
al alan
al albert
al allen
Et le SQL qui crée la configuration de recherche en texte intégral:
CREATE TEXT SEARCH DICTIONARY nickname (TEMPLATE = synonym, SYNONYMS = nickname);
CREATE TEXT SEARCH CONFIGURATION dxp_name (COPY = simple);
ALTER TEXT SEARCH CONFIGURATION dxp_name ALTER MAPPING FOR asciiword WITH nickname, simple;
Qu'est-ce que je fais mal? Merci!
La solution
C'est une limitation du fonctionnement des synonymes. Ce que vous pouvez faire est de le transformer comme suit:
bob robert
bobby robert
alan al
albert al
allen al
Cela devrait donner le même résultat final, c’est-à-dire qu’une recherche de l’un ou l’autre de ceux-ci correspondra au même résultat.
Autres conseils
Un dictionnaire doit définir une relation fonctionnelle entre les mots et les lexèmes, sinon il ne saura pas quel mot renvoyer lorsque vous lexalisez. Dans votre exemple, al
correspond à trois valeurs différentes, définissant ainsi une fonction à valeurs multiples et la fonction lexize ne sachant pas quoi renvoyer. Comme le montre Magnus, vous pouvez indiquer les noms propres alan, albert, allen
au surnom al
.
Rappelez-vous cependant que l'intérêt d'un dictionnaire FTS n'est pas de réaliser des transformations en soi, mais de permettre une indexation efficace sur des mots sémantiquement pertinents. Cela signifie que le lexème n'a pas besoin de ressembler à l'entrée d'origine dans un sens linguistique quelconque. Bien que vous ayez raison de dire qu'il est impossible de définir une relation plusieurs à plusieurs, en avez-vous vraiment besoin? Par exemple, pour résoudre votre exemple vin
:
vin vin
vincent vin
vincenzo vin
vinnie vin
mais vous pouvez aussi faire ceci:
vin grob
vincent grob
vincenzo grob
vinnie grob
et obtenez le même effet (bien que la raison pour laquelle vous voudriez en être une autre histoire).
Ainsi, si vous analysiez un document avec, par exemple, 11 versions du nom Vincent, la fonction to_tsvector
renverrait vin: 11
dans le cas précédent et grob: 11
dans le dernier.
Dans la documentation de la version 8.4, il est question d’un dictionnaire de synonymes de remplacement. Ce sera peut-être utile?
http://www.postgresql.org/docs/8.4 /interactive/dict-xsyn.html