使用SOLR计算两个ulongs之间的"相似性"/"bitcount"

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

几点说明:

  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%

che*_*ffe 4

您可以使用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 存储为八进制而不是十六进制值。