使用单词数组搜索 MySQL 文本列并根据匹配数量排序
Search MySQL text column with array of words and sort according to amount of matches
如何从 MySQL table (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";
虽然这不是我想要的,但它工作得相当好,但是上面代码的最大问题是它是资源密集型的(完成对 100k 数据库的查询需要 7 秒)。
我已经看过自然语言搜索(在一定程度上),但是文档没有给我一个明确的确定方法我可以使用,MYSQL版本(5.5.44)有问题的 MySQL 服务器没有 InnoDB 的选项。但是,如果那是唯一的选择,我会升级。
也许您可以使用 MySQL's fulltext search 并按相关性排序。
您需要更改 table 以添加全文搜索索引。
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
还有其他方法可以实现此目的,但如果没有全文索引,性能会很差,因为关系数据库并不是真正为此类工作构建的。
查看非全文选项的答案,但会降低性能:
如何从 MySQL table (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";
虽然这不是我想要的,但它工作得相当好,但是上面代码的最大问题是它是资源密集型的(完成对 100k 数据库的查询需要 7 秒)。
我已经看过自然语言搜索(在一定程度上),但是文档没有给我一个明确的确定方法我可以使用,MYSQL版本(5.5.44)有问题的 MySQL 服务器没有 InnoDB 的选项。但是,如果那是唯一的选择,我会升级。
也许您可以使用 MySQL's fulltext search 并按相关性排序。
您需要更改 table 以添加全文搜索索引。
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
还有其他方法可以实现此目的,但如果没有全文索引,性能会很差,因为关系数据库并不是真正为此类工作构建的。
查看非全文选项的答案,但会降低性能: