Django Haystack __contains字段查找不起作用

时间:2017-02-12 00:32:06

标签: python django django-haystack whoosh

最近我在我的django项目中使用Haystack和whoosh进行关键字搜索。但是我使用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)

但它也返回null。所以我查找了那些嗖的回归的索引。它可以返回一个好的结果。

enter image description here

但是当我使用haystack过滤结果时,它会返回错误结果。

(1)“__ contains”看起来像“__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)“__ exact”返回错误结果

>>> SearchQuerySet().filter(text__contains='y\n1231').count()
3

但我只有一个与“y \ n1231”匹配的索引。

除了我尝试某些方法但失败了。

  1. 使用“NgramField”或“EdgeNgramField”代替“CharField”
  2. 使用 “SearchQuerySet()。排除(含量=” XXX “)。过滤器(content__contains = 'W')。计数()”
  3. PS:

    Python: 3.5.2
    Django: 1.10.5
    django-haystack: 2.6.0
    whoosh: 2.7.4
    jieba: 0.38
    

1 个答案:

答案 0 :(得分:0)

在我看来,我终于解决了这个问题。我想分享我的错误,如果其他人再次遇到它。之前,我只使用一个章程作为关键词,所以嗖的一声从不在一个角色上创建索引。例如“a”,“b”,“c”。我使用whoosh 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']

我认为如果嗖的话就需要更多的角色。比如“杰克”,“关于”。