Django的搜索功能

2 投票
4 回答
2798 浏览
提问于 2025-04-15 11:57

我正在用Django开发一个网页应用,接下来需要添加搜索功能。搜索功能会应用在两个模型上,一个是扩展了用户认证类的模型,另一个模型有三个字段:name(名字)、tags(标签)和description(描述)。所以在搜索文本方面,我觉得这并不算太复杂。

在开发过程中,我使用的是SQLite,因为还没有做任何特定于数据库的工作,所以在生产环境中我可以选择任何数据库。我在考虑选择PostgreSQL或者MySQL

我在网上看了很多关于搜索解决方案的帖子,但我还是想听听大家对我这个简单情况的看法。以下是我的问题:

  1. 在我的情况下,使用全文搜索会不会太复杂了?

  2. 依赖数据库的全文搜索支持是不是更好?如果是的话,我应该用哪个数据库?

  3. 我应该使用外部搜索库,比如WhooshSphinx或者Xapian吗?如果是的话,应该选哪个?

补充说明:tags是一个标签字段(来自django-tagging应用),它是一个多对多关系。description是一个可以存储HTML的字段,最大长度为1024字节。

4 个回答

0

你是否需要外部库,主要看你的需求。你要处理的流量有多大呢?一般来说,外部库在性能上表现得更好,但就像任何事情一样,它们也有优缺点。我现在在用Sphinx配合django-sphinx插件,如果你需要进行大量搜索的话,我会推荐这个组合。

1

Django在它的QuerySet过滤器中支持全文搜索。现在,如果你只有两个模型需要搜索,只需创建一个视图来搜索这两个模型的字段:

search_string = "+Django -jazz Python"
first_models = FirstModel.objects.filter(headline__search=search_string)
second_models = SecondModel.objects.filter(headline__search=search_string)

如果需要,你还可以进一步过滤结果,以确保结果是唯一的。

另外,还有一个正则表达式过滤器,这可能更适合处理你的html字段和标签,因为正则表达式可以告诉过滤器如何处理任何分隔符或标记。

5

如果你提到的这个字段 tags 是我想的那样,也就是说你打算把多个标签合成一个字符串存储,那么你可能需要对它进行全文搜索……但这样设计不好;更好的做法是让物品和标签之间有多对多的关系(可以在另一个表中,比如叫 ItemTag,里面有两个外键,分别是物品表和标签表的主键)。

我不太清楚你是否需要对 description 进行全文搜索,因为我不知道它具体是什么内容——也不确定你是需要 MySQL 5.1 和 PostgreSQL 8.3 提供的基本的全文搜索,还是需要像 sphinx 这样的更强大的搜索功能……也许你可以多说说你的应用背景,以及为什么考虑使用全文搜索?

编辑:看起来唯一可能需要进行全文搜索的地方可能就是 description,而且它的内容似乎有限,使用 MySQL 5.1 或 PostgreSQL 8.3 都能满足需求。就我个人而言,我比较喜欢 PostgreSQL(虽然我对 MySQL 也很熟悉),但这只是我的个人偏好,并不是特别和全文搜索有关。这篇博客 提供了一个选择 PostgreSQL 的理由:你可以进行全文搜索,同时还能保持事务性,而在 MySQL 中,全文索引只能在 MyISAM 表上工作,不能在 InnoDB 上工作 [[当然,如果你加上 sphinx,那就另当别论了]](另外可以看看 这篇后续文章,了解更多关于 PostgreSQL 和 Lucene 的全文搜索内容)。不过,选择数据库时还有其他因素需要考虑,我觉得用这两种数据库都不会太糟糕(除非为了实现全文搜索和事务性而不得不加 sphinx 是个大问题)。

撰写回答