使用Elasticsearch搜索带有数字和下划线的术语

时间:2014-07-11 19:47:01

标签: django elasticsearch django-haystack

我正在使用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
[]

我做错了什么?

1 个答案:

答案 0 :(得分:-1)

我从未使用过django-haystack,但你不应该使用autocomplete代替filter

我看到它here

我想你应该这样做:

a = SearchQuerySet().models(Files).all()
# is '.all()' right?
b = a.automplete(name='pa_team1')

如果有效,请告诉我。

希望有所帮助。

相关问题