首先,您确实需要对此进行全文搜索。
如果您出于某种原因想尝试使用纯 SQL 进行操作,那么
- 您需要做的第一件事是将搜索字符串拆分为单词
- 并使用某种停止列表过滤掉常用词(代词、连词、介词等)或/和过滤掉任何少于 2 或 3 个字符长的词。
对于初学者来说,这样的事情可能会做:
$search_string = 'text in English Language';
$stop_list = array('in', 'on', 'I', 'me', 'he', 'she');
$search_words = explode(' ', $search_string);
$keywords = array_diff($search_words, $stop_list);
你会进去的$keywords
数组(3){
[0]=>
字符串(4)“文本”
[2]=>
字符串(7)“英语”
[3]=>
string(8) "语言"
}
现在有了一个关键字数组,您可以构建这样的查询
SELECT id, page_title, url, search_description, text1, text2, text3,
(text LIKE '%text%') +
(text LIKE '%English%') +
(text LIKE '%language%') rank
FROM
(
SELECT id, page_title, url, search_description, text1, text2, text3,
CONCAT_WS(' ', text1, text2, text3) text
FROM pages p
) q
WHERE text LIKE '%text%'
OR text LIKE '%English%'
OR text LIKE '%language%'
HAVING rank > 1 -- play with cut-off rank value to get most relevant results
ORDER BY rank DESC
样本输出:
+--------+------------+------+---------+- ------+------------+-----------------+------------ ---------------------+--------+
| 编号 | 页标题 | 网址 | 搜索描述 | 文本1 | 文本2 | 文本3 | 正文 | 排名 |
+--------+------------+------+---------+- ------+------------+-----------------+------------ ---------------------+--------+
| 3 | 第 3 页 | 网址3 | 空 | 正文 | 英语 | 语言 | 文本 英语 | 3 |
| 1 | 第 1 页 | 网址1 | 空 | 正文 | 英语 | 英文文本 | 英文文本 英文文本 | 2 |
+--------+------------+------+---------+- ------+------------+-----------------+------------ ---------------------+--------+
注意:与任何 FTS 解决方案相比,此查询将慢得多,功能也少。
这是SQLFiddle演示