2012-05-16 26 views
7

Quiero hacer una búsqueda de texto como google suggestions.sugerir como google con trigramas postgresql y búsqueda de texto completo

Estoy usando PostgreSQL debido a la mágica Postgis.

estaba pensando en usar FTS, pero vi que no podía buscar partial words, así que encontré this question, y vio como trigrams obras.

El problema principal es que el motor de búsqueda en el que estoy trabajando es para el idioma español. FTS funcionó muy bien con stemming y dictionaries (sinónimos, errores de ortografía), UTF y así sucesivamente. Trigrams funcionó muy bien para palabras parciales, pero solo funcionan para ASCII, y (obviamente) no usan cosas como diccionarios.

Estaba pensando si hay alguna manera de que se puedan usar las mejores cosas de ambos.

¿Es posible hacer que la búsqueda de texto completo y los trigramas trabajen juntos en PGSQL?

Respuesta

3

Puede hacer esto en Postgres, y no necesita Lucene.

Puede citar frases en tsquery o tsvector como las siguientes. Puede agregar un :* después de un plazo tsquery hacer una búsqueda de prefijo:

select 
'''new york city'''::tsvector @@ '''new yo'':*'::tsquery, --true 
'''new york times'''::tsvector @@ '''new yo'':*'::tsquery, --true 
'''new york'''::tsvector  @@ '''new yo'':*'::tsquery, --true 
'''new'''::tsvector    @@ '''new yo'':*'::tsquery, --false 
'new'::tsvector     @@ '''new yo'':*'::tsquery, --false 
'new york'::tsvector   @@ '''new yo'':*'::tsquery --false 

El problema principal es que to_tsvector() y [plain]to_tsquery() se tira de sus cotizaciones. Puedes escribir tus propias versiones que no lo hagan (no es tan difícil), o hacer un post-procesamiento después de ellas para construir tu término n-grams.

Las comillas simples adicionales anteriores son solo escapes. select $$ i heart 'new york city' $$::tsvector; es equivalente.

+0

¡guau! ¿puede por favor agregar una referencia a la documentación con respecto a esta triple cita? – jperelli

+1

la comilla triple es en realidad SQL normal, solo estoy escapando una comilla simple con otra. Los documentos lo mencionan aquí: http://www.postgresql.org/docs/9.3/static/textsearch-controls.html –

2

Recomendaría echar un vistazo a Lucene. Se puede integrar nativamente en Java, fácilmente en .NET o usando SOLR y servicios web en php.

Tiene grandes capacidades para búsquedas de texto libre, clasificación de términos de fábrica, soporte para diferentes idiomas usando diferentes Analysers (enlace para el español).

Por último, pero no menos importante, también es extremadamente rápido (para grandes volúmenes, digamos un índice de 4Gb ~ 5 000 000 filas en un DB, es mucho más rápido que una base de datos de Postgres).

+3

Iré con una solución similar, usando elasticsearch, pero no puedo aceptar, porque no responde la pregunta (en caso de que alguien llegue aquí buscando la respuesta). ¡Gracias! – jperelli

Cuestiones relacionadas