搜索Django的功能

时间:2009-05-31 15:33:44

标签: python database django search full-text-search

我正在使用Django开发一个Web应用程序,我需要尽快添加搜索功能。搜索将针对两个模型实施,一个是auth用户类的扩展,另一个是字段nametagsdescription。所以我想在搜索文本的背景下没有什么可怕的。

对于开发我正在使用SQLite并且由于没有完成数据库特定的工作,我可以自由地在生产中使用任何数据库。我想在PostgreSQLMySQL之间进行选择。

我已经在互联网上发了几篇关于搜索解决方案的帖子,不过我想就我的简单案例得到意见。以下是我的问题:

  1. 在我的情况下全文搜索是否有过分杀?

  2. 依靠数据库的全文搜索支持更好吗?如果是这样,我应该使用哪个数据库?

  3. 我应该使用外部搜索库,例如WhooshSphinx还是Xapian?如果是这样,哪一个?

  4. 修改 tags是一个Tagfield(来自django-tagging应用程序),它位于m2m关系上。 description是一个包含HTML的字段,其max_length为1024字节。

4 个答案:

答案 0 :(得分:5)

如果该字段tags表示我认为它意味着什么,即您计划存储一个字符串,该字符串连接一个项目的多个标签,那么您可能需要对其进行全文搜索......但这很糟糕设计;相反,你应该在项目和标签表之间建立多对多的关系(在另一个表中,ItemTag或其他东西,其中2个外键是items表和标签表的主键)。

我无法判断您是否需要description上的全文搜索,因为我没有指示它是什么 - 也不知道您是否需要MySQL 5.1和PostgreSQL的合理但有些基本的全文搜索8.3提供,或者更强大的例如sphinx ...也许会谈谈你的应用程序的上下文以及为什么要考虑全文搜索?

编辑:所以似乎唯一可能需要全文搜索可能在description,看起来它可能有限,以至于MySQL 5.1或PostgreSQL 8.3都能很好地服务。我,我对PostgreSQL有一个好处(即使我也是MySQL的合理专家),但这是一个普遍的偏好,没有专门与全文搜索问题相关联。 This blog确实提供了一个更喜欢PostgreSQL的理由:你可以进行全文搜索并且仍然是事务性的,而在MySQL中全文索引仅适用于MyISAM表,而不是InnoDB [[除非你添加了sphinx,当然]](另请参阅this follow-on了解PostgreSQL和Lucene中的全文搜索)。当然,选择数据库时还有其他考虑因素,我认为你不会做任何一件事(除非必须为全文加上交易添加sphinx是一个大问题)。

答案 1 :(得分:1)

Django在其QuerySet过滤器中有full text searching支持。现在,如果您只有两个需要搜索的模型,只需创建一个搜索两个字段的视图:

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

如果需要,您可以进一步过滤它们以确保结果是唯一的。

此外,有一个regex filter可能更适合处理您的html字段和标记,因为正则表达式可以指示过滤器确切地处理任何分隔符或标记。

答案 2 :(得分:0)

是否需要外部库取决于您的需求。我们谈论了多少流量?外部库在性能方面通常更好,但一如既往有优点和缺点。我正在使用带有django-sphinx插件的Sphinx,如果您要进行大量搜索,我会推荐它。

答案 3 :(得分:0)

Haystack看起来很有希望。并且它在后端支持Whoosh