使用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以找到相似顺序的其他哈希值。

几点说明:

  1. 在这里使用SOLR(只有我有的替代品是HBASE)
  2. 想避免在solr中安装任何自定义java(很高兴安装现有的插件)
  3. 很高兴在C#中做很多预处理
  4. 很高兴使用多个字段将数据存储为位串,长串等
  5. 使用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存储。