Haystack + Whoosh中搜索字符串中的数字和特殊字符

时间:2013-11-22 11:20:18

标签: django-haystack whoosh

我想了解干草堆搜索的工作原理。

我有一个带有字段Order.no的模型订单,其中订单号以'ABC / 2013/11/1','ABC / 2013/11/2'的形式存储......

我想使用Haystack和Whoosh后端在这个领域实现自动完成(django-haystack 2.1.0,celery-haystack 0.7.2,Whoosh 2.5.5,Django 1.6)。我的search_index.py看起来像这样:

class OrderIndex(CelerySearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    name_auto = indexes.EdgeNgramField(model_attr='name')

    def get_model(self):
        return Order

当我尝试

SearchQuerySet().autocomplete(name_auto='ABC/2013')

我收到了ABC / 2013/11/1和ABC / 2013/11/2,这没关系

当我尝试

SearchQuerySet().autocomplete(name_auto='ABC/2013/11')

我仍然接受了ABC / 2013/11/1和ABC / 2013/11/2,这也没关系 但是当我尝试

SearchQuerySet().autocomplete(name_auto='ABC/2013/11/1')

我仍然接受ABC / 2013/11/1和ABC / 2013/11/2,我不明白为什么。

我还注意到,当我更改整个项目的数字格式为'1 / ABC / 2013/10'时...查询如

SearchQuerySet().autocomplete(name_auto='1/')

不会返回任何结果和查询,如

SearchQuerySet().autocomplete(name_auto='1/ABC')

返回'1 / ABC / 2013/10'和'2 / ABC / 2013/10'。

也许我在Haystack查询/搜索字符串中遗漏了与数字和/或特殊字符相关的内容。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

原因实际上是双重的:首先是正斜杠(“/”)是Whoosh中的保留字符,所以它被忽略了。其次是Whoosh也忽略了单字符搜索术语。

所以你的查询,

'ABC/2013/11/1'

如果从斜线上剥离,

'ABC 2013 11 1'

然后是单个字符,

'ABC 2013 11'

看起来就像是在搜索

'ABC/2013/11' -> 'ABC 2013 11'

有趣的是,文档似乎对这种奇怪的行为保持沉默。