1

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

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

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

我正在使用这个查询:

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

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

干杯

理查德

4

1 回答 1

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

于 2013-08-31T03:58:26.723 回答