2013-08-30 90 views
1

以下代码适用于搜索,但如果您在搜索框中输入了太多文本,则该功能无效。MySQL搜索任何单词而非全部单词

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

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

我使用这个查询:

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

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

干杯

理查德

+3

这听起来像你真正想要的全文搜索,可能与布尔选项。查阅文档以获取更多信息(http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html)。 –

+0

请修改您的问题以澄清正在搜索的内容以及正在搜索的内容。 “搜索在搜索中搜索哪个词”是非常不透明的。如果你“输入太多的文字”它不起作用 - 在哪里输入文字?在你的数据库字段或你的'$ searchquery'字符串? – Air

+0

编辑的问题,希望它有助于澄清我问的问题。 Richard –

回答

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演示

+0

@Richard_Bedford它对您有帮助吗? – peterm