Je cherche un moyen d'émuler quelque chose comme J'ai créé un attribut TSVector sans en utilisant un dictionnaire. Maintenant, une requête comme ... p> ... retournerait tous les titres comme "Physique", "PHP", etc. Mais comment puis-je créer une requête qui retourne Tous les enregistrements où le titre commencent par 'Zend Fram' (qui devrait revenir par exemple 'Zend Framework')? P> Bien sûr, je pourrais utiliser quelque chose comme: P> Select * à partir de la table où attrtitez "% texte%" code> à l'aide d'un TSVector dans PostgreSQL.
SELECT title
FROM table
WHERE title_tsv @@ to_tsquery('zend fram:*');
4 Réponses :
SELECT title FROM table WHERE title_tsv @@ to_tsquery('zend & fram:*')
Il y a un moyen de le faire à Postgres en utilisant trigrams et gin / Index gist. Il y a un exemple simple, mais avec des bords rugueux, dans cet article de Kristo Kaiv: Recherche de sous-chaîne . P>
Pas une jolie solution, mais il devrait faire le travail: Il peut être utilisé comme: p> Comment cela fonctionne : p>
Cast (Plainto_tsQuery ('Zend Fram') en tant que texte) Code> Li>
: * code> à chaque terme de recherche:
regexp_replace (..., e '(\' \\ w + \ ')', e '\\\ 1: * ',' g ') code> li>
TO_TSQUERY (...) CODE> LI>
Sélectionnez le titre à partir de la table où titre_tsv (titre) @@ ... Code> Li>
ol> p>
Moche, mais j'aime ça! La recherche de préfixe de l'homme pauvre. La honte Trigram Gin Index ne peut être appliquée à une colonne TSVector directement
Sinon, vous pouvez simplement faire correspondre la requête entière avec à_tsquerie (Concat (CAST (Plainto_tsQuery ('Zend Fram') comme texte), ': *')) code>. Ce n'est pas aussi moche.
postgres 9.6 strong> introduit les capacités de recherche de phrase pour la recherche de texte complète. Donc, cela fonctionne maintenant: Il trouve 'Foo Zend Framew Bar' em> ou ou ou 'Zend Cadres' em>, mais non fort> 'foo zend n'a pas de barref-cadre' em>. P> citant le Notes de version pour Postgres 9.6: P> Une requête de recherche par phrase peut être spécifiée dans l'entrée TSQUERY en utilisant le nouveau
opérateurs Pour Meilleur Performance Prise en charge de la requête avec un index GIN: P> code> étant l'opérateur suivi de l'opérateur.
p>
code> et
n code> em>
code> . Le premier signifie que les lexemes avant et
Après qu'il doit apparaître adjacent à cet ordre dans cet ordre. Le dernier
signifie qu'ils doivent être exactement
n code> strong> em> lexemes à part. p>
blockQquote>
...
WHERE to_tsvector('english', title) @@ to_tsquery('english', 'zend <-> fram:*');
Dans Certains cas Vous voudrez peut-être garder le TSVector champ (au lieu d'aller pour un index d'expression.)
@Dharmaturtle: Ajout très utile!
Est-ce que la phrase recherche la réponse à votre ancienne question?