就像用户在输入字段中输入文章标题一样,我想搜索现有文章以查看是否有类似内容。SQL搜索查询像stackoverflow
例如,
SQL search query like stackoverflow
我想找到与本书相关的最相关的文章。
我知道它是这样的:
WHERE article_title LIKE 'word'
,但我怎么处理多个关键字?
就像用户在输入字段中输入文章标题一样,我想搜索现有文章以查看是否有类似内容。SQL搜索查询像stackoverflow
例如,
SQL search query like stackoverflow
我想找到与本书相关的最相关的文章。
我知道它是这样的:
WHERE article_title LIKE 'word'
,但我怎么处理多个关键字?
使用全文索引 '字1' 和 '单词2' 中的所有行,which'd是这样的:
SELECT ... FROM ... WHERE MATCH (fieldname) AGAINST ('keyword keyword keyword');
或者破解查询看起来像
SELECT ... FROM ... WHERE (fieldname LIKE '%keyword%' OR fieldname LIKE '%keyword%' etc...)
这两个,t他的全文版本会更快,因为它可以使用索引。 'LIKE %...%
版本将非常昂贵,因为该类型的通配符搜索根本无法使用索引。缺点是全文索引只能在MyISAM表上使用,并且可能永远不会用于InnoDB表。
WHERE article_title LIKE '%word1%word2%'
将返回在ARTICLE_TITLE包含在这个特定的顺序
您需要进行全文搜索。
确保您使用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提炼当你进入标记列表。
嗯该领域没有全文,我发现我可以添加它'CREATE INDEX fulltext2 ON articles(article_title(255));'谢谢 – Emma
提及通配符类查询的性能杀死性质的荣誉。他们根本不能很好地扩展。 – paxdiablo