如何从mysql查找出10篇标题相似的文章

考虑数据量比较多的情况下,目前假设千万级别,如何从一张表里面根据文章如何根据现有的文章标题查找相似度最高的10篇文章,比如,现有的标题:我的绯闻非人女友,那应该从表里面找出类似"我的绯闻野狗xx","绯闻飞吻飞蚊"等等。

在网上找到一个类似的解决方案,思路大概是:将标题组成词,再like模糊查询,比如:"我的绯闻女友",先用脚本处理成"我的","的绯",“绯闻”,“闻女”,“女友”这样两个词组成的词,然后再计算该词在该标题出现的次数,设置为权重$im,最后sql语句时
select (title like "%我的%")*$im,(title like "的我").. from article where ..
,用这种词语模糊查询来查询标题相似度接近的文章,不知道这种方式靠不靠谱?

阅读 7.1k
4 个回答

1.首先一般来说,是先检索标签、标题或者做索引,用mysql做模糊搜索。但是这些都是在数据量比较少的前提下
2.涉及到千万级别,一般是采用sphinx等搜索的解决方案来解决。

技术的关键词是全文索引,具体实例就不说了,举一个栗子:抛弃mysql模糊查询,使用sphinx做专业索引

按照你网上找的方法,理论上可以实现,但是千万级别的数据,即使用了全文搜索难免也会担忧性能。
如果有条件,你可以找个智能取词的库。
实现的过程你可以先用PHP将标题切割成数组,然后用如下SQL。

$list = ['我的',  '的绯', '绯闻', ...];
foreach ($list as &$v) {
    $v = "(title like '%$v%')";
}
$where = implode('or', $list);
$order = implode('+', $list);
$sql = "select * from tb where $where order by $order limit 10";

...

涉及文本相似度计算 mysql做不了

可以使用coreseek中文搜索引擎,然后将千万级的mysql文章数据做成索引,在搜索的地方,直接查询coreseek,这样减缓了直接查询数据库的压力,又能够极大的提高查询效率。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题