2017-02-12 8 views
0

Недавно я использую 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 могут возвращать хороший результат.

enter image description here

Но когда я использую стог для фильтрации результата, вернуть результат ошибки.

(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(). Исключить (содержание =" 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 

ответ

0

на моем взгляде, я, наконец, решить problem.I хочет поделиться своей ошибкой, если какие-либо другие один навстречу again.Before, я использую только один устав для ключевого слова, так что никогда указатель на один символ. таких как «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'] 

Я думаю, что нужно больше символов, если кто-то хочет работать. Как «домкрат», «около».

Смежные вопросы