我有一个使用SOLR进行索引的Django项目。
我正在尝试使用Haystack的 SearchQuerySet 类进行 子串搜索 。
例如,当用户搜索术语 “ear” 时,它应返回包含值为 的字段的条目“搜索” 即可。 如您所见, “ear” 是 “搜索” 的SUBSTRING。 (显然:))
换句话说,在一个完美的Django世界中,我想要像:
SearchQuerySet().all().filter(some_field__contains_substring='ear')
在 SearchQuerySet (https://django-haystack.readthedocs.org/en/latest/searchqueryset_api.html#field-lookups)的haystack文档中, 它表示只支持以下FIELD LOOKUP类型:
我尝试使用 __ 包含 ,但其行为与 __完全完全相同,它查找一个句子中的确切单词(整个单词),而不是单词的子串。
我很困惑,因为这样的功能是非常基本的,我不确定我是否遗漏了某些东西,或者还有其他方法可以解决这个问题(使用Regex或其他什么东西?)。
由于
答案 0 :(得分:5)
可以使用EdgeNgramField字段完成:
some_field = indexes.EdgeNgramField() # also prepare value for this field or use model_attr
然后进行部分匹配:
SearchQuerySet().all().filter(some_field='ear')
答案 1 :(得分:0)
这是大海捞针中的一个错误。
正如你所说,__exact
的实现与__contains
完全相同,因此在haystack中并不存在此功能。
此修复程序正在等待合并:https://github.com/django-haystack/django-haystack/issues/1041
您可以像这样缩短固定版本的等待时间:
from haystack.inputs import BaseInput, Clean
class CustomContain(BaseInput):
"""
An input type for making wildcard matches.
"""
input_type_name = 'custom_contain'
def prepare(self, query_obj):
query_string = super(CustomContain, self).prepare(query_obj)
query_string = query_obj.clean(query_string)
exact_bits = [Clean(bit).prepare(query_obj) for bit in query_string.split(' ') if bit]
query_string = u' '.join(exact_bits)
return u'*{}*'.format(query_string)
# Usage:
SearchQuerySet().filter(content=CustomContain('searchcontentgoeshere'))