【问题标题】:MySQL Searching for ANY word rather than ALL the wordsMySQL搜索任何单词而不是所有单词
【发布时间】:2013-08-30 22:16:26
【问题描述】:

以下代码适用于搜索,但如果您在搜索框中输入的文本过多,则它不起作用。

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

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

我正在使用这个查询:

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

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

干杯

理查德

【问题讨论】:

  • 听起来您真的想要全文搜索,可能使用布尔选项。查看文档以获取更多信息 (dev.mysql.com/doc/refman/5.5/en/fulltext-search.html)。
  • 请编辑您的问题以阐明正在搜索的内容和正在搜索的内容。 “在搜索中搜索任何单词的搜索”非常不透明。如果您“输入太多文本”它不起作用 - 在哪里输入文本?在您的数据库字段或$searchquery 字符串中?
  • 问题已编辑,希望它有助于澄清我的问题。理查德
  • 您能否提供相关的示例数据、搜索字符串和所需的查询输出?如果您按照 ...any part of... 查询字符串所述进行搜索,则可以使用 in 或/和 text...之类的词从表中获取所有行跨度>

标签: mysql search


【解决方案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

数组(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演示

【讨论】:

  • @Richard_Bedford 有帮助吗?
猜你喜欢
  • 1970-01-01
  • 2012-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 2011-06-23
相关资源
最近更新 更多