我试图在我的数据库中搜索一个字符串,但它应该能够匹配任何单词而不是整个短语。mySQL LIKE查询
假设,一个表格数据有像a b c d e f g
这样的文字。然后,如果我搜索d c b
它应该能够显示结果。
field LIKE '%d c b%'
不以这种方式工作。
有人可以建议一个更强大的搜索方式,也可能显示相关性计数器。
我不介意在上面使用PHP,但更喜欢在数据库级别进行搜索。
我试图在我的数据库中搜索一个字符串,但它应该能够匹配任何单词而不是整个短语。mySQL LIKE查询
假设,一个表格数据有像a b c d e f g
这样的文字。然后,如果我搜索d c b
它应该能够显示结果。
field LIKE '%d c b%'
不以这种方式工作。
有人可以建议一个更强大的搜索方式,也可能显示相关性计数器。
我不介意在上面使用PHP,但更喜欢在数据库级别进行搜索。
为获得最佳效果,您需要为您的数据创建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_len
到1
在MySQL
confguration。
即使你没有一个索引(只要你的表是MyISAM
)这种语法能正常工作,但会比较慢。
如果表是在MyISAM中,您可以使用全文搜索集成在MySQL:11.8. Full-Text Search Functions
虽然会有一些限制(例如,如果我没记错,你不能单词比X字符短搜索 - X通常是3或4)。
另一种解决方案是使用一些全文的发动机,像Lucene,Solr,或Sphinx - 那些通常做得更好,当涉及到全文的搜索:这是他们的工作(MySQL的工作是存储数据,而不是做全文搜索)
已经有许多关于那些做题;例如:
如果您使用的是PHP,不能安装任何软件,有一个完整的PHP实现了Lucene:Zend_Search_Lucene
我想你想要做的是,对于任何字母:
field LIKE '%d%' or field like '%c%' or field like '%b%'
所有的字母
field LIKE '%d%' and field like '%c%' and field like '%b%'
最后,MySQL LIKE子句并不意味着用作'强大'搜索工具来进行基于单词的匹配。这是找到部分短语的简单工具。它也不是很好的扩展,所以如果你在高端吞吐量网站上这样做,你可能会需要另一种解决方案。
所以他这样说,也有一些对你的选择,让你想要什么:
正则表达式的支持,也支持在MySQL做REGEX based searches。使用它,并且使用足够复杂的REGEX,您可以找到您要查找的内容。
在MySQL中真正的全文索引。 MySQL有办法创建FULLTEXT indexes。您需要使用MyISAM数据引擎,并且对于您可以或不可以执行的操作有限制。但它比SQL所具有的基本'like'功能强大得多。如果你有兴趣,我建议你阅读它。
第三方索引器。这实际上是大多数人走的路线。他们将使用Lucene/Solr或其他类似的索引技术,这些索引技术专门用于使用各种逻辑对单词进行全文搜索,就像现代Web搜索引擎的工作方式一样。它们非常高效,因为它们本质上保留了自己的数据库,并将它们分解成一切,并以最适合这些类型搜索的方式进行存储。
希望这三个选项之一会为你工作。
使用like
子句时,请注意它是%variable%
或variable%
而不是%variable
。其次,做一个情感搜索使用explode
函数来打破单词,就像我搜索“学习php”一样,它应该像这样搜索:“learn + php”,就像在Google中一样。它的功能是explode()
。
这听起来更像是评论而不是答案。 – 2012-11-22 12:30:20
但是,这将返回任何具有它们的任何东西,而不是只返回那些具有全部或部分属性的东西。 – nilamo 2009-09-09 16:50:48
是的,但这似乎并不是他要“匹配任何词而不是整个词组”的要求。 – 2009-09-09 17:00:04
-1这也会返回一个字符串,例如“** d ** hhlkjfyfjfjf ** c ** kjhtyfgv ** b **”,在这种情况下您可能会说'LIKE'%d%c%b% ”。 – 2009-09-09 17:00:08