Elasticsearch 是一款分布式 RESTful 搜索与分析引擎,能够同时执行向量搜索和词法搜索。它构建于 Apache Lucene 库之上。本 Notebook 展示与
Elasticsearch 向量存储相关的功能使用方法。
设置
要使用Elasticsearch 向量搜索,您必须安装 langchain-elasticsearch 包。
凭据
设置用于 Elasticsearch 实例的方式主要有两种:- Elastic Cloud:Elastic Cloud 是托管的 Elasticsearch 服务。注册免费试用。
- 本地安装 Elasticsearch:通过在本地运行 Elasticsearch 开始使用。最简单的方法是使用官方 Elasticsearch Docker 镜像。更多信息请参阅 Elasticsearch Docker 文档。
本地运行 Elasticsearch
在本地运行 Elasticsearch 进行开发和测试的最简单方法是使用 start-local 脚本。该脚本通过一行命令使用 Docker 设置 Elasticsearch(以及可选的 Kibana)。elastic-start-local 的文件夹,其中包含配置文件和启动脚本。要启动 Elasticsearch:
http://localhost:9200 上可用。elastic 用户的密码和 API key 会自动生成,并存储在 elastic-start-local 文件夹中的 .env 文件里。
如果您只需要 Elasticsearch 而不需要 Kibana,可以使用 --esonly 选项:
start-local 设置仅用于本地测试,不应在生产环境中使用。有关生产环境安装,请参阅官方 Elasticsearch 文档。
使用身份验证运行
对于生产环境,我们建议在启用安全性的情况下运行。要使用登录凭据进行连接,您可以使用es_api_key 参数,或使用 es_user 和 es_password 参数。
如何获取默认 “elastic” 用户的密码?
要获取默认 “elastic” 用户的 Elastic Cloud 密码:- 登录 Elastic Cloud 控制台:cloud.elastic.co
- 前往 “Security”(安全)> “Users”(用户)
- 找到 “elastic” 用户并点击 “Edit”(编辑)
- 点击 “Reset password”(重置密码)
- 按照提示重置密码
如何获取 API key?
要获取 API key:- 登录 Elastic Cloud 控制台:cloud.elastic.co
- 打开 Kibana,前往 Stack Management > API Keys
- 点击 “Create API key”(创建 API key)
- 输入 API key 的名称并点击 “Create”(创建)
- 复制 API key 并粘贴到
api_key参数中
Elastic Cloud
要连接到 Elastic Cloud 上的 Elasticsearch 实例,您可以使用es_cloud_id 参数或 es_url。
初始化
Elasticsearch 通过 Docker 在 localhost:9200 本地运行。有关如何从 Elastic Cloud 连接 Elasticsearch 的更多详情,请参阅上方的使用身份验证连接。管理向量存储
向向量存储添加条目
从向量存储删除条目
查询向量存储
向量存储创建完毕并添加相关文档后,您很可能需要在链或代理运行过程中对其进行查询。这些示例还展示了搜索时如何使用过滤。直接查询
相似度搜索
带元数据过滤的简单相似度搜索可按如下方式执行:带评分的相似度搜索
如果您希望执行相似度搜索并获取对应分数,可以运行:转换为检索器后查询
您也可以将向量存储转换为检索器,以便在链中更方便地使用。距离相似度算法
Elasticsearch 支持以下向量距离相似度算法:- cosine(余弦)
- euclidean(欧氏)
- dot_product(点积)
检索策略
与其他纯向量数据库相比,Elasticsearch 支持多种检索策略,具有显著优势。本 Notebook 将配置ElasticsearchStore 以支持一些最常见的检索策略。
默认情况下,ElasticsearchStore 使用 DenseVectorStrategy(在 0.2.0 版本之前称为 ApproxRetrievalStrategy)。
DenseVectorStrategy
此策略返回与查询向量最相似的前 k 个向量。k 参数在初始化 ElasticsearchStore 时设置,默认值为 10。
示例:结合密集向量和关键词搜索的混合检索
本示例将展示如何配置 ElasticsearchStore 以执行混合检索,结合近似语义搜索和关键词搜索。 我们使用 RRF(倒数排名融合)来平衡两种不同检索方法的得分。 要启用混合检索,需要在DenseVectorStrategy 构造函数中设置 hybrid=True。
示例:在 Elasticsearch 中使用嵌入模型的密集向量搜索
本示例将展示如何配置ElasticsearchStore 以使用部署在 Elasticsearch 中的嵌入模型进行密集向量检索。
要使用此功能,请通过 query_model_id 参数在 DenseVectorStrategy 构造函数中指定 model_id。
注意: 这要求模型已在 Elasticsearch ML 节点中部署并运行。参阅笔记本示例,了解如何使用 eland 部署模型。
SparseVectorStrategy(ELSER)
此策略使用 Elasticsearch 的稀疏向量检索来获取前 k 个结果。目前仅支持我们自己的 “ELSER” 嵌入模型。 注意: 这要求 ELSER 模型已在 Elasticsearch ML 节点中部署并运行。 要使用此功能,请在ElasticsearchStore 构造函数中指定 SparseVectorStrategy(在 0.2.0 版本之前称为 SparseVectorRetrievalStrategy)。您需要提供模型 ID。
DenseVectorScriptScoreStrategy
此策略使用 Elasticsearch 的 script score 查询执行精确向量检索(也称为暴力检索)以获取前 k 个结果。(此策略在 0.2.0 版本之前称为ExactRetrievalStrategy。)
要使用此功能,请在 ElasticsearchStore 构造函数中指定 DenseVectorScriptScoreStrategy。
BM25Strategy
最后,您可以使用全文关键词搜索。 要使用此功能,请在ElasticsearchStore 构造函数中指定 BM25Strategy。
BM25RetrievalStrategy
此策略允许用户在不使用向量搜索的情况下执行纯 BM25 搜索。 要使用此功能,请在ElasticsearchStore 构造函数中指定 BM25RetrievalStrategy。
注意,在以下示例中,未指定嵌入选项,表示搜索不使用嵌入进行。
自定义查询
通过搜索时的custom_query 参数,您可以调整用于从 Elasticsearch 检索文档的查询。如果您需要使用更复杂的查询或支持字段线性加权,这非常有用。
自定义文档构建器
通过搜索时的doc_builder 参数,您可以调整如何使用从 Elasticsearch 检索的数据构建 Document。当您的索引不是通过 LangChain 创建时,这尤其有用。
用于检索增强生成
关于如何将此向量存储用于检索增强生成(RAG)的指南,请参阅以下章节:常见问题
问题:在将文档索引到 Elasticsearch 时出现超时错误,如何解决?
一个可能的原因是您的文档索引到 Elasticsearch 可能需要更长时间。ElasticsearchStore 使用 Elasticsearch 批量 API,您可以调整其中的一些默认值,以降低超时错误的概率。 使用 SparseVectorRetrievalStrategy 时也建议这样做。 默认值为:chunk_size:500max_chunk_bytes: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
通过 MCP 将这些文档连接到 Claude、VSCode 等,获取实时答案。

