我有一个包含 2,000,000 条消息的数据库。当用户收到一条消息时,我需要根据单词的出现情况在我的数据库中查找相关的消息。
我尝试运行一个批处理来总结我的数据库:1 – 存储所有消息的所有单词(除了 an、a、the、of、for…)。2 – 创建所有消息与其中包含的单词之间的关联(我也存储该单词在消息中出现的频率)。
然后,当我收到一条消息时:1 – 我解析单词(看起来像我的批处理的第一步)。2 – 在数据库中执行查询,以获取按一致单词数量排序的消息。
但是,更新我的词库和查询以获取相似消息的过程非常繁重且缓慢。对于一个 3000 字节的消息,词库更新持续约 1.2111 秒。 对于相同大小的消息,查询相似消息持续约 9.8 秒。
数据库调优已经完成,代码工作正常。
我需要一个更好的算法来做到这一点。
有什么想法吗?
回答:
我建议您设置 Apache Solr (http://lucene.apache.org/solr/)。 它非常容易设置并索引数百万个文档。 Solr 处理所有必要的优化(虽然它是开源的,因此如果您觉得需要,您可以对其进行调整)。
然后,您可以使用可用的 API 进行查询,我更喜欢 Java API SolrJ (http://wiki.apache.org/solr/Solrj)。 我通常会在一秒钟内看到返回的结果。
对于文本索引,Solr 通常优于 MySQL。