使用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 个回答
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_index
和 update_index
):
products = SearchQuerySet().models(Product).filter(ngram_text=q)