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()
作为休闲,我想搜索一些包含关键词的结果,如使用“学生”来匹配“学生是好的”。
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哪一个指数”。
除此之外,我尝试了一些方法,但失败了。
- 使用 “NgramField” 或 “EdgeNgramField” 而不是 “CharField”
- 使用 “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