用单词数组搜索MySQL文本列,并根据匹配量进行排序


Search MySQL text column with array of words and sort according to amount of matches

如何从MySQL表(Innodb)中检索记录,并根据记录的两列可能包含的子字符串数量对结果进行排序。

我正在两个不同栏中的正文中搜索单词。所以这个词可能存在,它的前面或后面可能有未知的文本

目前,我的PHP代码创建了一个查询,该查询使用不同数量的不同子字符串搜索两列(包含文本)。

参见简化示例:

$string = "";
foreach $array_of_words as $word) {
    $string = $string . " column_one LIKE '% $word%' OR column_two LIKE '% $word%' OR ";
}
$string = substr ( $string, 0, - 3 );
$query = "SELECT * FROM tbl_maintable WHERE (" . $string . ") LIMIT 5";

尽管这并不是我想要的,但它运行得相当好,但上面代码的最大问题是它占用了大量资源(对10万个数据库完成查询需要7秒)。

我已经看了自然语言搜索(在一定程度上),但文档并没有给我一个明确的方法,我可以使用,并且有问题的MYSQL服务器的MYSQL版本(5.5.44)没有InnoDB的选项。但是,如果这是唯一的选择,我会升级。

也许您可以使用MySQL的全文搜索并按相关性排序。

您需要更改表以添加全文搜索索引。

ALTER TABLE `tbl_maintable` ADD FULLTEXT INDEX `SEARCH`(`columnName`);

然后运行这样的查询:

SELECT *, MATCH(columnName) AGAINST ('word1 word2 word3 word4' IN BOOLEAN MODE) AS relevance
FROM tbl_maintable WHERE
MATCH (columnName) AGAINST ('word1 word2 word3 word4' IN BOOLEAN MODE)
ORDER BY relevance DESC

还有其他方法可以实现这一点,但如果没有全文索引,性能将非常差,因为关系数据库并不是真正为这类工作构建的。

请看以下答案,了解非全文选项,但会降低性能:https://stackoverflow.com/a/20320723/933633