2011-04-18 30 views
5

Soy nuevo en PostgreSQL, y no estoy seguro de cómo hacer una inexactitud búsqueda de texto completo. No es que importe demasiado, pero estoy usando Django. En otras palabras, estoy buscando algo como lo siguiente:Búsqueda inexacta de texto completo en PostgreSQL y Django

q = 'hello world' 
queryset = Entry.objects.extra(
    where=['body_tsv @@ plainto_tsquery(%s)'], 
    params=[q]) 
for entry in queryset: 
    print entry.title 

donde la lista de entradas debería contener exactamente 'hola mundo', o algo similar. Los listados se deben ordenar de acuerdo a qué tan lejos está su valor de la cadena especificada. Por ejemplo, me gustaría que la consulta incluya entradas que contengan "Hello World", "hEllo world", "helloworld", "hell world", etc., con algún tipo de clasificación que indique qué tan lejos está cada elemento del perfecto, cadena de consulta sin cambios.

¿Cómo vas a hacer esto?

Respuesta

2

Su mejor opción es utilizar Django raw querysets, lo uso con MySQL para realizar la coincidencia de texto completo. Si todos los datos están en la base de datos y Postgres proporciona la capacidad de coincidencia, entonces tiene sentido usarlos. Además, Postgres ofrece algunas cosas realmente útiles en términos de derivación, etc. con consultas de texto completo.

Básicamente, le permite escribir la consulta real que desea, pero devuelve modelos (siempre que consulte una tabla de modelos, obviamente).

La ventaja de este le da es que se puede probar la consulta exacta que va a utilizar por primera vez en Postgres, the documentation cubre consultas de texto completo bastante bien.

El principal problema con los conjuntos de consulta crudos en este momento es que no admiten el recuento. Entonces, si va a devolver muchos datos y tiene limitaciones de memoria en su aplicación, es posible que necesite hacer algo inteligente.


Sin embargo, la coincidencia "Inexact" no es realmente parte de la capacidad de búsqueda de texto completo. En su lugar, desea el módulo contrib fuzzystrmatch postgres. Su uso es described here con índices.

1

Lo mejor sería utilizar un motor de búsqueda para este fin. Django-haystack admite la integración de tres motores de búsqueda diferentes.

Cuestiones relacionadas