Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php web应用程序中多字段的搜索策略_Php_Mysql - Fatal编程技术网

Php web应用程序中多字段的搜索策略

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

正在开发一个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中,用于指定给项目的任何标记

随着时间的推移,数据集将在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表,或者使用第三方搜索并在延迟一段时间后运行索引器。在任何情况下,维护单独的支持全文的表都不应该由您的项目本身来完成,因此,如果您需要更改技术,您就不会与搜索的完成方式紧密耦合。。。