CouchbaseSearchVectorStore 是向量搜索的一个实现,它是 Couchbase 中 全文搜索服务 (搜索服务) 的一部分。
本教程说明如何通过 Couchbase 搜索服务使用向量搜索。您可以同时使用 Couchbase Capella 和自我管理的 Couchbase Server。
安装
您将需要 couchbase 和 langchain community 来使用 couchbase 向量存储。在本教程中,我们将使用 OpenAI 嵌入npm
创建 couchbase 连接对象
我们首先创建到 Couchbase 集群的连接,然后将集群对象传递给向量存储。在这里,我们使用用户名和密码进行连接。 您也可以使用任何其他支持的方式连接到您的集群。 有关连接到 Couchbase 集群的更多信息,请查看 Node SDK 文档。创建搜索索引
目前,搜索索引需要从 Couchbase Capella 或 Server UI 或使用 REST 接口创建。 对于此示例,让我们使用 UI 上的搜索服务的导入索引功能。 让我们在测试存储桶上定义一个名为vector-index 的搜索索引。
我们在 testing 存储桶的 _default 范围的 _default 集合上定义一个索引,向量字段设置为 embedding,维度为 1536,文本字段设置为 text。
我们还在文档中索引和存储 metadata 下的所有字段作为动态映射,以解决不同的文档结构。相似度度量设置为 dot_product。
如何将索引导入全文搜索服务?
- Couchbase Server
- Click on Search -> Add Index -> Import
- Copy the following Index definition in the Import screen
- Click on Create Index to create the index.
- Couchbase Capella
- Copy the following index definition to a new file
index.json - Import the file in Capella using the instructions in the documentation.
- Click on Create Index to create the index.
- Copy the following index definition to a new file
索引定义
创建向量存储
我们使用集群信息和搜索索引名称创建向量存储对象。基本向量搜索示例
以下示例展示了如何通过搜索服务使用 couchbase 向量搜索并执行相似性搜索。 对于此示例,我们将通过 TextLoader 加载 “state_of_the_union.txt” 文件, 将文本分块为 500 个字符的块且没有重叠,并将所有这些块索引到 Couchbase 中。 数据索引后,我们执行一个简单的查询来查找与查询 “What did president say about Ketanji Brown Jackson” 相似的前 4 个块。 最后,它还展示了如何获取相似性分数指定要返回的字段
您可以使用搜索期间过滤器中的fields 参数指定要从文档返回的字段。
这些字段作为 metadata 对象的一部分返回。您可以获取存储在索引中的任何字段。
文档的 textKey 作为文档的 pageContent 的一部分返回。
如果您没有指定要获取的任何字段,则返回存储在索引中的所有字段。
如果您想获取元数据中的一个字段,您需要使用 . 指定它。
例如,要获取元数据中的 source 字段,您需要使用 metadata.source。
混合搜索
Couchbase 允许您通过结合向量搜索结果和文档的非向量字段(如metadata 对象)上的搜索来进行混合搜索。
结果将基于向量搜索和全文搜索服务支持的搜索结果的组合。每个组件搜索的分数相加得到结果的总分数。
要执行混合搜索,fields 参数中有一个可选键 searchOptions,可以传递给所有相似性搜索。
可以在 此处 找到 searchOptions 的不同搜索/查询可能性。
为混合搜索创建多样化的元数据
为了模拟混合搜索,让我们从现有文档创建一些随机元数据。 我们在元数据中均匀添加三个字段,date 在 2010 年和 2020 年之间,rating 在 1 和 5 之间,author 设置为 John Doe 或 Jane Doe。
我们还将声明一些示例查询。
示例:按精确值搜索
我们可以在文本字段(如metadata 对象中的作者)上搜索完全匹配。
示例:按部分匹配搜索
我们可以通过为搜索指定模糊度来搜索部分匹配。当您想搜索搜索查询的细微变化或拼写错误时,这很有用。 在这里,“Johny” 接近(模糊度为 1)“John Doe”。示例:按日期范围查询搜索
我们可以搜索日期字段(如metadata.date)上的日期范围查询内的文档。
示例:按数字范围查询搜索
我们可以搜索数字字段(如metadata.rating)范围内的文档。
示例:组合多个搜索条件
不同的查询可以使用 AND (连接) 或 OR (析取) 运算符组合。 在此示例中,我们正在检查评级在 3 到 4 之间且日期在 2015 到 2018 之间的文档。其他查询
同样,您可以在filter 参数的 searchOptions 键中使用任何支持的查询方法,如地理距离、多边形搜索、通配符、正则表达式等。有关可用查询方法及其语法的更多详细信息,请参阅文档。
常见问题
问题:我应该在创建 CouchbaseVectorStore 对象之前创建搜索索引吗?
是的,目前您需要在创建CouchbaseVectorStore 对象之前创建搜索索引。
问题:我没有看到我在搜索结果中指定的所有字段。
在 Couchbase 中,我们只能返回存储在搜索索引中的字段。请确保您尝试在搜索结果中访问的字段是搜索索引的一部分。 处理此问题的一种方法是在索引中动态索引和存储文档的字段。- 在 Capella 中,您需要转到“高级模式”,然后在“常规设置”人字形下,您可以选中“[X] 存储动态字段”或“[X] 索引动态字段”
- 在 Couchbase Server 中,在索引编辑器(不是快速编辑器)的“高级”人字形下,您可以选中“[X] 存储动态字段”或“[X] 索引动态字段”
问题:我无法在搜索结果中看到 metadata 对象。
这很可能是因为文档中的metadata 字段没有被 Couchbase 搜索索引索引和/或存储。为了索引文档中的 metadata 字段,您需要将其作为子映射添加到索引中。
如果您选择映射映射中的所有字段,您将能够按所有元数据字段进行搜索。或者,为了优化索引,您可以选择要索引的 metadata 对象中的特定字段。
您可以参考 文档 以了解有关索引子映射的更多信息。
要创建子映射,您可以参考以下文档 -
相关
Connect these docs to Claude, VSCode, and more via MCP for real-time answers.

