Django的搜索功能
我正在用Django开发一个网页应用,接下来需要添加搜索功能。搜索功能会应用在两个模型上,一个是扩展了用户认证类的模型,另一个模型有三个字段:name
(名字)、tags
(标签)和description
(描述)。所以在搜索文本方面,我觉得这并不算太复杂。
在开发过程中,我使用的是SQLite,因为还没有做任何特定于数据库的工作,所以在生产环境中我可以选择任何数据库。我在考虑选择PostgreSQL或者MySQL。
我在网上看了很多关于搜索解决方案的帖子,但我还是想听听大家对我这个简单情况的看法。以下是我的问题:
在我的情况下,使用全文搜索会不会太复杂了?
依赖数据库的全文搜索支持是不是更好?如果是的话,我应该用哪个数据库?
补充说明:tags
是一个标签字段(来自django-tagging应用),它是一个多对多关系。description
是一个可以存储HTML的字段,最大长度为1024字节。
4 个回答
你是否需要外部库,主要看你的需求。你要处理的流量有多大呢?一般来说,外部库在性能上表现得更好,但就像任何事情一样,它们也有优缺点。我现在在用Sphinx配合django-sphinx插件,如果你需要进行大量搜索的话,我会推荐这个组合。
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字段和标签,因为正则表达式可以告诉过滤器如何处理任何分隔符或标记。
如果你提到的这个字段 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 是个大问题)。