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

4fec5deb1aedef19f448a04da19f22a9.jpeg

导语

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

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

作者介绍

Jina AI 机器学习工程师 Johannes Messner

任务:商品搜索

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

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

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

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

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

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

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

数据索引

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

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

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

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

    49ff463f181c6d0a680220a30bdcb5cd.jpeg

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

Subindex

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

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

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

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

点击 阅读原文 查看原代码

引用链接

[1] Dataclasshttps://docarray.jina.ai/fundamentals/dataclass
[2] Subindex: https://docarray.jina.ai/fundamentals/documentarray/subindex
[3] Document Stores: https://docarray.jina.ai/advanced/document-store

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值