Django Haystack-Xapian搜索在特殊字符和空格下失败
我正在做一个现有的Django项目,这个项目使用haystack和xapian作为后端来实现全局搜索功能。不过,当我用一些特殊字符,比如&和空格等进行搜索时,搜索似乎失败了。我尝试过,但找不到解决办法。
有没有办法让我处理这些字符,使搜索能够正常工作?我在后端使用的是PostgreSQL。任何建议都会很有帮助。
更新:搜索功能使用了一个SearchForm,查询字符串是通过表单中的q字段传入的。代码中是这样使用的。
sqs = self.searchqueryset.auto_query(self.cleaned_data['q'])
我尝试过使用:
sqs = self.searchqueryset.filter(self.cleaned_data['q'])
和
sqs = self.searchqueryset.filter(content=Clean(self.cleaned_data['q']))
但都没有成功。我仍然无法用空格和特殊字符,比如&,进行搜索。
2 个回答
1
免责声明:我是Xapian-Haystack的新维护者。
我认为你所提到的问题和Xapian-Haystack如何将字符串解析成可以搜索的词条有关:因为它使用的是Xapian的默认生成器,这个生成器会忽略特殊字符,所以你无法搜索这些特殊字符,因为它们根本没有被索引。
举个例子,字符串"^ best-seller"
会被索引为:"best"
和"seller"
。所以如果你搜索"^"
或者精确搜索"^ best-seller"
,都会失败。
这个问题现在已经解决了:现在所有特殊字符都应该可以支持了。
在Xapian-Haystack(或者说Haystack)中,空格是不会被索引的,因为它是用来分隔单词的。
虽然我现在不建议在生产环境中使用主版本,但也许这能解答你的疑问。
1
转义的方式取决于你使用Haystack的方式,不过,haystack.inputs.Clean
这个类可能正是你需要的。你只需要把你要搜索的内容传进去就可以了:
q = "amp & sand"
q_clean = haystack.inputs.Clean(q)
sqs = SearchQuerySet().filter(content=q_clean)
你可以在这里查看文档: http://django-haystack.readthedocs.org/en/latest/inputtypes.html#clean