2015-11-02 82 views
0

如何从MySQL表(Innodb)检索记录,并根据记录的两列可能包含多少个子字符串排序结果。根据匹配的数量搜索MySQL文本列并根据匹配的数量排序

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

目前我的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

你试过全文搜索查询? – AnkiiG

+0

您是否尝试过使用:'AND MATCH(columnName)AGAINST('textString'IN BOOLEAN MODE)> 0'替换'columnName'和'textString'.. – MaggsWeb

+0

我试过全文搜索,但该选项仅适用于InnoDB 5.6及以上。 –

回答

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

+0

这会很棒,但全文搜索仅适用于InnoDB 5.6及更高版本。看起来像我需要升级。 –

+0

@BarryBrian:看看我的编辑。我已经添加了一个来自另一个问题的答案,该问题计入了字段中的匹配词。毫无疑问,它的性能会很差,但可能会帮助您,直到您升级MySQL并使用全文索引。 – TheCarver

+1

我最终升级MySQL并使用您的查询,就像一个魅力。谢谢 –