2012-09-04 18 views
6

Ich benutze Heuhaufen 1.2.6 mit Whoosh 2.4 und Django 1.3. Nehmen wir an, wir haben das folgende Modell, das einen hypothetischen Beitrag beschreibt.Django Haystack Autovervollständigung auf zwei (mehrere) Felder

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

Wir bauten unseren Postindex, wie dies für die automatische Vervollständigung auf dem Körperfeld:

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

gründlich Heuhaufen Dokumentation zu lesen hat, wenn ich nicht finden kann, ist möglich, die automatische Vervollständigung auf beiden Titel und Körper Felder zu haben.

Also ... ist es möglich oder ...?

Antwort

7

Ich habe es geschafft, basierend auf this zu tun. Sie machen nur ein EdgeNgramField für jedes Feld, das Sie in Ihrem Index automatisch zu vervollständigen auf möchten, dann die automatische Vervollständigung auf zwei verschiedene Such querysets anwenden und verketten:

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

sqs = sqs1 | sqs2 

Wenn Sie zusätzliche Filterung zu tun haben, müssen Sie es tun nach der Autovervollständigung (zumindest das war die einzige Art, wie es für mich funktionierte).

3

Hier ist ein einfacher Weg, tun die Verkettung in der Vorlage & Verwendung EdgeNgramField (obwohl das von einem Beitrag auf dem Körper zu tun ist teuer:

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

Dann werden alle solche Abfragen auf beiden Titel & Körper automatisch vervollständigt wird

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

PS Verwenden von Haystack 2.x

Verwandte Themen