MySQL搜索任何单词而不是所有单词

时间:2013-08-30 22:16:27

标签: mysql search

以下代码适用于搜索,但如果您在搜索框中输入太多文字,则无效。

例如,如果您搜索“英文文本”这一短语,则会收到许多结果。但是,如果您搜索“英语语言文本”这一短语,则表示没有结果,因为“语言”一词不在其搜索的字段中。

换句话说,查询正在搜索文本中的短语,而不仅仅是文本的任何部分。

我正在使用此查询:

$sqlcommand = "SELECT id,page_title,url,search_description,text1,text2,text3 
             FROM pages 
             WHERE concat(text1, ':', text2, ':', text3) LIKE '%$searchquery%'";

我正在寻找一些建议,但我猜测LIKE '%$searchquery%'部分是问题所在。

干杯

理查德

1 个答案:

答案 0 :(得分:1)

首先你真的想要对此进行全文搜索

如果您出于某种原因想要尝试使用纯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 演示