Django Haystack __ содержит поиск поля не работает
Недавно я использую Haystack и whoosh для поиска по ключевым словам в моем проекте django. Но я использую SearchQuerySet для фильтрации по "__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()
Как пара, я хочу найти некоторый результат, который содержит ключевые слова. Например, используйте "студент", чтобы соответствовать "Студент хороший".
condition = reduce(operator.and_, (Q(content__contains=x) for x in keys))
res = SearchQuerySet().filter(condition).models(model)
Но он также возвращает ноль. Так что я смотрю индексы, которые возвращают. Это может вернуть хороший результат.
введите описание изображения здесь
Но когда я использую стог сена, чтобы отфильтровать результат, он возвращает результат ошибки.
(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 (). exclude (content =" XXX "). filter (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
1 ответ
По моему мнению, я наконец-то решил проблему. Я хочу поделиться своей ошибкой, если какая-то другая встретит ее снова. Прежде, я использую только одну хартию для ключевого слова, поэтому я никогда не создаю индекс для одного символа. такие как "a", "b", "c". Я использую API-интерфейс whoosh для отладки кода.
>>> from whoosh.index import open_dir
>>> ix = open_dir('whoosh_index')
>>> searcher = ix.searcher()
>>> list(searcher.lexicon("text"))
[b'1231', b'about', b'jack', b'rw', b'tom']
Я думаю, что нужно больше символов, если кто-то хочет работать. Например, "Джек", "о".