2012-09-04 2 views
6

Я использую haystack 1.2.6 с Whoosh 2.4 и Django 1.3. Предположим, что у нас есть приведенная ниже модель, описывающая гипотетический пост.Автозаполнение Django Haystack на двух (нескольких) полях

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

Мы построили наш индекс, как это для автозавершения на поле тела:

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

Прочитав документацию Стог тщательно я не могу найти, если это возможно, чтобы иметь автодополнение на обоих заголовка и тела полей.

Так ... это возможно или ...?

ответ

7

Мне удалось это сделать на основе this. Вы просто сделать EdgeNgramField для каждого поля, которое автозаполнение на в индексе, а затем применить автозаполнение двух различных поисковых querysets и сцепить их:

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

sqs = sqs1 | sqs2 

Если вы должны сделать дополнительную фильтрацию, что вам нужно сделать это после автозавершения один (по крайней мере, это был единственный способ, которым это работало для меня).

3

Вот простой способ, сделать конкатенацию в использовании шаблона & EdgeNgramField (хотя делать это на теле поста стоит дорого:

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

Тогда все такие запросы будут автозаполнение как на названии & тела

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

PS Использование Haystack 2.x

Смежные вопросы