我想将n维特征向量<1.00, 0.34, 0.22, ..., 0>与每个文档一起存储,然后提供另一个特征向量作为查询,其结果按余弦相似度排序。Elastic Search可以做到吗?
<1.00, 0.34, 0.22, ..., 0>
我没有特定于Elastic Search的答案,因为我从未使用过它(我使用构建了elasticsearch的Lucene)。但是,我正在尝试为您的问题提供一个通用的答案。给定查询向量,有两种获取最近向量的标准方法,如下所述。
Kd树
第一种方法是借助支持最近邻居查询的数据结构(例如 kd树) 将向量存储在内存中。甲kd树是二叉查找树中的意义上的概括,所述的二叉查找树分区一个的每一个电平 ķ 尺寸分成两个部分。如果您有足够的空间来加载内存中的所有点,则可以在kd树上应用最近的邻居搜索算法,以获取按余弦相似度值排序的检索到的向量的列表。这种方法的明显缺点是,它无法像信息检索中经常遇到的那样扩展到大量的点集。
逆量化向量
第二种方法是使用 反量化矢量 。一个简单的基于范围的量化将 伪项 或 伪 标记 分配给矢量的实数,以便以后可以由Lucene对其进行索引(或就此而言为Elastic搜索)。
例如,我们可以将标签分配 甲 于范围 [0,0.1) , 乙 到范围 [0.1,0.2) 等等…在你的问题的样本矢量随后被编码成 (J,d,C, ..A) 。(因为[.9,1]是J,[0.3,0.4)是D,依此类推)。
因此,实数向量因此转换为字符串(可以视为文档),并因此使用标准信息检索(IR)工具进行索引。查询向量也被转换成一袋伪术语,因此可以计算集合中与当前最相似(在余弦相似度或其他度量方面)的一组其他相似向量。
该方法的主要优点是,它可以很好地扩展以用于大量实数向量集合。关键缺点是,计算出的相似度值仅是真实余弦相似度的近似值(由于量化中遇到的损失)。较小的量化范围以增加索引大小为代价获得更好的性能。