【发布时间】:2010-12-01 15:27:48
【问题描述】:
使用mysql和PHP
我已经在使用 MATCH AGAINST 子句了。
它对单个表运行良好。就像我想在商店表中搜索一样。没问题。
我想要的是能够在单个结果页面中搜索和显示来自不同表的结果。
例如,如果我输入“巧克力衣服”
我可能会得到如下 4 个结果:
Shop1 结果
ShopItem1 结果
ShopItem2 结果
Shop2 结果
当然,最相关的结果应该排在第一位。
我有很多问题。设计明智和实施明智
1) 我应该改变我的设计吗?我正在考虑有一个单独的表,称为搜索结果,它将包含来自 SHOPS 和 SHOPPRODUCTS 表的数据。但这意味着我有一些数据重复。
2) 我应该保留我目前的设计吗?如果是这样,那么我到底如何才能获得按 2 个不同表的相关性排序的搜索结果?
我看到 rottentomatoes 将他们的搜索结果组织在不同的组中。但是,我们更希望搜索结果不受不同类型的限制,尤其是当我们的分页将更加难以在 UI 方面进行导航时。
http://www.rottentomatoes.com/search/full_search.php?search=girl
或者这实际上是最好的出路?
我希望有人可以就这类事情给我指导,尤其是如果您有跨多个表格生成搜索结果的经验。
由于需求,我将表结构放在这里
CREATE TABLE `shopitems` (
`id` int(10) unsigned NOT NULL auto_increment,
`ShopID` int(10) unsigned NOT NULL,
`ImageID` int(10) unsigned NOT NULL,
`name` varchar(100) NOT NULL,
`description` varchar(255) NOT NULL,
`pricing` varchar(45) NOT NULL,
`datetime_created` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=31 DEFAULT CHARSET=utf8;
/*Table structure for table `shops` */
DROP TABLE IF EXISTS `shops`;
CREATE TABLE `shops` (
`id` int(11) NOT NULL auto_increment,
`title` varchar(100) default NULL,
`description` text,
`keywords` text,
`url` varchar(255) default '',
`owner_id` varchar(255) default NULL,
`datetime_created` datetime default NULL,
`created_by` varchar(255) default NULL,
`datetime_modified` datetime default NULL,
`modified_by` varchar(255) default NULL,
`overall_rating_avg` decimal(4,2) default '0.00',
PRIMARY KEY (`id`),
FULLTEXT KEY `url` (`url`),
FULLTEXT KEY `TitleDescFullText` (`keywords`,`title`,`description`,`url`)
) ENGINE=MyISAM AUTO_INCREMENT=3051 DEFAULT CHARSET=utf8;
我打算搜索 shopproducts 表的描述和名称列。
但正如您所见,它尚未实施。
虽然商店搜索已经启动并运行。
【问题讨论】:
-
添加表结构有助于得到一个好的答案
-
嗨,你是什么意思?你的意思是我应该有一个名为 search_results 的单独表,其中包含所有现有数据并仅基于该表进行匹配?
-
在 Sphinx 或 Xapian 上进行全文搜索不是更容易吗?以给定的时间间隔创建索引并只在其中搜索将大大提高搜索速度。
-
我不明白什么是 SPhinx。以及如何通过使用 sphinx 我可以显示来自 2 个或更多不同数据表的搜索结果
标签: php mysql search full-text-search