最近项目有个实现多关键词查询的需求(本文的实例为英文数据),实例场景为:有一个文章表和一个标签表,现在需要用每一个标签作为搜索关键字去搜索每篇文章的标题和描述中是否完全包含关键字,如:
文章标题--"This is a full-text search with multiple words test.";
文章描述--"article description..."
标签--"search words"
即要搜索标题中是否完全包含"search" 和"words"这两个关键字,顺序可以不定,MySQL的LIKE模糊搜索肯定是实现不了的,如何实现呢?
自己开始的思路是取出所以标签,然后用每篇文章来循环所有标签对应的关键字,用正则表达式在循环中来判断当前文章是否包含对应的关键字。但想一想,由于文章的数据量大,而且需要即时处理出更新的标签关联数据。这个循环的方式是比较低效的。于是上GOOGLE找更优的解决方案。
搜索之下,发现了MySQL的全文搜索(自己之前听过MySQL的全文搜索,但具体是什么,怎么样去用还是未知)功能,猜想是否能满足自己目前的需求呢。在参考了许多资料后,找到一篇适用的《MySQL Full-Text Search with Multiple words》。于是按照作者文章的步骤,一步步实现了本文需求。在此总结一下MYSQL的全文搜索:
1.如果你的MySQL是5.6以下的版本,请将要用Full-Text(全文搜索)功能的表切换到MYISAM引擎:
全文搜索还可以进行搜索匹配度排序,比如:如果在文章标题中搜索到关键字,则匹配度为10,如果在文章描述中搜索到关键字,匹配度为3,那么实现如下:
以上就是自己在初次使用MySQL全文搜索的整个过程和总结,接下来要做的事情还是很多的。需要加强对MySQL各方面的学习和了解。这样会给自己解决问题提供更多思路和方法。
ALTER TABLE tablename ENGINE = MYISAM;2.在需要进行全文搜索的列上添加全文索引:
ALTER TABLE products ADD FULLTEXT(title, sdescription, ldescription)3.完成以上两步之后,我们就已成功开启了对应表的全文搜索功能,那下面就可以进行全文搜索了:
SELECT * FROM ARTICLES WHERE MATCH (Title, Description) AGAINST ('search words');以上的搜索会返回文章标题和描述中包含任一关键字的结果,即只要标题和描述中包含"search","words"的任意一个,都会算匹配,但这并不是我想要的结果。所以,还得用"IN BOOLEAN MODE"来筛选我的搜索结果。如下:
SELECT * FROM ARTICLES WHERE MATCH (Title, Description) AGAINST ('+search +words' IN BOOLEAN MODE);这条语句中使用了一个+(操作符),下面说明一下Full-Text的操作符: +:表示AND - :表示NOT [空]: OR 还是以本文的需求举例: 1.+search +words:返回同时包含search和words的文章记录; 2.+search -words:返回包含search但不包含words的文章记录; 3.+search words:返回必须包含search的文章记录,但包含words的记录会排在前面; 4.+search ~words:返回必须包含search的文章记录,包含words的记录会排在后面; 5.+search +(>with <words):返回包含search和with或者包含search和words的记录,但search with会排在前面 以上就是操作符的使用详细说明了,具体请结合实际测试使用
全文搜索还可以进行搜索匹配度排序,比如:如果在文章标题中搜索到关键字,则匹配度为10,如果在文章描述中搜索到关键字,匹配度为3,那么实现如下:
SELECT *, MATCH(`Title`) AGAINST ('+searcd +words' IN BOOLEAN MODE) * 10 as rel1, MATCH(`Description`) AGAINST ('+searcd +words' IN BOOLEAN MODE) * 3 as rel2, FROM ARTICLE WHERE MATCH (Title, Description) AGAINST ('+searcd +words' IN BOOLEAN MODE) ORDER BY (rel1)+(rel2) DESC;这样,查询的结果就会以关键词的匹配度从高到低来排序。 好了,关于MySQL的全文搜索实现就差不多了,具体的理论深入网上也是很多资料,我就不在此列举了(我自己也是需要再去深入了解和研究关于MySQL全文搜索的理论知识),下面说一下在使用MySQL中可能遇到的问题(英文): 1.全文搜索是忽略大小写的; 2.MySQL全文搜索的默认最小关键字长度为4,如果关键字长度小于此值,则没有记录返回,修改方法: 在MySQL的配置文件的[mysqld]后面添加一行:ft_min_word_len=1(值根据需求定) 3.你可以指定全文搜索忽略的关键字,设置方法为: 在MySQL的配置文件的[mysqld]后面添加一行:ft_stopword_file="d:/stopword.txt",stopword.txt文件中填写以逗号或换行符隔开的需要忽略的关键字。如果ft_stopword_file=空,那么全文搜索会跳过忽略关键字。 4.如果一个关键字的搜索结果大于整个表记录的50%,则不会有记录返回。
以上就是自己在初次使用MySQL全文搜索的整个过程和总结,接下来要做的事情还是很多的。需要加强对MySQL各方面的学习和了解。这样会给自己解决问题提供更多思路和方法。
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册