Автозаполнение Django Haystack для двух (несколько) полей

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

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

Мы построили наш пост-индекс следующим образом для автозаполнения поля body:

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

Внимательно прочитав документацию по стогу сена, я не могу найти, возможно ли автозаполнение как для полей заголовка, так и для основного текста.

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


person geros    schedule 04.09.2012    source источник


Ответы (2)


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

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

sqs = sqs1 | sqs2

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

person Facundo Olano    schedule 15.04.2013

Вот более простой способ: выполните конкатенацию в шаблоне и используйте 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')

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

person user    schedule 07.10.2014