Elasticsearch 是一个分布式、RESTful 搜索和分析引擎,能够执行向量和词法搜索。它建立在 Apache Lucene 库之上。本 notebook 展示了如何使用与
Elasticsearch 向量存储相关的功能。
设置
为了使用Elasticsearch 向量搜索,您必须安装 langchain-elasticsearch 包。
凭据
设置 Elasticsearch 实例有两种主要方式,用于:- Elastic Cloud:Elastic Cloud 是一种托管的 Elasticsearch 服务。注册一个免费试用。
- 本地安装 Elasticsearch:通过本地运行 Elasticsearch 来开始使用。最简单的方法是使用官方的 Elasticsearch Docker 镜像。有关更多信息,请参阅Elasticsearch Docker 文档。
通过 Docker 运行 Elasticsearch
示例:运行一个禁用安全性的单节点 Elasticsearch 实例。不建议用于生产环境。运行带身份验证的 Elasticsearch
对于生产环境,我们建议您启用安全性。要使用登录凭据进行连接,您可以使用参数es_api_key 或 es_user 和 es_password。
如何获取默认“elastic”用户的密码?
获取默认“elastic”用户的 Elastic Cloud 密码- 登录 Elastic Cloud 控制台:cloud.elastic.co
- 转到“安全性”>“用户”
- 找到“elastic”用户并点击“编辑”
- 点击“重置密码”
- 按照提示重置密码
如何获取 API 密钥?
获取 API 密钥- 登录 Elastic Cloud 控制台:cloud.elastic.co
- 打开 Kibana 并转到 Stack Management > API Keys
- 点击“创建 API 密钥”
- 输入 API 密钥的名称并点击“创建”
- 复制 API 密钥并将其粘贴到
api_key参数中
Elastic Cloud
要连接到 Elastic Cloud 上的 Elasticsearch 实例,您可以使用es_cloud_id 参数或 es_url。
初始化
Elasticsearch 在本地 localhost:9200 上运行,通过docker。有关如何从 Elastic Cloud 连接到 Elasticsearch 的更多详细信息,请参阅上面的通过身份验证连接。管理向量存储
向向量存储添加项目
从向量存储中删除项目
查询向量存储
创建向量存储并添加相关文档后,您很可能希望在链或代理运行时查询它。这些示例还展示了如何在搜索时使用过滤。直接查询
相似性搜索
执行带有元数据过滤的简单相似性搜索可以如下操作带分数的相似性搜索
如果您想执行相似性搜索并接收相应的分数,可以运行通过转换为检索器进行查询
您还可以将向量存储转换为检索器,以便在您的链中更轻松地使用。距离相似度算法
Elasticsearch 支持以下向量距离相似度算法- 余弦
- 欧几里得
- 点积
检索策略
Elasticsearch 相对于其他仅向量数据库具有巨大的优势,因为它能够支持广泛的检索策略。在本 notebook 中,我们将配置ElasticsearchStore 以支持一些最常见的检索策略。 默认情况下,ElasticsearchStore 使用 DenseVectorStrategy(在 0.2.0 版本之前称为 ApproxRetrievalStrategy)。DenseVectorStrategy(稠密向量策略)
这将返回与查询向量最相似的前 k 个向量。k 参数在初始化 ElasticsearchStore 时设置。默认值为 10。
示例:使用稠密向量和关键词搜索进行混合检索
此示例将展示如何配置 ElasticsearchStore 来执行混合检索,结合使用近似语义搜索和基于关键词的搜索。 我们使用 RRF 来平衡来自不同检索方法的两个分数。 要启用混合检索,我们需要在DenseVectorStrategy 构造函数中设置 hybrid=True。示例:使用 Elasticsearch 中的 Embedding 模型进行稠密向量搜索
此示例将展示如何配置ElasticsearchStore 以使用部署在 Elasticsearch 中的嵌入模型进行稠密向量检索。 要使用此功能,请通过 query_model_id 参数在 DenseVectorStrategy 构造函数中指定模型 ID。 注意:这需要模型部署并在 Elasticsearch ML 节点中运行。有关如何使用 eland 部署模型的notebook 示例。SparseVectorStrategy(稀疏向量策略)(ELSER)
此策略使用 Elasticsearch 的稀疏向量检索来检索前 k 个结果。目前我们只支持我们自己的“ELSER”嵌入模型。 注意:这需要 ELSER 模型部署并在 Elasticsearch ML 节点中运行。 要使用此功能,请在ElasticsearchStore 构造函数中指定 SparseVectorStrategy(在 0.2.0 版本之前称为 SparseVectorRetrievalStrategy)。您需要提供模型 ID。DenseVectorScriptScoreStrategy(稠密向量脚本评分策略)
此策略使用 Elasticsearch 的脚本评分查询来执行精确向量检索(也称为暴力搜索),以检索前 k 个结果。(此策略在 0.2.0 版本之前称为ExactRetrievalStrategy。) 要使用此功能,请在 ElasticsearchStore 构造函数中指定 DenseVectorScriptScoreStrategy。BM25Strategy(BM25 策略)
最后,您可以使用全文关键词搜索。 要使用此功能,请在ElasticsearchStore 构造函数中指定 BM25Strategy。BM25RetrievalStrategy(BM25 检索策略)
此策略允许用户使用纯 BM25 进行搜索,而不进行向量搜索。 要使用此功能,请在ElasticsearchStore 构造函数中指定 BM25RetrievalStrategy。 请注意,在下面的示例中,未指定嵌入选项,表明搜索是在不使用嵌入的情况下进行的。自定义查询
通过搜索中的custom_query 参数,您可以调整用于从 Elasticsearch 检索文档的查询。这在您想要使用更复杂的查询以支持字段的线性提升时非常有用。
自定义文档构建器
通过搜索中的doc_builder 参数,您可以调整如何使用从 Elasticsearch 检索到的数据构建文档。这在您的索引不是使用 LangChain 创建的情况下特别有用。
用于检索增强生成的使用
有关如何将此向量存储用于检索增强生成 (RAG) 的指南,请参阅以下部分常见问题解答
问题:将文档索引到 Elasticsearch 时出现超时错误。如何解决?
一个可能的问题是您的文档索引到 Elasticsearch 可能需要更长时间。ElasticsearchStore 使用 Elasticsearch bulk API,它有一些默认值,您可以调整这些默认值以减少超时错误的发生。 当您使用 SparseVectorRetrievalStrategy 时,这也是一个好主意。 默认值是:chunk_size(块大小): 500max_chunk_bytes: 100MB(最大块字节数:100MB)
chunk_size 和 max_chunk_bytes 参数传递给 ElasticsearchStore 的 add_texts 方法。
升级到 ElasticsearchStore
如果您已经在基于 langchain 的项目中使用 Elasticsearch,您可能正在使用旧的实现:ElasticVectorSearch 和 ElasticKNNSearch,它们现在已被弃用。我们引入了一个名为 ElasticsearchStore 的新实现,它更灵活且易于使用。本 notebook 将指导您完成升级到新实现的过程。
新功能
新的实现现在是一个名为ElasticsearchStore 的类,它可以通过策略用于近似稠密向量、精确稠密向量、稀疏向量(ELSER)、BM25 检索和混合检索。
我正在使用 ElasticKNNSearch
旧实现我正在使用 ElasticVectorSearch
旧实现API 参考
有关所有ElasticSearchStore 功能和配置的详细文档,请参阅 API 参考:python.langchain.com/api_reference/elasticsearch/vectorstores/langchain_elasticsearch.vectorstores.ElasticsearchStore.html
以编程方式连接这些文档到 Claude、VSCode 等,通过 MCP 获取实时答案。