2010-09-02 83 views
0

在开发中有一个Web应用程序;要求是提供搜索由PK/FK连接表相关的主表中重要领域以及其他领域网络应用中多个字段的搜索策略

架构是这样的

PROJECTS 
projectID 
projectTitle 
projectTown 
projectCountryID (FK to countries table) 
agencyID (FK to agencies table) 

COUNTRIES 
countryID 
countryName 

AGENCIES 
agencyID 
agencyName 

TAGS_PROJECTS (many-many relationship between tags and projects) 
id 
projectID 
tagID 

TAGS 
tagID 
tagName 

,因此用户输入搜索词单一搜索领域并且我们想要查看它是否发生在projects.projectTitle,projects.projectTown,countries.countryName,agencies.agencyName或tags.tagName中,用于分配给项目的任何标记

数据集将随着时间的推移而增长项目表中的10,000-50,000行的顺序,以及其他表中的000的顺序

我打算建立一个测试平台并运行不同方法的测试,但我想知道是否有人曾经处理类似的情况,并有任何建议提供?

我正在考虑,将测试的方法分别是:

单个查询 我想这将有可能写一个SQL查询来进行搜索,但是这样的查询可能会不小心优化表现不佳一旦数据增长到全尺寸。问题是我不会在项目启动后参与,所以不会有完整的,真实的数据进行实验

多个查询 由于网站和数据库将轻微加载,一些小的查询可能会在代码最简单快捷。将发出几个SQL查询,然后将每个搜索的结果集合并到PHP中。

冗余搜索表 当我编辑项目时,我正在考虑将一行作为手工索引编写到另一个表中 - 这将从标记,国家,机构等相关字段的文本值中将它们连接成一个字符串并使用projectID将其粘贴到搜索表中;每个项目的项目表中都会有一行,基本上代表我们可以搜索的关键数据的非规范化视图。

我已经看了一下使用MySQL的一些看法,但是对这些缺乏索引感到紧张;至少冗余搜索表可以仔细索引

技术手 - PHP 5.1.6和MySQL 5.0.22在RHEL5

运行的任何想法,意见或战争的故事欢迎

感谢您的时间

伊恩

回答

0

我肯定会考虑的MySQL这样做的FULLTEXT功能。我已经answered a question关于不同的搜索方法,并且该解决方案大多是您所需要的。

基本上,在该答案中描述的FULLTEXT示例中,您可以简单地使用SELECT来创建临时表,该SELECT将声明所有希望从中搜索的表的所有字段(+他们的索引列)并声明您的FULLTEXT这些领域的索引。然后,简单地查询该临时表...

+0

嗨Yanick,谢谢你。每次填充临时表有什么好处,这将需要我执行所有昂贵的连接,我试图避免,每次运行查询时?如果我想使用MyISAM的FULLTEXT功能,为什么不维护一个单独的MyISAM表?谢谢,Ian – Polsonby 2010-09-03 07:59:32

+0

@Flubba,JOIN语句并不昂贵,至少比FROM多个表更便宜...无论如何,是的,您可以使用AFTER INSERT/UPDATE/DELETE触发器维护单独的MyISAM表,或者您可以使用第三方搜索并在延迟的时间段后运行索引器。在任何情况下,维护独立的启用FULLTEXT的表格都不应该由您的项目本身完成,因此,如果您需要更改技术,您将无法完成搜索。 – 2010-09-03 19:24:32

+0

有趣的想法,欢呼声。 .. – Polsonby 2010-09-06 08:47:45

0

我会建议,而不是自己构建此搜索功能,您可以使用库的特定搜索产品。 你可以使用SOLR。有了这样的产品,让它索引数据源通常相当容易,在这种情况下,它是一个数据库。 在SOLR的情况下你可以

例如使用SOLR会给你很多额外的和高级的功能,你可以很容易地在你的web应用程序中使用。例如分面搜索,拼写建议,寻找同义词,功能找到类似的话(错别字),不仅精确匹配,还有更多:features of SOLR

还有可用的SOLR客户端代码的PHP:http://code.google.com/p/solr-php-client/

除了SOLR有是许多其他搜索产品实现这种搜索功能,无论是自由和商业。

要自己构建这种功能并非不可能,但使用成熟的产品可以获得经过测试的产品以及许多改进用户体验非常困难的功能。