Vous n'êtes pas identifié(e).
Bonjour,
Je recherche un outil qui me permettrait de procéder à des requêtes FULLTEXT dans PotgreSQL de type:
("logiciel libre" OR "open source") AND NOT linux
Ce type de requête n'est pas compris directement par PostgreSQL (sauf erreur de ma part). Elle doit donc être traduite en syntaxe PostgreSQL (avec des &, des | ou des !).
Des pistes?
En vous remerciant,
Cordialement,
Robert Viseur.
Hors ligne
Votre demande manque de précision. Vous voulez exécuter ces recherches dans quoi ? parce qu'il est très simple de transformer ce que saisit l'utilisateur (AND/OR/NOT ou ET/OU/NON) en ce que peut comprendre PostgreSQL. C'est d'ailleurs ce que fait http://docs.postgresql.fr/ .
Guillaume.
Hors ligne
Votre demande manque de précision. Vous voulez exécuter ces recherches dans quoi ? parce qu'il est très simple de transformer ce que saisit l'utilisateur (AND/OR/NOT ou ET/OU/NON) en ce que peut comprendre PostgreSQL. C'est d'ailleurs ce que fait http://docs.postgresql.fr/ .
J' explique.
J'ai un premier problème. De mémoire, on ne peut pas faire de recherche par phrase ou par expression exacte (exemple: "nicolas sarkozy") en restant dans le mode fulltext de PostgreSQL. Il faut passer par un ILIKE. Compréhension erronée de ma part ou c'est bien comme ça? Donc, déjà, je recherche un système qui me permettrait de faire une requête incluant des OU, des ET, des NON et des recherches exactes sans devoir moi-même analyser la requête.
J'ai un second problème. Je viens d'aller revoir la documentation (par ailleurs très bien faite) et, si je comprends bien, il faut passer par les opérateurs &, | et !. Ce qui est moins confortable (les & et les | sont peu familiers pour la plupart des gens) pour un utilisateurs habitué à la syntaxe Google (OR, AND, -, +, etc).
D'où ma question, y a-t-il un moyen, dans PostgreSQL, de faire des recherche de type
("logiciel libre" OR "open source") AND NOT linux
sans devoir soi-même re-analyser la requête moi-même.
Il est possible que je sois passé à côté de quelque-chose d'évident mais je n'ai à ce stade rien vu dans la documentation. En gros, je voudrais donc pouvoir attaquer PostgreSQL avec le même genre de syntaxe que celle que je peux utiliser sur un mode FULLTEXT de MySQL (qui supporte +, -, "", etc).
Hors ligne
De mémoire, on ne peut pas faire de recherche par phrase ou par expression exacte (exemple: "nicolas sarkozy") en restant dans le mode fulltext de PostgreSQL. Il faut passer par un ILIKE. Compréhension erronée de ma part ou c'est bien comme ça?
Plus exactement, ce qu'on fait dans ce cas-là, c'est qu'on fait une recherche plein texte sur le mot A et le mot B et on ajoute une clause ILIKE. On profite ainsi des performances de la recherche plein texte et de la précision du ILIKE.
Donc, déjà, je recherche un système qui me permettrait de faire une requête incluant des OU, des ET, des NON et des recherches exactes sans devoir moi-même analyser la requête.
Ce n'est pas possible. Même en demandant à l'utilisateur de saisir leur recherche au format tsquery, vous ne pourrez pas avoir les recherches exactes.
J'ai un second problème. Je viens d'aller revoir la documentation (par ailleurs très bien faite) et, si je comprends bien, il faut passer par les opérateurs &, | et !. Ce qui est moins confortable (les & et les | sont peu familiers pour la plupart des gens) pour un utilisateurs habitué à la syntaxe Google (OR, AND, -, +, etc).
D'où ma question, y a-t-il un moyen, dans PostgreSQL, de faire des recherche de type
("logiciel libre" OR "open source") AND NOT linux
sans devoir soi-même re-analyser la requête moi-même.
Si j'ai bien compris, vous cherchez à savoir si les &/|/! sont configurables. Ils ne le sont pas.
Il est possible que je sois passé à côté de quelque-chose d'évident mais je n'ai à ce stade rien vu dans la documentation. En gros, je voudrais donc pouvoir attaquer PostgreSQL avec le même genre de syntaxe que celle que je peux utiliser sur un mode FULLTEXT de MySQL (qui supporte +, -, "", etc).
Vous ne pouvez pas. À moins évidemment de changer le code source de PostgreSQL... mais là, ça vous emmène bien loin.
De toute façon, vous ne pouvez pas fournir directement la saisie de l'utilisateur dans la requête (pour des simples raisons de risques d'injection SQL). Donc autant en profiter pour transformer les mots clés. C'est vraiment basique à faire.
À noter que pour la recherche exacte, à ma connaissance, des développements étaient en cours pour la supporter.
Guillaume.
Hors ligne
Merci pour vos réponses.
ecocentric a écrit :Il est possible que je sois passé à côté de quelque-chose d'évident mais je n'ai à ce stade rien vu dans la documentation. En gros, je voudrais donc pouvoir attaquer PostgreSQL avec le même genre de syntaxe que celle que je peux utiliser sur un mode FULLTEXT de MySQL (qui supporte +, -, "", etc).
Vous ne pouvez pas. À moins évidemment de changer le code source de PostgreSQL... mais là, ça vous emmène bien loin.
En fait, je pensais plutôt à des fonctions en langage de programmation (PHP, Java,...) placées entre le champs de saisie et PostgreSQL, et qui seraient capables de générer la "bonne" requête SQL. Je me dis que, n'étant probablement pas le premier à avoir cette demande, ça pourrait exister.
Hors ligne
Ce qui a été fait pour docs.postgresql.fr est disponible sur http://github.com/gleu/pgdocs_fr/blob/m … h.php#L158 (ligne 158). On sépare la recherche mot par mot. Si on trouve un mot clé and, or ou not, on le remplace par son équivalent tsquery. Sans mot clé, on ajoute automatique le &. Etc. C'est certainement moyennement codé, pas très propre. Mais au moins, c'est fonctionnel.
Il va d'ailleurs falloir que je replonge dans ce code pour y ajouter les dernières nouveautés de la 9.0 (prefix matching, accents, etc.).
Guillaume.
Hors ligne
Ce qui a été fait pour docs.postgresql.fr est disponible sur http://github.com/gleu/pgdocs_fr/blob/m … h.php#L158 (ligne 158). On sépare la recherche mot par mot. Si on trouve un mot clé and, or ou not, on le remplace par son équivalent tsquery. Sans mot clé, on ajoute automatique le &. Etc. C'est certainement moyennement codé, pas très propre. Mais au moins, c'est fonctionnel.
Il va d'ailleurs falloir que je replonge dans ce code pour y ajouter les dernières nouveautés de la 9.0 (prefix matching, accents, etc.).
Merci, je vais regarder ça.
Hors ligne