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

时间:2015-11-02 09:25:31

标签: php mysql sql innodb

如何从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";

虽然它不是我想要的,但是效果相当不错,但是上面代码的最大问题是资源密集(7秒完成对100k数据库的查询)。

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

1 个答案:

答案 0 :(得分:2)

也许您可以使用MySQL's fulltext search并按相关性排序。

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

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