我正在使用Django开发一个Web应用程序,我需要尽快添加搜索功能。搜索将针对两个模型实施,一个是auth用户类的扩展,另一个是字段name
,tags
和description
。所以我想在搜索文本的背景下没有什么可怕的。
对于开发我正在使用SQLite并且由于没有完成数据库特定的工作,我可以自由地在生产中使用任何数据库。我想在PostgreSQL或MySQL之间进行选择。
我已经在互联网上发了几篇关于搜索解决方案的帖子,不过我想就我的简单案例得到意见。以下是我的问题:
答案 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)