2009-09-09 135 views
4

我试图在我的数据库中搜索一个字符串,但它应该能够匹配任何单词而不是整个短语。mySQL LIKE查询

假设,一个表格数据有像a b c d e f g这样的文字。然后,如果我搜索d c b它应该能够显示结果。

field LIKE '%d c b%'不以这种方式工作。

有人可以建议一个更强大的搜索方式,也可能显示相关性计数器。

我不介意在上面使用PHP,但更喜欢在数据库级别进行搜索。

回答

4

为获得最佳效果,您需要为您的数据创建FULLTEXT索引。

CREATE TABLE mytable (id INT NOT NULL, data TEXT NOT NULL, FULLTEXT KEY fx_mytable_data) ENGINE=MyISAM 

SELECT * 
FROM mytable 
WHERE MATCH(data) AGAINST ('+word1 +word2 +word3' IN BOOLEAN MODE) 

注意索引一个字母的单词(如你的例子),你需要设置ft_min_word_len1MySQL confguration。

即使你没有一个索引(只要你的表是MyISAM)这种语法能正常工作,但会比较慢。

1

如果表是在MyISAM中,您可以使用全文搜索集成在MySQL:11.8. Full-Text Search Functions

虽然会有一些限制(例如,如果我没记错,你不能单词比X字符短搜索 - X通常是3或4)。


另一种解决方案是使用一些全文的发动机,像LuceneSolr,或Sphinx - 那些通常做得更好,当涉及到全文的搜索:这是他们的工作(MySQL的工作是存储数据,而不是做全文搜索)

已经有许多关于那些做题;例如:


如果您使用的是PHP,不能安装任何软件,有一个完整的PHP实现了Lucene:Zend_Search_Lucene

2

我想你想要做的是,对于任何字母:

field LIKE '%d%' or field like '%c%' or field like '%b%' 

所有的字母

field LIKE '%d%' and field like '%c%' and field like '%b%' 
+0

但是,这将返回任何具有它们的任何东西,而不是只返回那些具有全部或部分属性的东西。 – nilamo 2009-09-09 16:50:48

+0

是的,但这似乎并不是他要“匹配任何词而不是整个词组”的要求。 – 2009-09-09 17:00:04

+0

-1这也会返回一个字符串,例如“** d ** hhlkjfyfjfjf ** c ** kjhtyfgv ** b **”,在这种情况下您可能会说'LIKE'%d%c%b% ”。 – 2009-09-09 17:00:08

1

最后,MySQL LIKE子句并不意味着用作'强大'搜索工具来进行基于单词的匹配。这是找到部分短语的简单工具。它也不是很好的扩展,所以如果你在高端吞吐量网站上这样做,你可能会需要另一种解决方案。

所以他这样说,也有一些对你的选择,让你想要什么:

  • 正则表达式的支持,也支持在MySQL做REGEX based searches。使用它,并且使用足够复杂的REGEX,您可以找到您要查找的内容。

  • 在MySQL中真正的全文索引。 MySQL有办法创建FULLTEXT indexes。您需要使用MyISAM数据引擎,并且对于您可以或不可以执行的操作有限制。但它比SQL所具有的基本'like'功能强大得多。如果你有兴趣,我建议你阅读它。

  • 第三方索引器。这实际上是大多数人走的路线。他们将使用Lucene/Solr或其他类似的索引技术,这些索引技术专门用于使用各种逻辑对单词进行全文搜索,就像现代Web搜索引擎的工作方式一样。它们非常高效,因为它们本质上保留了自己的数据库,并将它们分解成一切,并以最适合这些类型搜索的方式进行存储。

希望这三个选项之一会为你工作。

0

使用like子句时,请注意它是%variable%variable%而不是%variable。其次,做一个情感搜索使用explode函数来打破单词,就像我搜索“学习php”一样,它应该像这样搜索:“learn + php”,就像在Google中一样。它的功能是explode()

+0

这听起来更像是评论而不是答案。 – 2012-11-22 12:30:20