使用Django Haystack仅匹配查询中的一些单词

时间:2014-06-25 17:20:31

标签: python django elasticsearch django-haystack

我目前正在使用以下django-haystack代码在我的网站上进行搜索:

def products_search_results(request):
    q = request.GET['q']
    from haystack.query import SearchQuerySet
    products = SearchQuerySet().models(Product).filter(text=q)

这使用q作为搜索中的查询参数。这也是使用q中的所有单词来匹配结果。这可能是(?)预期的默认行为。这就是我所看到的。

我有Product,标题为“红色克尔维特”。

当然搜索词“红色”,“红色克尔维特”和“克尔维特”都匹配,但“红色克尔维特敞篷车”或“红色克尔维特T型顶”这个词并不匹配。我真的希望那些匹配查询,特别是如果默认查询的结果不多。

我可以用我的haystack查询来做这种行为吗?

1 个答案:

答案 0 :(得分:1)

例如,在搜索索引文件中使用EdgeNgramField

class AppIndex(indexes.SearchIndex, indexes.Indexable):

    ngram_text = indexes.EdgeNgramField()

    def prepare(self, obj):
        """Add the content of text field from final prepared data into ngram_text field
        """
        prepared_data = super(AppIndex, self).prepare(obj)
        prepared_data['ngram_text'] = prepared_data['text']
        return prepared_data

然后查询该字段(确保在执行上述更改后首先执行rebuild_indexupdate_index):

products = SearchQuerySet().models(Product).filter(ngram_text=q)