mysql 根据关键词权重搜索
在日常开发中,我们需要搜素某一篇文章,那么就会根据用户输入的关键字进行like匹配,如果关键词不进行分词的话,很多情况下无法匹配
如:数据库里有一篇文章的标题是“php与js加密”,到用户输入关键字“js与php加密”的时候,使用like是无法匹配到的,那怎么办呢,首先你得进行中文的分词,中文分词的php库很多,这篇文章中介绍了,可以点开看看http://blog.bfw.wiki/user6/15686199218306690026.html
今天我们就不讲分词了,我们来看看,分词之后如何进行关键词匹配,比如上面用户输入的关键词进行分词后是“js与 php 加密”这五个词语,那么怎么进行匹配呢,有人说用like or ,是的,可以用,但是结果会匹配一大堆包含这五个关键字的文章,我们如何将标题是“php与js加密”的文章排在第一列呢,今天我们来揭晓一下。
mysql权重搜索可以解决这个问题,首先来了解一下两个函数LOCATE与IF,
LOCATE('字符',字段) : 查询字符在 字段出现的位置,0 表示未找到。否则返回 坐标位置,坐标位置从1开始。
IF( 表达式 , 1 , 0) : 判断表达式结果, TRUE 则返回 1 , FALSE 则返回0
SELECT title , ( IF(LOCATE('加密',title) , 1, 0) + IF(LOCATE('php',title) , 1, 0) + IF(LOCATE('js',title) , 1, 0) ) AS weight FROM article as tt WHERE
title regexp 'php|js|加密' order by weight desc
上面的查询中,每个关键词的权重都是1,所以 关键词出现最多的 标题出现在第一位。
如果权重增加,那么权重高的关键词将会影响排序规则。如下例子,将 js 的权重改为8
SELECT title , ( IF(LOCATE('加密',title) , 1, 0) + IF(LOCATE('php',title) , 1, 0) + IF(LOCATE('js',title) , 8, 0) ) AS weight FROM article as tt WHERE
title regexp 'php|js|加密' order by weight desc
注意,mysql的这个方式效率比较低,建议采用全文索引的方式进行查找
网友评论0