Mysql从2个表中的2列进行完全搜索

时间:2018-06-20 05:42:17

标签: php mysql full-text-search

我有2张桌子。一个是问题,另一个是答案,其格式如下。

  

问题(id,文本,用户)

     

answer(id,text,question_id,user)

两个表的行数明显相同。

当用户搜索短语或单词时,我希望它在问题文本和答案文本中都对该单词进行搜索,并以最常见的方式返回匹配项。

我尝试使用MySQL的完全搜索,但无法在2个不同的表和2个列上使用它。

如果可能的话,我也不想将问题和答案合并到另一个表中。

问题表:

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 个答案:

答案 0 :(得分:0)

"(select id,text, 'que' as type from question WHERE text LIKE '%keyword%')
UNION
(select id,text,'ans' as type from answer WHERE text LIKE '%keyword%')";

如果您不确定是从哪个表中选择了该行,则可以检查该类型。

答案 1 :(得分:0)

如果要查询多个关键字,建议将其存储在应用程序代码中的某个位置(即使用爆炸功能将每个关键字分开)。

也在应用程序代码中,尝试动态生成WHERE语句(因为您无法事先知道要使用的关键字数量):

.unit

然后您将需要使用以下方法查询两个表:

String sql_where = " ";
for(int i = 0, i<search.length, i++){
   if (i=0)
      sql_where += "WHERE TEXT LIKE '%"+search[i]+"%';
   else
sql_where += "\n OR TEXT LIKE '%"+search[i]+"%';
}

请注意,每种类型都添加了类型,以分隔结果行的来源。如果您需要显示提取结果的位置,这将为您提供帮助。

对于其余的内容,我将仅说明一般想法。您将要使用之前构建的搜索数组与结果集进行比较。对于每个单词,尝试在返回的每一行中查找它。在一侧,您将创建一个数组来存储常见匹配和数组索引(稍后将使用)。当您连续找到一个单词时,它在您的计数数组中的对应条目将增加1。

完成后,您要做的就是根据点击次数的降序对count数组重新排序。您会注意到,先前创建的索引ID将发生变化,这将使您可以在下一阶段使用它。

要加载,您将在count数组上循环,并使用在count数组中创建的索引列从结果集中加载结果条目。

假设上面的代码是一个一般性的想法,因为我不知道您使用的是哪种语言