2017-01-28 12 views
1

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

Например я хочу, чтобы выполнить поиск полного текста на поле ингредиентов, но хочу модели для поиска только те, соответствующих категории, указанных.

Я просмотрел документы и не смог найти какие-либо параметры запроса, которые необходимо будет установить, ни я не нашел каких-либо изменений, которые я должен сделать, чтобы индекс.

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

class ArticleIndex(indexes.SearchIndex,indexes.Indexable): 
    text = indexes.CharField(document=True,model_attr='ingredients') 
    title = indexes.CharField(model_attr='title') 
    category = indexes.CharField(model_attr='category') 
    image_link = indexes.CharField(model_attr='image_link') 
    publication_date = indexes.DateTimeField(model_attr='publication_date') 

    def get_model(self): 
     return Article 
+0

вы можете предоставить вид, который обрабатывает поисковые запросы? Я не могу понять, почему вы не можете просто сузить 'SearchQuerySet' вниз, как это:' sqs.filter (category__exact = self.cleaned_data [ 'user_provided_category]) ' – trixn

ответ

0

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

Это может выглядеть следующим образом:

from django import forms 
from haystack.forms import SearchForm 
from haystack.generic_views import SearchView 


class MySearchForm(SearchForm): 
    category = forms.CharField(required=False) 

    def search(): 
     sqs = super(MySearchForm, self).search() 

     category = self.cleaned_data.get('category') 

     if category: 
      sqs = sqs.filter(category__exact=category) 

     return sqs 


class MySearchView(SearchView): 
    form_class = MySearchForm 

Это просто минимальный пример и я не проверял код, но он должен выглядеть примерно так. Вы также можете использовать Select или MultipleSelect в пользовательской форме, чтобы пользователь мог выбирать только предопределенные категории.