2013-01-23 15 views
6

Ich versuche, Ergebnisse für eine Suche nur einen Teil eines Wortes (das heißt autocomplete nach dem Heuhaufen Doks, wenn ich mich nicht irre).Django-Heuhaufen: rebuild_index failed (hoystack.exceptions.SearchFieldError) nach dem Hinzufügen `content_auto` Zeile benötigt für die automatische Vervollständigung

Beispiel:

Suche "gol"

Ergebnis "goldfish"

Was habe ich versucht?

ich in step 1 of the docs wie gefragt habe, habe ich die folgende Zeile Klasse in meinem Index:

content_auto = indexes.EdgeNgramField(model_attr='content') 

Dann python manage.py rebuild_index tat.

den Index jedoch Wiederaufbau erzeugt einen Fehlerhaystack.exceptions.SearchFieldError: The model '<Person: Reginald>' does not have a model_attr 'content'. Mit Reginald der erste Eintrag in meinem indizierten Tabelle und mehr Person das Modell sind ich indiziert.

In der Tat hat mein Modell kein Feld namens content, aber wie es in der Dokumentation gezeigt wird, sollte es nicht so ein Feld haben müssen.

Ich verwende Whoosh 2.4.1, Django-haystack 1.2.7 und Django 1.4.

+0

Ich weiß, dass dies eine alte Frage, aber haben Sie jemals herausgefunden? –

+0

Nein. Ich habe nicht lange an dem Problem gearbeitet. – Bentley4

Antwort

3

Das ist also, wie ich dieses Recht jetzt bin zu lösen.

Statt:

content_auto = indexes.EdgeNgramField(model_attr='content')

Verwendung:

content_auto = indexes.EdgeNgramField(use_template=True)

Dann können Sie eine Vorlage für diese erstellen. Zum Beispiel habe ich eine ItemIndex in meiner catalog App, wo ich name und description suchen möchte. So habe ich eine Datei in templates/search/indexes/catalog/ genannt item_content_auto.txt, die in den folgenden hat:

{{ object.name }} 
{{ object.description }} 

Dies scheint zu funktionieren, wie ich will es. Ein bisschen mühsamer als wenn 'content' funktioniert, aber es sollte ausreichen.

0
+0

Ja, aber sehen Sie dies: http://django-haystack.readthedocs.org/en/v2.1.0/autocomplete.html Sie sagen, Sie müssen nur "Inhalt" verwenden, aber das funktioniert nicht. Sie müssen es geändert haben und die Dokumente nicht aktualisiert haben. –

1

Hier ist ein aktualisiertes Beispiel als Referenz (siehe here):

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

    def get_model(self): 
     return Book 

#template 
{{object.name}} 

#query 
SearchQuerySet().autocomplete(text=my_query)