Django Haystack - 使用SearchQuerySet()按字段的子字符串过滤

时间:2013-12-18 13:09:29

标签: django django-haystack

我有一个使用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类型:

  • 包含
  • 确切
  • gt,gte,lt,lte
  • startswith
  • 范围

我尝试使用 __ 包含 ,但其行为与 __完全完全相同,它查找一个句子中的确切单词(整个单词),而不是单词的子串。

我很困惑,因为这样的功能是非常基本的,我不确定我是否遗漏了某些东西,或者还有其他方法可以解决这个问题(使用Regex或其他什么东西?)。

由于

2 个答案:

答案 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'))