【发布时间】:2011-09-02 16:33:14
【问题描述】:
就像用户在输入框写文章标题一样,我想搜索现有文章,看看是否有类似的。
例如。
SQL search query like stackoverflow
我想查找与此标题相关的最相关文章。
我知道是这样的:
WHERE article_title LIKE 'word'
但是如何处理多个关键字呢?
【问题讨论】:
就像用户在输入框写文章标题一样,我想搜索现有文章,看看是否有类似的。
例如。
SQL search query like stackoverflow
我想查找与此标题相关的最相关文章。
我知道是这样的:
WHERE article_title LIKE 'word'
但是如何处理多个关键字呢?
【问题讨论】:
使用全文索引,类似于:
SELECT ... FROM ... WHERE MATCH (fieldname) AGAINST ('keyword keyword keyword');
或者修改查询看起来像
SELECT ... FROM ... WHERE (fieldname LIKE '%keyword%' OR fieldname LIKE '%keyword%' etc...)
在这两者中,全文版本会更快,因为它可以使用索引。 'LIKE %...% 版本将非常昂贵,因为这种通配符搜索根本无法使用索引。缺点是全文索引仅适用于 MyISAM 表,并且可能永远不会适用于 InnoDB 表。
【讨论】:
CREATE INDEX fulltext2 ON articles(article_title(255)); 添加它,谢谢
您需要对此进行全文搜索。
确保您使用 MyISAM 作为您要搜索的表的引擎。
有下表
Table articles
--------------
id integer autoincrement PK
title varchar(255) with fulltext index
contents textblob with fulltext index
并使用如下查询:
SELECT id
, MATCH(title, contents) AGAINST ('$title_of_article_thats_being_edited')
as relevance
FROM articles
WHERE MATCH(title, contents) AGAINST ('$title_of_article_thats_being_edited')
ORDER BY relevance
请注意,当您输入标签时,SO 会优化列表。
【讨论】:
WHERE article_title LIKE '%word1%word2%'
将按此特定顺序返回 article_title 包含“word1”和“word2”的所有行
【讨论】: