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

0 投票
1 回答
538 浏览
提问于 2025-04-18 11:04

我现在在我的网站上使用以下的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 个回答

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)

撰写回答