使用SOLR计算两个ulongs之间的“相似性”/“bitcount”
我们有一个图像数据库,我使用David Oftedal实施的Neal Krawetz博士的方法计算了PHASH。
部分示例代码计算这些长度之间的差异在这里:
ulong hash1 = AverageHash(theImage); ulong hash2 = AverageHash(theOtherImage); uint BitCount(ulong theNumber) { uint count = 0; for (; theNumber > 0; theNumber >>= 8) { count += bitCounts[(theNumber & 0xFF)]; } return count; } Console.WriteLine("Similarity: " + ((64 - BitCount(hash1 ^ hash2)) * 100.0) / 64.0 + "%");
挑战是我只知道其中一个哈希,我想查询SOLR以找到相似顺序的其他哈希值。
几点说明:
- 在这里使用SOLR(只有我有的替代品是HBASE)
- 想避免在solr中安装任何自定义java(很高兴安装现有的插件)
- 很高兴在C#中做很多预处理
- 很高兴使用多个字段将数据存储为位串,长串等
- 使用SOLRNet作为客户端
编辑,一些额外的信息(道歉我陷入了问题并开始假设它是一个广为人知的领域)。 这是直接下载到C#console / sample app:http: //01101001.net/Imghash.zip
此控制台应用程序的示例输出将是:
004143737f7f7f7f phash-test-001.jpg
0041417f7f7f7f7f phash-test-002.jpg
相似度:95.3125%
您可以使用Solr的模糊搜索 ,您必须在页面上向下滚动一下。
Solr的标准查询解析器支持基于Levenshtein距离或编辑距离算法的模糊搜索。 模糊搜索发现类似于指定术语的术语,而不一定是完全匹配。 要执行模糊搜索,请在单个词的末尾使用波浪号〜符号。
假设您有一个如下所示的模式,此字段phash
包含您计算的phash。
您可以执行类似的查询
q=phash:004143737f7f7f7f~0.8& fl=score,phash
这将返回具有Levenshtein Distance or Edit Distance
至少为80%的PHASH的所有文档。 您不会得到您在问题中给出的95.3125%,但是计算匹配/不匹配字符的87.5%。
如果要查看该值,可以执行以下查询
q=phash:004143737f7f7f7f~0.8& fl=score,phash,strdist("0041417f7f7f7f7f", phash, edit)
这是一个使用Levenstein或Edit距离获取String Distance的函数调用 ,并将提供类似的结果
+----------------+---------------------------------------+ |hash |strdist("0041417f7f7f7f7f", hash, edit)| +----------------+---------------------------------------+ |0041417f7f7f7f7f|1.0 | +----------------+---------------------------------------+ |004143737f7f7f7f|0.875 | +----------------+---------------------------------------+
当你想减小95.3125%
和87,5%
之间的差距时,你应该考虑将PHASH存储为不是hex值,而是以八进制forms存储。