我目前正在使用以下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查询来做这种行为吗?
答案 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_index
和update_index
):
products = SearchQuerySet().models(Product).filter(ngram_text=q)