2013-01-23 18 views
6

Próbuję wprowadzić wyniki plonowania dla przeszukiwania tylko części słowa (która nazywa się autocomplete zgodnie z Haystack docs, jeśli się nie mylę).Django-haystack: rebuild_index kończy się niepowodzeniem (haystack.exceptions.SearchFieldError) po dodaniu linii `content_auto` potrzebnej do autouzupełniania

Przykład:

Szukaj "gol"

Wynik "goldfish"

Czego próbowałem?

zrobiłem jak zapytał step 1 of the docs I dodaje następujący wiersz w mojej klasie Index:

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

Potem zrobił python manage.py rebuild_index.

Przebudowa indeksu jednak produkowane błądhaystack.exceptions.SearchFieldError: The model '<Person: Reginald>' does not have a model_attr 'content'. Z Reginald jest pierwszy wpis w moim indeksowanej tabeli i Person bycia wzorem I indeksowane.

Teraz rzeczywiście mój model nie ma pola o nazwie content, ale jak jest pokazane w dokumentach, nie powinno być potrzebne takie pole.

Używam Whoosh 2.4.1, Django-haystack 1.2.7 i Django 1.4.

+0

wiem, jest to stara sprawa, ale czy kiedykolwiek tego dowiedzieć? –

+0

Nie. Nie pracowałem nad problemem przez długi czas. – Bentley4

Odpowiedz

3

Tak to jest jak mam rozwiązać to teraz.

Zamiast:

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

Zastosowanie:

content_auto = indexes.EdgeNgramField(use_template=True)

Następnie można utworzyć szablon dla nich. Na przykład mam aplikację ItemIndex w mojej aplikacji catalog, w której chcę wyszukać name i description. Tak, zrobiłem plik w templates/search/indexes/catalog/ nazwie item_content_auto.txt, który posiada w niej następujące:

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

to wydaje się być działa jak chcę go. Trochę bardziej nużący niż gdyby pracował 'content', ale powinien wystarczyć.

0
+0

Tak, ale zobacz: http://django-haystack.readthedocs.org/en/v2.1.0/autocomplete.html Mówią, że wystarczy użyć "content", ale to nie działa. Musieli to zmienić i nie zaktualizować dokumentów. –

1

Oto zaktualizowana przykład dla odniesienia (patrz 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)