2017-03-09 25 views
1

我们目前使用特征袋方法来索引数百万图像。这个想法是将每个图像翻译成一包功能标记。这个包里可能有100个令牌。我们将这些特征标记映射到唯一的整数,因此每个图像最终都被转换为一个字符串。像'1 3 5 45 ... 565 .. 9176'这些都是300个整数的固定长度字符串。这些整数范围从1 - 10000使用elasticsearch来查找相似的向量或长字符串

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

我们目前的索引有大约5000万个文档,其中每个文档都是上述的固定字符串。我们目前只是在编制索引时进行默认的标记化。这导致我们获得大约5到6秒的搜索延迟。我们如何能够做得更好,并将这种延迟降低到一秒以内?

回答

1

我们现在想使用这个字符串并检索其他非常相似的字符串 。在这种情况下,类似的意思是大多数整数都是相同的字符串。

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

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

这些位图也可以以某种形式进行压缩,以便在没有先解压缩的情况下读取它们(以32位或64位为单位)(平均而言,10000/300是每33位1个位集,所以很多块将全部为零)。

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

而且SSE,甚至AVX可以用来加快速度。

此数据结构也将是理想的在GPU上处理,与数百甚至数千内核(CUDA)的。

不确定这是否可用于elasticsearch,但可以用一些外部代码完成。

+0

是的,这是做一个更快的搜索的一种方式,但是这将意味着设立单独的基础设施,允许数十请求每一秒。如果没有简单的方法来处理我们现有的堆栈,我们会采用这种方法。 – Cygorger

相关问题