我有两张table。一个是问题,另一个是以下格式的答案。
问题(id、文本、用户)
答案(id、文本、问题\ id、用户)
显然,两个表的行数相同。
当用户搜索一个短语或单词时,我希望它在问题文本和答案文本中搜索该单词,并按最常用的返回匹配项。
我试着使用mysql的完整搜索,但是我不能使它在两个不同的表和两列上工作。
如果可能的话,我也不想把问题和答案合并到另一个表中。
问题表:
CREATE TABLE `questions` (
`id` int(11) NOT NULL,
`message_id` int(11) DEFAULT NULL,
`text` text NOT NULL,
`answer` int(11) DEFAULT NULL,
`status` varchar(255) NOT NULL,
`user` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE `questions`
ADD PRIMARY KEY (`id`);
ALTER TABLE `questions` ADD FULLTEXT KEY `text` (`text`);
ALTER TABLE `questions`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
答案表:
CREATE TABLE `answers` (
`id` int(11) NOT NULL,
`message_id` int(11) DEFAULT NULL,
`text` text NOT NULL,
`question` int(11) NOT NULL,
`status` varchar(255) NOT NULL,
`user` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE `answers`
ADD PRIMARY KEY (`id`);
ALTER TABLE `answers` ADD FULLTEXT KEY `text` (`text`);
ALTER TABLE `answers`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
2条答案
按热度按时间dsekswqp1#
如果您想查询多个关键字,建议将其存储在应用程序代码中的某个位置(即使用分解函数分隔每个关键字)。
同样在应用程序代码中,尝试动态生成where语句(因为您无法预先知道要使用的关键字的数量):
然后,您需要使用以下命令查询两个表:
请注意,向每个行添加类型是为了分隔结果行的源。如果您需要显示提取结果的位置,这将有助于您。
剩下的,我来解释一下大概的意思。您需要使用先前构建的搜索数组与结果集进行比较。对于每个单词,尝试在返回的每一行中查找它。另一方面,您将创建一个数组来存储常见的命中数和数组索引(稍后将使用)。当您在一行中找到一个单词时,它在count数组中的相应条目将递增1。
完成后,只需根据命中次数的降序对count数组重新排序。您将注意到,前面创建的索引id将发生变化,这将允许您在下一阶段使用它。
对于加载,您将在count数组上循环,并使用在count数组中创建的索引列从结果集中加载结果条目。
假设上面的代码是一个总体思路,因为我不知道您使用的是哪种语言
lstz6jyr2#
如果不清楚该行是从哪个表中选择的,可以检查该行的类型。