我正在使用Django Haystack和Elasticsearch。我有一堆带有“name”字段的项目,格式如下:
PA_Team1_01_00001
我希望能够搜索
pa_team1
得到结果
pa_team1_01_00001
pa_team1_01_11111
pa_team1_11_00000
...
等等。
根据我的阅读,这应该可以通过EdgeNgramField轻松完成,但是当我搜索这个术语时,我没有得到任何结果。这就是我所拥有的:
class FilesIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.NgramField(document=True, use_template=True)
created = indexes.DateTimeField(model_attr='created')
name = indexes.EdgeNgramField(model_attr='name')
def get_model(self):
return Files
def index_queryset(self, using=None):
"""Used when the entire index for model is updated."""
return self.get_model().objects.all()
并且在shell中它仅在我输入确切名称时才有效,即使我将其指定为EdgeNgram。
>>> from haystack.query import SearchQuerySet
>>> from drives.models import Files
>>> a = SearchQuerySet().models(Files).all()
>>> b = a.filter(name='pa_team1')
>>> b
[]
>>> b = a.filter(name='pa_team1_01_00001.txt')
>>> b
[<Files: PA_Team1_01_00001.txt>]
>>> b = a.filter(name='pa')
>>> b
[]
我做错了什么?
答案 0 :(得分:-1)
我从未使用过django-haystack,但你不应该使用autocomplete
代替filter
我看到它here
我想你应该这样做:
a = SearchQuerySet().models(Files).all()
# is '.all()' right?
b = a.automplete(name='pa_team1')
如果有效,请告诉我。
希望有所帮助。