使用elasticsearch查找类似的向量或长字符串

时间:2017-03-09 12:09:31

标签: performance search elasticsearch

我们目前正在使用一揽子功能方法来索引数百万张图片。我们的想法是将每个图像转换为一包特征标记。这个包里可能有100多个代币。我们将这些特征标记映射到唯一的整数,因此每个图像最终都被转换为字符串。类似于' 1 3 5 45 ... 565 ... 9176'这些都是固定长度的字符串,有300个整数。这些整数范围为1 - 10000

我们现在想要使用此字符串并检索非常相似的其他字符串。在这种情况下,类似意味着具有最多整数的字符串。

我们当前的索引有大约5000万个文档,其中每个文档都是上面描述的固定字符串。我们目前只是在索引时进行哑默认证。这导致我们获得大约5到6秒的搜索延迟。我们怎样才能做得更好,并将延迟降低到一秒以下?

1 个答案:

答案 0 :(得分:1)

  

我们现在想要使用此字符串并检索其他字符串   非常相似。在这种情况下,类似意味着具有的字符串   最常见的整数。

可能有很多方法可以做到这一点,但有一种方法是将令牌存储在位图(或位集)中,而不是将它们转换并存储在字符串中。

例如:创建10000位的位图,并为每个标记设置相应的位。然后,要计算公共令牌的数量,只需在两个位集上进行逻辑AND,并计算结果中的设置位数。

这些位图也可以某种形式压缩,允许它们被读取(以32或64位为单位)而不先解压缩(10000/300是平均每33位1位设置,所以很多块将全部归零。

现代CPU有一个内置的popcount指令来快速计数设置位。

SSE甚至AVX都可以用来加快速度。

此数据结构也非常适合在具有数百甚至数千个内核(CUDA)的GPU上进行处理。

不确定弹性搜索是否可行,但可以使用一些外部代码完成。