2017-02-12 5 views
0

최근에 내 django 프로젝트에서 키워드 검색을 위해 Haystack 및 whoosh를 사용합니다. 그러나 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도 반환됩니다. 따라서 whoosh가 반환하는 색인을 조회합니다. 좋은 결과를 반환 할 수 있습니다.

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. 사용하는 대신 "CharField"의 "NgramField"또는 "EdgeNgramField"
  2. 사용 는 "SearchQuerySet는(). 제외 (함량 ="XXX "). 필터 (content__contains 용 = 'w'). 수() "

시 :

제 생각에는
Python: 3.5.2 
Django: 1.10.5 
django-haystack: 2.6.0 
whoosh: 2.7.4 
jieba: 0.38 

답변

0

, 내가 마지막으로, 문제 야 몇 가지 다른 하나는 again.Before을 충족하는 경우 내 오류를 공유하고자 해결 난 단지 키워드에 대해 하나 개의 헌장을 사용, 그래서 누가 결코 c 한 문자에 대한 색인을 재정립하십시오. "a", "b", "c"와 같이. API를 사용하여 코드를 디버깅합니다.

>>> 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'] 

whoosh가 "jack", "about"과 같이 작업하려는 경우 더 많은 문자가 필요하다고 생각합니다.