2017-02-12 64 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() 

作为休闲,我想搜索一些包含关键词的结果,如使用“学生”来匹配“学生是好的”。

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. 使用 “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

在我看来,我终于解决了疑难问题想分享我的错误,如果一些其他的一个迎接它again.Before,我只用一个包机关键字,所以whoosh从来没有c reate索引在一个字符上。如“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'] 

我认为如果whoosh想工作就需要更多的字符,比如“jack”,“about”。