在 Elasticsearch 中存储嵌入式内容

Elasticsearch 完全支持矢量的存储和检索,因此是处理嵌入的理想数据库。

领域类型

在本教程的 "全文搜索 "一章中,您已经学习了如何创建包含多个字段的索引。当时有人提到,Elasticsearch 在大多数情况下可以根据数据本身自动确定每个字段的最佳类型。尽管 Elasticsearch 8.11 能够自动映射某些向量类型,但在本章中,你将明确定义该类型,借此机会进一步了解 Elasticsearch 中的类型映射。

检索类型映射

与索引中每个字段相关联的类型是在一个称为 映射的 过程中确定的, 映射 可以是动态的,也可以是显式的。本教程全文搜索部分创建的映射都是由 Elasticsearch动态生成的

Elasticsearch 客户端提供了一个get_mapping 方法,该方法可返回对给定索引有效的类型映射。如果您想自己探索这些映射,请启动 Python shell 并输入以下代码:

get_mapping() 方法的响应是一个字典,其中包含索引中每个字段的信息。为方便起见,下面是本教程全文检索部分创建的my_documents 索引的格式化信息结构:

从这里可以看出,created_onupdated_at 字段自动输入了date ,而其他字段都输入了text 。在确定类型时,Elasticsearch 会首先检查数据的类型,这有助于为字段分配数字、布尔和对象类型。如果字段数据是字符串,它还会尝试查看数据是否与日期模式匹配。如果需要,还可以对数字启用基于模式的字符串检测。

文本字段有fields 定义和keyword 条目。这就是所谓的子字段,在适当的时候可以使用的替代或辅助类型。在 Elasticsearch 中,动态键入的text 字段有一个keyword 子字段。您已经使用category.keyword 子字段对给定类别进行了精确搜索。为避免添加子字段,可给出textkeyword 的明确映射,然后这将是主要且唯一的类型。

在索引中添加矢量字段

让我们在索引中添加一个新字段,用于存储每个文档的嵌入。

显式映射的结构与 Elasticsearch 客户端get_mapping() 方法返回的响应中的mappings key 相匹配。只有需要明确键入的字段才需要给出,因为映射中不包括的任何字段都将继续像以前一样动态键入。

下面是Search 类的create_index() 方法的新版本,增加了一个名为embedding 的显式键入字段。在search.py 中替换该方法:

可以看到,embedding 字段的类型是dense_vector,这是存储嵌入时的适当类型。稍后您将了解另一种类型的矢量sparse_vector ,它在其他类型的语义搜索应用中也很有用。

dense_vector类型接受几个 参数 ,都是可选 参数 。

  • dims:将要存储的向量的大小。自 8.11 版起,插入第一个文档时将自动分配尺寸。
  • index:必须设置为True ,以表示矢量应被索引以便搜索。这是默认设置。
  • similarity:比较向量时使用的距离函数。最常见的两种方法是dot_productcosine 。点积的效率更高,但需要对向量进行归一化处理。默认值为cosine

为文档添加嵌入

在上一节中,您已经了解了如何使用 SentenceTransformers 框架和all-MiniLM-L6-v2 模型生成嵌入式内容。现在是将模型集成到应用程序中的时候了。

首先,可以在Search 类的构造函数中实例化模型:

正如您在本教程全文检索部分所回顾的,Search 类有insert_document()insert_documents() 方法,分别用于向索引中插入单个和多个文档。现在,这两种方法需要生成与每份文档相对应的嵌入。

下一个代码块显示了这两个方法的新版本,以及一个返回嵌入的get_embedding() 辅助方法。

修改后的方法将新的embedding 字段添加到要插入的文档中。嵌入是从每个文件的summary 字段生成的。一般来说,嵌入是由句子或短段落生成的,因此在这种情况下,摘要是一个理想的使用字段。其他选项可能是name 字段,其中包含文件标题,或者是文件body 的前几句话。

有了这些变化,就可以重建索引,以便为每份文档存储嵌入信息。要重建索引,请使用此命令:

如果您需要提醒,flask reindex 命令是在app.py 中的reindex() 函数中实现的。它调用Search 类的reindex() 方法,该方法又调用create_index() ,然后将data.json文件中的所有数据传递给insert_documents()

准备好打造最先进的搜索体验了吗?

足够先进的搜索不是一个人的努力就能实现的。Elasticsearch 由数据科学家、ML 操作员、工程师以及更多和您一样对搜索充满热情的人提供支持。让我们联系起来,共同打造神奇的搜索体验,让您获得想要的结果。

亲自试用