Django Haystack-Xapian搜索在特殊字符和空格下失败

4 投票
2 回答
998 浏览
提问于 2025-04-17 21:44

我正在做一个现有的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

撰写回答