C# 使用SOLR计算;相似性“/&引用;“比特计数”;在两个乌龙之间
我们有一个图像数据库,我在其中使用实现的计算了PHAH 下面是部分示例代码,用于计算这些长度之间的差异:C# 使用SOLR计算;相似性“/&引用;“比特计数”;在两个乌龙之间,c#,solr,bit-manipulation,solrnet,phash,C#,Solr,Bit Manipulation,Solrnet,Phash,我们有一个图像数据库,我在其中使用实现的计算了PHAH 下面是部分示例代码,用于计算这些长度之间的差异: ulong hash1 = AverageHash(theImage); ulong hash2 = AverageHash(theOtherImage); uint BitCount(ulong theNumber) { uint count = 0; for (; theNumber > 0; theNumber >>= 8) { co
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,以按相似性顺序查找其他散列
请注意:
0041417F7F7F7F7F7F phash-test-002.jpg
相似性:95.3125%
你可以使用它,你必须在页面上向下滚动一点 Solr的标准查询解析器支持基于Levenshtein距离或编辑距离算法的模糊搜索。模糊搜索发现与指定术语相似的术语,但不一定是精确匹配的术语。要执行模糊搜索,请在单个单词词尾使用波浪符号 假设您有如下模式,其中此字段
phash
保存您计算的phash
您可以执行如下查询:
q=phash:004143737f7f7f7f~0.8&
fl=score,phash
这将返回所有具有至少80%的Levenshtein距离或编辑距离的PHASH的文档。你不会得到你在问题中给出的95.3125%,但是87.5%的匹配/不匹配字符被计算在内
当您想要查看该值时,可以执行以下查询
q=phash:004143737f7f7f7f~0.8&
fl=score,phash,strdist("0041417f7f7f7f7f", phash, edit)
这是一个使用Levenstein或编辑距离的示例,并将提供类似的结果
+----------------+---------------------------------------+
|hash |strdist("0041417f7f7f7f7f", hash, edit)|
+----------------+---------------------------------------+
|0041417f7f7f7f7f|1.0 |
+----------------+---------------------------------------+
|004143737f7f7f7f|0.875 |
+----------------+---------------------------------------+
当您想减少<代码> 95.3125% 和87.5%之间的间隙时,您应该考虑将PHASH存储为十六进制值,但是作为八进制值,例如:
谢谢@ CHEFE-我现在将对此进行测试,为了进一步改进strist而不是octet,使用诸如000000000 100000100001011011100110111111111111111111011111011111011111011111011111111这样的单个位串是否有意义,我正在尝试尽可能接近如示例所示的位计数。(尽管我很高兴SOLR让我完成了90%的过程,并用C#完成了剩下的部分)感谢你的回答-仅供参考,上述方法与比特数算法完全匹配。