如何为快速二进制存在/不存在查找存储文本校验和


How to store text checksums for quick binary exists/does-not-exist lookups?

考虑一个应用程序,它接受来自用户的任意长度的文本输入,类似于Twitter的'tweets',但大小不超过1 MiB。由于应用程序的分布式特性,相同的文本输入可以多次传递到任何特定节点。为了防止相同的文本在索引中出现两次(基于Apache Solr),我使用文本的MD5哈希作为唯一密钥。

不幸的是,Solr不支持类似sql的"INSERT IGNORE",因此所有重复的文档替换原始文档的内容。由于应用程序的用户可以添加其他字段,因此这种替换是有问题的。为了防止它,我有两个选择:

  1. 每次插入前,查询具有MD5哈希唯一键的文档的索引。如果我得到一个结果,那么我就知道文档已经存在于索引中。我发现这种方法太慢了,可能是因为我们每分钟索引几百个文档。

  2. 将MD5散列存储在其他存储中,例如平面文件、MySQL或其他地方。这个方法是这个问题的基础。

什么形式的数据存储可以处理每分钟几百个插入,并迅速让我知道值是否存在?我正在测试MySQL(在与Solr索引不同的主轴上)和使用grep -w someHash hashes.txtcat someHash >> hashes.txt的平面文件。随着指数的增长,这两种方法似乎都放慢了速度,但我需要几天或几周的时间才能看到这两种方法是否可行。

还有什么其他的方法可以存储和检查哈希是否存在?使用MySQL和平面文件方法可能会遇到哪些基本问题?高德纳会怎么做?

从solr端,您可以尝试重复数据删除和UpdateXmlMessages#Optional_attributes,这可能服务于目的。