2009-09-28 5 views
12

Disons que vous avez un postgres 8.3 tableau comme suit:Comment faire une recherche textuelle textuelle dans Postgres qui tire parti de l'index de recherche en texte intégral?

CREATE TABLE t1 (body text, body_vector tsvector);

Je veux être en mesure d'y rechercher des phrases en utilisant l'index en texte intégral (GIST, GIN, ou les deux sur la colonne tsvector). La meilleure solution de contournement que j'ai pu trouver est de faire d'abord la recherche en texte intégral sur les deux mots (booléen ET) et de faire une comparaison similaire sur le corps pour la phrase. Bien sûr, cela ne parvient pas à capturer toute vérification de la racine ou de l'orthographe que la recherche en texte intégral de postgres fait pour vous. Un exemple de ceci est si je suis à la recherche de l'expression « w1 w2 », j'utiliser:

SELECT * FROM t1 WHERE body_vector @@ 'w1 & w2'::tsquery AND body LIKE 'w1 w2';

Est-il possible de le faire où vous n'avez pas à recourir à la recherche sur la colonne de texte?

Répondre

11

Si vous voulez une correspondance exacte des expressions, c'est la façon de le faire. Vous pouvez également essayer WHERE body_vector @@ plainto_tsquery ('w1 w2'), puis l'ordonner par classement. (Le point étant que les coups où les mots sont juste à côté de l'autre devrait se retrouver sur le dessus)

4

Mise à jour: recherche de texte PostgreSQL 9.6 supporte des phrases

select 
    * 
from (values 
    ('i heart new york'), 
    ('i hate york new') 
) docs(body) 
where 
    to_tsvector(body) @@ phraseto_tsquery('new york') 

(1 row retrieved) 

ou par la distance entre les mots:

-- a distance of exactly 2 "hops" between "quick" and "fox" 
select 
    * 
from (values 
    ('the quick brown fox'), 
    ('quick brown cute fox') 
) docs(body) 
where 
    to_tsvector(body) @@ to_tsquery('quick <2> fox') 

(1 row retrieved) 
+1

Peut-être que je n'ai pas attrapé quelque chose, mais cela ne nécessite-t-il pas la chaîne d'entrée pour contenir la phrase recherchée entre guillemets simples? Comment pourrait-on l'utiliser en général, quand la phrase vient d'une entrée d'utilisateur, et le document provient d'une colonne de base de données? –

+1

Ce n'est toujours pas "recherche de phrase". Cela ne fonctionne que depuis votre phrase tsvector 'New York' est enveloppé dans des guillemets simples. – soyayix

+0

Oui les deux fonctions le font - mais votre chaîne tsvector dans la plupart des cas n'aura pas de guillemets simples - si c'est le cas alors quelle est la phrase de recherche pour .. J'ai un postgreSQL 9.4 et la requête que vous avez fonctionne - ce n'est pas seulement spécifique à 9.6. choisir 'je coeur new york city' :: tsvector @@ 'nouveau' :: tsquery, --true 'je coeur new york city' :: tsvector @@ 'new & york' :: tsquery, - true 'je coeur new york city' :: tsvector @@ '' 'new york' '' :: tsquery --false – soyayix

Questions connexes