如何用DockArray的子索引实现嵌套数据的搜索

​ 
如何用DockArray的子索引实现嵌套数据的搜索_第1张图片

 

导语

在数据很简单的时候,每个向量都代表一个数据点,我们轻松地存储到任意向量数据库,基于相似度去检索 embedding。但现实世界的数据总是很混乱的,多模态数据有着各式各样的层次嵌套结构。

无需担心,Jina 全家桶为你准备了解决方案!

作者介绍

Jina AI 机器学习工程师 Johannes Messner

任务:商品搜索

在本笔记本中,我们的数据库包含在线商店的列表,每个列表都包含多个图像和一个商品描述。首先要让这些数据都是可搜索的,此外,还希望用户能使用不同的模态(文本、图像或两者同时)作为查询输入,来搜索到准确的商品。

为了解决这两个问题,我们只需要一个工具 DocArray

具体来说,我们将用到 3 个 DocArray 的功能:


1. Dataclass[1],对数据进行建模


2. Subindex[2],使数据点及数据点的嵌套信息可搜索


3. Document Stores[3],将我们的数据存储在磁盘上,并对它做检索


此外,我们也将使用 CLIP-as-service 编码文本和图像数据,生成对应 embedding。

数据索引

在索引数据之前,让我们看看我们的数据必须是什么样子,才能完成上述任务。


• 想要搜索图像,需要为每个图像提供 embedding


• 想要搜索描述,需要表示其描述的语义 embedding


• 想要搜索整个列表,每个列表都需要一个能代表整个列表的 embedding


如何用DockArray的子索引实现嵌套数据的搜索_第2张图片

将 embedding 存储在向量数据库中时,通常无法保留这种嵌套数据结构。但是,DocArray 子索引解决了这一难题。

Subindex

在 DocArray 中,数据以 Document 的形式存储,DocumentArray 是用于保存多个 Document 的列表。默认情况下,DocumentArray 是一个内存数据结构,但它也原生支持 Document Store,它是(向量)数据库后端,可用于在磁盘上持久化数据。

每个 DocumentArray 代表一个搜索索引,因此给定一个查询,我们可以找到其中包含的元素。一旦找到匹配的 Document,就可以将它们加载到内存中。

子索引使得这种模式能够扩展到嵌套数据。每个子索引代表父 DocumentArray 的一个嵌套层次,比如图片或描述文本。只要启用了子索引,就可以直接在该层执行搜索,就不需要像使用根级别索引一样,先将所有数据加载到内存中。

在底层,每个子索引创建一个单独的数据库索引,独立于其他子索引或根索引来存储相关数据。

引用链接

[1] Dataclass: https://docarray.jina.ai/fund...
[2] Subindex: https://docarray.jina.ai/fund...
[3] Document Stores: https://docarray.jina.ai/adva...

 

你可能感兴趣的:(如何用DockArray的子索引实现嵌套数据的搜索)