Haystack __包含没有找到通过GET传递的子串[ElasticSearch backeng]

时间:2013-06-10 17:35:23

标签: django elasticsearch django-haystack

我有以下型号:

class ProductIndex(CelerySearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    number = indexes.CharField()
    description = indexes.CharField(model_attr='description')

在我的网页中,我对一个函数执行AJAX调用,该函数应该向我返回其描述中包含某些单词的产品。例如,如果我的产品的描述为“Apple Macbook Pro”,并且用户输入“book”,我想返回该结果。

我执行以下操作:

q = request.GET['q']
results = SearchQuerySet().models(Product).filter(description__contains=q)

但是,就像我说的那样,我确实有一个产品的描述:

Macbook和用户输入book,它将无效。但是,Macbook可以使用。

最后,如果我打印q,则返回u'book'

1 个答案:

答案 0 :(得分:5)

您可以使用indexes.EdgeNgramField代替indexes.CharField。自动填充文档(http://django-haystack.readthedocs.org/en/v2.0.0/autocomplete.html)中会建议这样做。

您不需要更改查询代码。

编辑:

要使其不区分大小写,您可以执行类似此操作

class ProductIndex(CelerySearchIndex, indexes.Indexable):
    ... fields here ...
    def prepare_description(self, object):
        return object.description.lower()

以及在lower()

上查询时使用q