如何从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的选项。然而,如果这是唯一的选择,我会升级。
答案 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