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!

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top