【问题标题】:Using elasticsearch to find similar vectors or long strings使用elasticsearch查找相似向量或长字符串
【发布时间】:2017-03-09 12:09:30
【问题描述】:

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

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

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

【问题讨论】:

    标签: performance search elasticsearch


    【解决方案1】:

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

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

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

    这些位图也可以以某种形式压缩,这样就可以在不先解压缩的情况下读取它们(以 32 位或 64 位块为单位)(10000 / 300 是平均每 33 位设置一个位,所以很多块将全为零)。

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

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

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

    不确定这是否可以通过 elasticsearch 实现,但可以通过一些外部代码来完成。

    【讨论】:

    • 是的,这是一种加快搜索速度的方法,但这意味着建立单独的基础架构,每秒允许数十个请求。如果没有简单的方法来使用我们现有的堆栈来做到这一点,我们将求助于此。
    猜你喜欢
    • 2011-03-20
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 2019-12-27
    • 2021-10-12
    相关资源
    最近更新 更多