INNODB FULLTEXT 使用 JOIN 搜索:不同表上的搜索词

Posted

技术标签:

【中文标题】INNODB FULLTEXT 使用 JOIN 搜索:不同表上的搜索词【英文标题】:INNODB FULLTEXT search with JOIN: search term on different tables 【发布时间】:2021-02-17 08:07:07 【问题描述】:

我曾经用MyISAM 使用以下查询:

SELECT *, table2.columnx 
FROM table1 
    LEFT JOIN table2 ON table1.columnx_id = table2.id 
WHERE MATCH(table1.columny, table2.columnx) AGAINST("+key* +word*" IN BOOLEAN MODE);

这会在多个表上进行FULLTEXT 搜索。

现在,我切换到INNODB 并收到以下错误消息:

一般错误:1210 MATCH 的参数不正确

我重写了如下查询以删除错误消息并使其正常工作:

SELECT *, table2.columnx 
FROM table1 
    LEFT JOIN table2 ON table1.columnx_id = table2.id 
WHERE MATCH(table1.columny) AGAINST("+key* +word*" IN BOOLEAN MODE) 
      OR MATCH(table2.columnx) AGAINST("+key* +word*" IN BOOLEAN MODE);

只要所有搜索字词 keyword 都在同一个表中,这就会非常有效。

但是如果例如keytable1wordtable1 我没有得到任何结果。

我该如何解决这个问题?

【问题讨论】:

使用这 2 列并根据参考创建第三个表。通过该表创建 FT 索引并在查询中使用它。通过触发逻辑更新此表数据。 @Akina 我会这样做的。但总的来说:INNODB 可能会出现这种情况,还是根本不可能,但只有 MyISAM 我没有看到不允许在任何引擎(当然支持 FTS)上使用此技术的限制。 @Akina 我说的是我的问题,而不是你的评论。 这是唯一的可能性吗,因为 INNODB 不允许在两个表上进行 FULLTEXT 搜索 - 我提供了以此为基础的逻辑。 【参考方案1】:

正如@Akina 所述,这似乎是不可能的,因为INNODB 不允许FULLTEXT 在两个表上搜索。

我将为FULLTEXT 搜索创建第三个表,并用两个表中的数据填充它。

【讨论】:

以上是关于INNODB FULLTEXT 使用 JOIN 搜索:不同表上的搜索词的主要内容,如果未能解决你的问题,请参考以下文章

mysql5.6 InnoDB 全文索引 FULLTEXT 中文解决方案 base64

MySql两大引擎InnoDB和MyISAM

MySQL的全文索引Fulltext Index 包括ngram

InnoDB全文索引基础

mysql The used table type doesn’t support FULLTEXT indexes 解决方案 (phpstudy 会出现),coten不会

InnoDB和MyISAM存储引擎的区别