搜索网络应用中多个字段的策略

时间:2010-09-02 13:49:53

标签: php mysql

开发中的网络应用;要求是提供一个搜索字段,用于搜索主表中的重要字段以及来自连接表的PK / FK相关的其他字段

Schema就是这样的

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视图了一点,但我对这些缺乏索引感到紧张;至少可以仔细索引冗余搜索表

掌握的技术 - 在RHEL5上运行的PHP 5.1.6和MySQL 5.0.2

欢迎任何想法,建议或战争故事

感谢您的时间

伊恩

2 个答案:

答案 0 :(得分:0)

我肯定会考虑MySQL的FULLTEXT功能。关于不同的搜索方法,我已经answered a question了,而且解决方案主要是您需要的。

基本上,在该答案中描述的FULLTEXT示例中,您可以使用SELECT创建临时表,该SELECT将声明您要搜索的所有表的所有字段(+其索引列)并声明您的FULLTEXT索引在那些领域。然后只需查询该临时表...

答案 1 :(得分:0)

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

例如,使用SOLR可以为您提供许多额外的高级功能,您可以在网络应用中轻松使用。例如分面搜索,拼写建议,查找同义词,查找类似单词的功能(用于拼写错误)不仅仅是完全匹配等等:features of SOLR

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

除了SOLR之外,还有许多其他搜索产品可以实现这种免费和商业搜索功能。

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