如何在最大的数据库中查找相似的消息

4
我有一个包含200万条消息的数据库。当用户接收到一条消息时,我需要根据单词出现的频率在我的数据库中查找相关的消息。
我尝试运行批处理来概括我的数据库: 1-存储所有消息中的单词(除了an、a、the、of、for等)。 2-创建所有消息和其中包含的单词之间的关联(我还存储了该单词在消息中出现的频率)。
然后,当我收到一条消息时: 1-解析单词(这看起来像是我批处理的第一步)。 2-执行查询以按相同单词数量排序获取消息。
但是,更新我的单词库的过程和查询相似消息的过程非常耗时且缓慢。对于3000字节的消息,单词库更新需要大约1.2111秒。查询相似消息需要大约9.8秒。
数据库调优已经完成,代码也可以正常工作。
我需要更好的算法来解决这个问题。
有任何想法吗?

你难道不需要全文搜索吗?http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html - Mchl
我刚刚下了订单,谢谢。 - Gustavo Costa De Oliveira
2个回答

2
我建议使用Apache Solr(http://lucene.apache.org/solr/)进行设置。它非常容易设置和索引数百万个文档。Solr处理所有必要的优化(尽管它是开源的,所以如果您觉得需要,可以对其进行调整)。
然后,您可以使用可用的API进行查询,我更喜欢Java API SolrJ(http://wiki.apache.org/solr/Solrj)。通常情况下,我看到结果在一秒钟内返回。
对于文本索引,Solr通常表现优于MySQL。

我将使用Apache Solr进行测试和实现。 - Gustavo Costa De Oliveira

1

相似度匹配仍然是一个特别复杂的领域,但你可以看一下MySQL参考手册中的全文匹配,尤其是其中一些更复杂的例子。

你应该可以运行一个一次性任务来为所有当前消息构建相似度矩阵,然后只需运行每晚的批处理程序将新消息添加到相似度矩阵中。


我被安排制作一个夜间批处理程序来更新相似度矩阵。我将执行一个使用全文搜索的实现基准测试。谢谢。 - Gustavo Costa De Oliveira

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接