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".

Исключительно, я пробую несколько способов, но не получается.

  1. используйте "NgramField" или "EdgeNgramField" вместо "CharField"
  2. используйте "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']

Я думаю, что нужно больше символов, если кто-то хочет работать. Например, "Джек", "о".

Другие вопросы по тегам