我想了解干草堆搜索的工作原理。
我有一个带有字段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查询/搜索字符串中遗漏了与数字和/或特殊字符相关的内容。谢谢你的帮助。
答案 0 :(得分:0)
原因实际上是双重的:首先是正斜杠(“/”)是Whoosh中的保留字符,所以它被忽略了。其次是Whoosh也忽略了单字符搜索术语。
所以你的查询,
'ABC/2013/11/1'
如果从斜线上剥离,
'ABC 2013 11 1'
然后是单个字符,
'ABC 2013 11'
看起来就像是在搜索
'ABC/2013/11' -> 'ABC 2013 11'
有趣的是,文档似乎对这种奇怪的行为保持沉默。