是否可以使用特征向量查询 Elastic Search?

Is it possible to query Elastic Search with a feature vector?

我想存储一个n维特征向量,例如<1.00, 0.34, 0.22, ..., 0>,每个文档,然后提供另一个特征向量作为查询,结果按余弦相似度排序。这可以用 Elastic Search 实现吗?

我没有特定于 Elastic Search 的答案,因为我从未使用过它(我使用构建 Elastic search 的 Lucene)。但是,我正在尝试对您的问题给出一个通用的答案。 有两种标准方法可以获得给定查询向量的最近向量,如下所述。

K-d树

第一种方法是借助支持最近邻查询的数据结构将向量存储在内存中,例如k-d 树。 A k-d tree is a generalization of the binary search tree in the sense that every level of the binary search tree partitions one of the k dimensions into two parts. If you have enough space to load all the points in memory, it is possible to apply the nearest neighbour search algorithm 在 k-d 树上获得按余弦相似度值排序的检索向量列表。这种方法的明显缺点是它不能扩展到信息检索中经常遇到的大量点集。

反向量化向量

第二种方法是使用反向量化向量。一个简单的基于范围的量化分配 pseudo-termslabels 给一个向量的实数,这样这些以后可以被 Lucene 索引(或者就此而言弹性搜索)。

例如,我们可以将标签 A 分配给范围 [0, 0.1), B 到范围 [0.1, 0.2) 等等......然后将问题中的样本向量编码为 (J,D,C, ..A)。 (因为[.9,1]是J,[0.3,0.4)是D等等)。

因此,一个实数向量被转换成一个字符串(可以被视为一个文档),并因此使用标准信息检索 (IR) 工具进行索引。查询向量也被转换为一袋伪术语,因此可以计算集合中与当前向量最相似(根据余弦相似度或其他度量)的一组其他相似向量。

这种方法的主要优点是它可以很好地扩展大量实数向量集合。关键的缺点是计算出的相似度值仅仅是对真实余弦相似度的近似值(由于量化中遇到的损失)。较小的量化范围以增加索引大小为代价实现更好的性能。

elasticsearch 7.4版本居然内置了向量比较功能,包括余弦相似度。参见:https://www.elastic.co/guide/en/elasticsearch/reference/7.4/query-dsl-script-score-query.html#vector-functions.