Недавно я использую Haystack и whoosh для поиска по ключевым словам в моем проекте django. Но я использую SearchQuerySet для фильтрации с помощью «__contains» и возвращает результат ошибки. Существует модель и индекс.Django Haystack __contains поиск по полю не работает
class Team(models.Model):
name = models.CharField(max_length=NAME_MAX_LENGTH, default='')
leader = models.CharField(max_length=NAME_MAX_LENGTH, default='')
slogan = models.CharField(max_length=SHORT_TEXT_LENGTH, default='')
about = models.CharField(max_length=LONGTEXT_MAX_LENGTH, default='')
b_type = models.IntegerField(default=0)
...
class TeamIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
team_name = indexes.CharField(model_attr='name')
team_logo = indexes.CharField(model_attr='logo_path')
team_about = indexes.CharField(model_attr='about')
team_type = indexes.CharField(model_attr='b_type')
def get_model(self):
return Team
def index_queryset(self, using=None):
return self.get_model().objects.all()
Как пар, я хочу найти какой-то результат, который содержит ключ words.such как использование «студент», чтобы соответствовать «Студент хорошо.».
condition = reduce(operator.and_, (Q(content__contains=x) for x in keys))
res = SearchQuerySet().filter(condition).models(model)
Но он также возвращает null.So Я смотрю индексы, которые Свист return.It могут возвращать хороший результат.
Но когда я использую стог для фильтрации результата, вернуть результат ошибки.
(1) "__ содержит" выглядит как "__exact"
>>> SearchQuerySet().filter(text='rw\n').count()
3
>>> SearchQuerySet().filter(content='rw\n').count()
3
>>> SearchQuerySet().all().filter(content__contains='w').count()
0
>>> SearchQuerySet().all().filter(text__contains='w').count()
0
(2) "__ точный" Возвращаемый результат ошибки
>>> SearchQuerySet().filter(text__contains='y\n1231').count()
3
Но у меня есть только один индекс, который совпадает «Y \ n1231 ».
Исключительно, я пытаюсь несколько способов, но не удается.
- использование "NgramField" или "EdgeNgramField" вместо "CharField"
- использование "SearchQuerySet(). Исключить (содержание =" XXX "). Фильтр (content__contains = 'W'). Count() "
Ps:
Python: 3.5.2
Django: 1.10.5
django-haystack: 2.6.0
whoosh: 2.7.4
jieba: 0.38