최근에 내 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가 반환하는 색인을 조회합니다. 좋은 결과를 반환 할 수 있습니다.
하지만 결과를 필터링 할 건초 더미를 사용할 때, 그것은 오류 결과를 반환합니다.
는(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 일치 하나의 인덱스를 가지고있는 것처럼 보이는 ".
예외적으로, 나는 몇 가지 방법을 시도하지만 실패합니다.
- 사용하는 대신 "CharField"의 "NgramField"또는 "EdgeNgramField"
- 사용 는 "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