以下代码适用于搜索,但如果您在搜索框中输入太多文字,则无效。
例如,如果您搜索“英文文本”这一短语,则会收到许多结果。但是,如果您搜索“英语语言文本”这一短语,则表示没有结果,因为“语言”一词不在其搜索的字段中。
换句话说,查询正在搜索文本中的短语,而不仅仅是文本的任何部分。
我正在使用此查询:
$sqlcommand = "SELECT id,page_title,url,search_description,text1,text2,text3
FROM pages
WHERE concat(text1, ':', text2, ':', text3) LIKE '%$searchquery%'";
我正在寻找一些建议,但我猜测LIKE '%$searchquery%'
部分是问题所在。
干杯
理查德
答案 0 :(得分:1)
首先你真的想要对此进行全文搜索。
如果您出于某种原因想要尝试使用纯SQL,那么
这样的事情可能会对初学者有所帮助:
$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 演示