Cam*_*out 5 c# solr bit-manipulation solrnet phash
我们有一个图像数据库,我使用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 + "%");
Run Code Online (Sandbox Code Playgroud)
挑战是我只知道其中一个哈希,我想查询SOLR以找到相似顺序的其他哈希值.
几点说明:
编辑,一些额外的信息(道歉我陷入了问题并开始假设它是一个广为人知的领域).这是直接下载到C#console/sample app:http://01101001.net/Imghash.zip
此控制台应用程序的示例输出将是:
004143737f7f7f7f phash-test-001.jpg
0041417f7f7f7f7f phash-test-002.jpg
相似度:95.3125%
您可以使用Solr 的模糊搜索来实现此目的,您必须在页面上向下滚动一点。
Solr 的标准查询解析器支持基于 Levenshtein Distance 或 Edit Distance 算法的模糊搜索。模糊搜索会发现与指定术语相似的术语,但不一定完全匹配。要执行模糊搜索,请在单个单词术语的末尾使用波形符 ~ 符号。
假设您有如下所示的架构,其中该字段phash保存您计算的 phash。
<fields>
<!-- ... all your other fields ... -->
<field name="phash" type="string" indexed="true" stored="true" />
</fields>
Run Code Online (Sandbox Code Playgroud)
您可以执行类似的查询
q=phash:004143737f7f7f7f~0.8&
fl=score,phash
Run Code Online (Sandbox Code Playgroud)
这将返回 PHASHLevenshtein Distance or Edit Distance至少为 80% 的所有文档。您不会得到您在问题中给出的 95.3125%,但会计算匹配/不匹配字符的 87.5%。
当您想查看该值时,可以执行以下查询
q=phash:004143737f7f7f7f~0.8&
fl=score,phash,strdist("0041417f7f7f7f7f", phash, edit)
Run Code Online (Sandbox Code Playgroud)
这是一个使用 Levenstein 或编辑距离获取字符串距离的函数调用,并将提供类似于以下的结果
+----------------+---------------------------------------+
|hash |strdist("0041417f7f7f7f7f", hash, edit)|
+----------------+---------------------------------------+
|0041417f7f7f7f7f|1.0 |
+----------------+---------------------------------------+
|004143737f7f7f7f|0.875 |
+----------------+---------------------------------------+
Run Code Online (Sandbox Code Playgroud)
95.3125%当您想减少和之间的差距时,87,5%您应该考虑将 PHASH 存储为八进制而不是十六进制值。