2009-09-28 27 views
12

Digamos que usted tiene un Postgres 8.3 tabla como sigue:¿Cómo se hace la búsqueda de texto completo basada en frases en postgres que aprovecha el índice de texto completo?

CREATE TABLE t1 (body text, body_vector tsvector);

Quiero ser capaz de buscar por frases utilizando el índice de texto completo (GIST, ginebra o ambos en la columna de la tsvector). La mejor solución que he podido encontrar es primero hacer la búsqueda de texto completo en ambas palabras (AND booleano) y luego hacer una comparación similar en el cuerpo de la frase. Por supuesto, esto no captura ninguna derivación o revisión ortográfica que la búsqueda de texto completo de postgres haga por usted. Un ejemplo de esto es si estoy en busca de la frase 'W1 W2', que haría uso:

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

¿Hay una manera de hacer esto en el que no tiene que recurrir a buscar en la columna de texto?

Respuesta

11

Si desea una coincidencia de frase exacta, esa es la manera de hacerlo. También puede probar WHERE body_vector @@ plainto_tsquery ('w1 w2'), y luego ordenarlo por ranking. (El punto es que los golpes donde las palabras están uno al lado del otro deben terminar en la parte superior)

4

Actualización: PostgreSQL búsqueda de texto 9.6 soporta frases

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

(1 row retrieved) 

o por la distancia entre las palabras:

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

Tal vez no haya detectado algo, ¿pero esto no requiere que la cadena de entrada contenga la frase buscada entre comillas simples? ¿Cómo podría alguien usarlo en general, cuando la frase proviene de la entrada auser, y el documento proviene de una columna de la base de datos? –

+1

Esto todavía no es "búsqueda de frase". Eso solo funciona, ya que su frase de tsvector 'nueva york' está envuelta entre comillas simples. – soyayix

+0

Sí, ambas funciones sí lo hacen, pero su cadena de tsvector en la mayoría de los casos no tendrá comillas simples. Si lo hace, ¿cuál es la frase de búsqueda para ... Tengo un postgreSQL 9.4 y la consulta que tiene funciona? Esto no es solo específico para 9.6. seleccione 'i heart new york city' :: tsvector @@ 'nuevo' :: tsquery, - verdadero 'i heart new york city' :: tsvector @@ 'new & york' :: tsquery, - true 'i heart new york city' :: tsvector @@ '' 'new york' '' :: tsquery --false – soyayix

Cuestiones relacionadas