当前位置: 首页 > 面试题库 >

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

缪英锐
2023-03-14
问题内容

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


问题答案:

我没有特定于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)工具进行索引。查询向量也被转换成一袋伪术语,因此可以计算集合中与当前最相似(在余弦相似度或其他度量方面)的一组其他相似向量。

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



 类似资料:
  • 从这个问题 报告不可变或并发的拆分器保证不会抛出ConcurrentModificationException。当然,CONCURRENT排除了语义上的大小,但这对客户机代码没有影响。 事实上,这些特性在Stream API中没有任何用途,因此,不一致地使用它们永远不会在任何地方被注意到。 这也是为什么每个中间操作都有清除并发、不可变和非空特性的效果的原因:流实现不使用这些特性,其表示流状态的内部

  • (这是我第二次尝试追踪我的确切问题。查看编辑历史记录) 我有一个简单的通用特性和两种不同的实现: 我现在想要一个包含两个实现元素的向量。正如我在这里学到的,我做: 但是编译器不同意: 一方面,这是有道理的。另一方面,我应该为写什么?我希望它是通用的,所以我不能简单地在那里放或。我可以做

  • 问题内容: 我需要向Retrofit 2.0.0-beta2库发出的每个请求添加查询参数。我为Retrofit 1.9 找到了此解决方案,但是如何添加最新的库版本? 我的界面: 客户: 问题答案: 为了完整起见,以下是完整的代码,您需要使用OkHttp-Interceptor向每个Retrofit 2.x请求中添加参数:

  • 问题内容: 我想知道是否可以在@Query批注中包含子查询(org.springframework.data.jpa.repository.Query;) 我在第一个子查询括号上得到QuerySyntaxException。 这是我的查询 谢谢! 问题答案: 不可以,JPQL查询的select子句中不能包含子查询。 JPQL在WHERE和HAVING子句中支持子查询。它可以(至少)是ANY,SOM

  • 我正在使用一个相当大的数据集(大约500Mio-Triples)存储在图形数据库免费并在我的本地开发人员机器上运行。 我想用RDF4J对数据集执行一些操作,并且必须或多或少地选择整个数据集。要进行测试,我只需选择所需的元组。代码在第一个一百万元组中运行良好,之后由于graphDB继续分配更多的RAM,速度变得非常慢。 是否有可能对非常大的数据集执行选择查询并批量获取它们? 基本上,我只想通过一些选