2010-12-27 34 views
14

¿Postresql es capaz de hacer una búsqueda de texto completo, basado en 'media' palabra? Por ejemplo, estoy intentando buscar "tree", pero le digo a postgres que busque "tr".Postgresql búsqueda de texto completo parte de las palabras

No encuentro una solución que sea capaz de hacer esto.

Actualmente estoy usando

select * from test, to_tsquery('tree') as q where vectors @@ q ; 

Pero me gustaría hacer algo como esto:

select * from test, to_tsquery('tr%') as q where vectors @@ q ; 

Respuesta

10

Parece que simplemente quieres emparejamiento de comodines.

  • Una opción, como se mencionó anteriormente es trigramas. Mi (muy) limitada experiencia con esto fue que era demasiado lento en mesas masivas para mi gusto (algunos casos eran más lentos que un LIKE). Como dije, mi experiencia con los trigramas es limitada, por lo que podría haber estado mal.

  • Una segunda opción se puede utilizar es el módulo wildspeed: http://www.sai.msu.su/~megera/wiki/wildspeed (usted tiene que construir & instalar este aunque).

La segunda opción funcionará para el sufijo/coincidencia intermedia también. Que puede o no ser más de lo que estás buscando.

Hay un par de advertencias (como el tamaño del índice), así que lea a fondo esa página.

+4

no ha sido la materia salvaje parte del núcleo de PostreSQL desde 2008 ...? – simon

+0

¿Alguna respuesta a la pregunta anterior? – Rodrigo

+0

wildspeed no se ha actualizado desde 2008, por lo tanto, a menos que ya forme parte del núcleo, usaría la extensión [pg_trgrm] (http://www.postgresql.org/docs/current/interactive/pgtrgm.html). – RichVel

18

Usted puede utilizar tsearch coincidencia de prefijo, ver http://www.postgresql.org/docs/9.0/interactive/textsearch-controls.html#TEXTSEARCH-PARSING-QUERIES

postgres=# select to_tsvector('tree') @@ to_tsquery('tr:*'); 
?column? 
---------- 
t 
(1 row) 

Sólo funcionará para la búsqueda de prefijo sin embargo, no si quieres coincidencia parcial en cualquier posición en la palabra.

+1

Esa es la dirección que estoy buscando. Pero me interesan las palabras que son iguales a 'tr: *' (en tu ejemplo). ¿Es posible recuperar solo esas palabras? – Grezly

+0

Bueno, para construir sobre lo que escribiste, algo como SELECT * FROM prueba DONDE los vectores @@ to_tsquery ('tr: *') deberían hacerlo. ¿O quiere decir que quiere saber qué palabras individuales dentro del campo de tsvector coinciden? No creo que puedas hacer eso ... –

+0

necesito los campos/palabras que coinciden con mi entrada. – Grezly

2

SELECT * FROM prueba, to_tsquery ('árbol') como q donde los vectores @@ q O xxxx LIKE ('% árbol%')

': *' es especificar emparejamiento de prefijo.

Cuestiones relacionadas