Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用SOLR计算;相似性“/&引用;“比特计数”;在两个乌龙之间_C#_Solr_Bit Manipulation_Solrnet_Phash - Fatal编程技术网

C# 使用SOLR计算;相似性“/&引用;“比特计数”;在两个乌龙之间

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

我们有一个图像数据库,我在其中使用实现的计算了PHAH

下面是部分示例代码,用于计算这些长度之间的差异:

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#控制台/示例应用程序的直接下载:

    此控制台应用程序的输出示例如下:

    004143737f7f7f7f phash-test-001.jpg
    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#完成了剩下的部分)感谢你的回答-仅供参考,上述方法与比特数算法完全匹配。