2012-09-04 18 views
6

Yo uso haystack 1.2.6 con Whoosh 2.4 y Django 1.3. Digamos que tenemos el siguiente modelo que describe una publicación hipotética.Django Haystack autocompletado en dos (múltiples) campos

Post(models.Model): 
    title = models.CharField() 
    body = models.TextField() 

Construimos nuestro índice post como este para autocompletar el campo del cuerpo:

PostIndex(SearchIndex): 
    text = CharField(document=True, use_template=True) 
    content_auto = indexes.EdgeNgramField(model_attr='body') 

Después de leer la documentación pajar fondo no puedo encontrar si es posible tener la terminación automática en ambos campos título y el cuerpo.

Entonces ... ¿es posible o ...?

Respuesta

7

Lo he logrado basándome en this. Usted acaba de hacer un EdgeNgramField para cada campo que desea Autocompletar en su índice, a continuación, aplicar la terminación automática a dos diferentes QuerySets de búsqueda y concatenar ellos:

sqs = SearchQuerySet().models(Post) 
sqs1 = sqs.filter(title_auto=q) 
sqs2 = sqs.filter(body_auto=q) 

sqs = sqs1 | sqs2 

Si usted tiene que hacer el filtrado adicional, es necesario hacerlo después del autocompletado (al menos esta fue la única forma en que funcionó).

3

Aquí está una manera más simple, hacer la concatenación en el uso de plantilla & EdgeNgramField (aunque haciendo eso en el cuerpo de un mensaje es caro:

#In search_indexes.py 
PostIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.EdgeNgramField(document=True, use_template=True) 

#In <app>\template\search\index\<app>\post_text.txt 
{{ object.title }} {{object.body}} 

Entonces todas estas consultas autocompletará tanto & cuerpo título

sqs = SearchQuerySet().models(Post).autocomplete(text='hello') 

EP Utilizar Haystack 2.x

Cuestiones relacionadas