10
votes

Faites correspondre une phrase se terminant dans un préfixe avec la recherche de texte complète

Je cherche un moyen d'émuler quelque chose comme Select * à partir de la table où attrtitez "% texte%" code> à l'aide d'un TSVector dans PostgreSQL.

J'ai créé un attribut TSVector sans en utilisant un dictionnaire. Maintenant, une requête comme ... p> xxx pré>

... 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 title
FROM table
WHERE title_tsv @@ to_tsquery('zend fram:*');


1 commentaires

Est-ce que la phrase recherche la réponse à votre ancienne question?


4 Réponses :


7
votes
SELECT title
FROM table
WHERE title_tsv @@ to_tsquery('zend & fram:*')

0 commentaires

3
votes

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 .


0 commentaires

6
votes

Pas une jolie solution, mais il devrait faire le travail: xxx

Il peut être utilisé comme: xxx

Comment cela fonctionne :

  1. jette la plaine Tsquery à une chaîne: Cast (Plainto_tsQuery ('Zend Fram') en tant que texte)
  2. utilise regex pour ajouter le match de préfixe : * à chaque terme de recherche: regexp_replace (..., e '(\' \\ w + \ ')', e '\\\ 1: * ',' g ')
  3. le convertit à une tsquérance non plaine. TO_TSQUERY (...)
  4. et l'utilise dans l'expression de recherche Sélectionnez le titre à partir de la table où titre_tsv (titre) @@ ...

2 commentaires

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), ': *')) . Ce n'est pas aussi moche.



6
votes

postgres 9.6 strong> introduit les capacités de recherche de phrase pour la recherche de texte complète. Donc, cela fonctionne maintenant: xxx pré>

code> étant l'opérateur suivi de l'opérateur. p>

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 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>

Pour Meilleur Performance Prise en charge de la requête avec un index GIN: P>

...
WHERE to_tsvector('english', title) @@ to_tsquery('english', 'zend <-> fram:*');


2 commentaires

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!