Php web应用程序中多字段的搜索策略
正在开发一个web应用程序;要求是提供一个搜索字段,该字段搜索主表中的重要字段以及连接表中PK/FK相关的其他字段 模式是这样的Php web应用程序中多字段的搜索策略,php,mysql,Php,Mysql,正在开发一个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
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中,用于指定给项目的任何标记
随着时间的推移,数据集将在projects表中增加10000-50000行,在其他表中增加000行
我将建立一个测试平台并运行不同方法的测试,但我想知道是否有人曾经处理过类似的情况,并提供过任何建议
我正在考虑并将测试的可能方法有:
单一查询
我认为可以编写一个SQL查询来进行搜索,但是如果数据增长到最大,如果不进行仔细的优化,这样的查询可能会执行得很差。问题是我在项目启动后不会参与其中,所以不会有完整的、真实的数据进行实验
多重查询
因为站点和数据库的加载量很小,所以一些小的查询可能至少会同样快速和简单。将发出几个SQL查询,然后在PHP中为每个搜索合并结果集
冗余搜索表
我曾考虑在编辑项目时将一行作为手工索引写入另一个表中——这将从标记、国家、机构等的相关字段中获取文本值,将它们连接成字符串,并将其粘贴到带有projectID的搜索表中;每个项目在项目表中都有一行,基本上表示我们可以搜索的关键数据的非规范化视图
我已经研究过如何使用MySQL视图,但是我担心在这些视图上缺乏索引;至少可以仔细地为冗余搜索表编制索引
手边的技术——在RHEL5上运行的PHP5.1.6和MySQL 5.0.22
欢迎有任何想法、建议或战争故事
谢谢你的时间
伊恩我肯定会为此研究MySQL的全文功能。我已经考虑过不同的搜索方法,而该解决方案主要是您所需要的
基本上,在该答案中描述的全文示例中,您可以简单地使用SELECT创建临时表,SELECT将声明您希望从中搜索的所有表的所有字段(+其索引列),并声明这些字段上的全文索引。然后只需查询临时表…我建议您可以使用图书馆的特定搜索产品,而不是自己构建此搜索功能。 例如,你可以使用。使用这样的产品,通常很容易让它对数据源(在本例中为数据库)进行索引。 在SOLR的情况下,你可以 例如,使用SOLR将为您提供许多额外的高级功能,您可以在web应用程序中轻松使用这些功能。例如,分面搜索、拼写建议、查找同义词、查找类似单词(用于拼写错误)的功能,不仅仅是精确匹配,还有更多: 还有可用于PHP的SOLR客户端代码: 除了SOLR,还有许多其他搜索产品可以实现这种搜索功能,包括免费和商业搜索
自己构建这种功能并非不可能,但使用成熟的产品,您可以获得经过测试的产品和许多功能,这些功能可以改善用户体验,但构建起来非常困难。嗨,Yanick,谢谢。每次填充临时表的好处是什么?每次运行查询时,都需要执行所有我试图避免的昂贵连接?如果我想使用MyISAM的全文功能,为什么不维护一个单独的MyISAM表呢?谢谢Ian@Flubba,JOIN语句没有那么昂贵,至少比从多个表获取的语句便宜。。。在任何情况下,都可以使用AFTER INSERT/UPDATE/DELETE触发器维护单独的MyISAM表,或者使用第三方搜索并在延迟一段时间后运行索引器。在任何情况下,维护单独的支持全文的表都不应该由您的项目本身来完成,因此,如果您需要更改技术,您就不会与搜索的完成方式紧密耦合。。。