嵌套数据搜索还能这么玩!

265 阅读3分钟

向量数据库固然很好,它让我们可以根据相似性快速地检索向量。但向量数据库考虑的是向量,而我们要考虑的是数据,当数据很简单时,这两者几乎是等价的,每个向量代表一个数据点,而每个数据点都与一个向量相关。但是,现实世界的数据往往都是复杂的,多层级的,各式各样的...往往嵌套的数据结构才能更好地表达数据内容和层级关系。

无需担心,DocArray 在手,天下我有!

作者介绍

Jina AI 机器学习工程师 Johannes Messner

作者注

本文的知识点推荐和 Colab 笔记本一起搭配食用

colab.research.google.com/github/jina…

任务:商品搜索

在本笔记本中,我们将完成一个商品搜索的 demo:数据库是一个线上商店的商品列表,每个列表又包含多个图像和一个商品描述。首先我们要让这些数据都是可搜索的,此外,我们还希望用户能使用不同的模态(文本、图像或两者同时)作为查询输入,以准确搜索到对应的商品。为了解决这两个问题,我们只需要一个工具 DocArray具体来说,我们将用到 3 个 DocArray 的功能:

  1. 1. Dataclass[1],对数据进行建模
  2. 2. Subindex(子索引)[2],使数据点及数据点的嵌套信息可搜索
  3. 3. Document Store[3],将我们的数据存储在磁盘上,并对它做检索

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

数据索引

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

  • • 想要搜索图像,需要为每个图像提供 embedding
  • • 想要搜索描述,需要表示其描述的语义 embedding
  • • 想要搜索整个列表,每个列表都需要一个能代表整个列表的 embedding
  • 图片

如果你把 embedding 存储在向量数据库,那么你通常无法保留这种嵌套数据结构。但如果你使用 DocArray,Subindices 就能轻松解决这一问题。

什么是子索引

在介绍什么是子索引之前,我们需要先了解 DocArray 的两个基本概念。在 DocArray 中,数据以 Document 的形式存储,DocumentArray 是用于保存多个 Document 的列表。默认情况下,DocumentArray 是一个内存数据结构,但它也原生支持 Document Store,例如 WeaviateElasticsearch 等。它支持将 Document 存放在(向量)数据库里,以在磁盘上持久化数据,并获得更快的检索速度。

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

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

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

引用链接

[1] Dataclass: *docarray.jina.ai/fundamental… [2] Subindex: *docarray.jina.ai/fundamental… [3] Document Stores: docarray.jina.ai/advanced/do…