所有首先你真的想为这个全文搜索。
如果出于某种原因想尝试用纯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
array(3) {
[0]=>
string(4) "text"
[2]=>
string(7) "English"
[3]=>
string(8) "Language"
}
现在有一个关键字阵列,您可以建立这样
查询
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
取样输出:
+------+------------+------+--------------------+-------+------------+-----------------+---------------------------------+------+
| id | page_title | url | search_description | text1 | text2 | text3 | text | rank |
+------+------------+------+--------------------+-------+------------+-----------------+---------------------------------+------+
| 3 | page3 | url3 | NULL | text | English | language | text English language | 3 |
| 1 | page1 | url1 | NULL | text | in English | text in English | text in English text in English | 2 |
+------+------------+------+--------------------+-------+------------+-----------------+---------------------------------+------+
注:此查询会比任何FTS解决方案的方式缓慢和方式功能少。
这里是SQLFiddle演示
这听起来像你真正想要的全文搜索,可能与布尔选项。查阅文档以获取更多信息(http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html)。 –
请修改您的问题以澄清正在搜索的内容以及正在搜索的内容。 “搜索在搜索中搜索哪个词”是非常不透明的。如果你“输入太多的文字”它不起作用 - 在哪里输入文字?在你的数据库字段或你的'$ searchquery'字符串? – Air
编辑的问题,希望它有助于澄清我问的问题。 Richard –