我们目前正在使用一揽子功能方法来索引数百万张图片。我们的想法是将每个图像转换为一包特征标记。这个包里可能有100多个代币。我们将这些特征标记映射到唯一的整数,因此每个图像最终都被转换为字符串。类似于' 1 3 5 45 ... 565 ... 9176'这些都是固定长度的字符串,有300个整数。这些整数范围为1 - 10000
我们现在想要使用此字符串并检索非常相似的其他字符串。在这种情况下,类似意味着具有最多整数的字符串。
我们当前的索引有大约5000万个文档,其中每个文档都是上面描述的固定字符串。我们目前只是在索引时进行哑默认证。这导致我们获得大约5到6秒的搜索延迟。我们怎样才能做得更好,并将延迟降低到一秒以下?
答案 0 :(得分:1)
我们现在想要使用此字符串并检索其他字符串 非常相似。在这种情况下,类似意味着具有的字符串 最常见的整数。
可能有很多方法可以做到这一点,但有一种方法是将令牌存储在位图(或位集)中,而不是将它们转换并存储在字符串中。
例如:创建10000位的位图,并为每个标记设置相应的位。然后,要计算公共令牌的数量,只需在两个位集上进行逻辑AND,并计算结果中的设置位数。
这些位图也可以某种形式压缩,允许它们被读取(以32或64位为单位)而不先解压缩(10000/300是平均每33位1位设置,所以很多块将全部归零。
现代CPU有一个内置的popcount指令来快速计数设置位。
SSE甚至AVX都可以用来加快速度。
此数据结构也非常适合在具有数百甚至数千个内核(CUDA)的GPU上进行处理。
不确定弹性搜索是否可行,但可以使用一些外部代码完成。