Skip to main content

OpenSearch 开放搜索

OpenSearch 是一个可扩展、灵活和可扩展的开源软件套件,用于搜索、分析和可观察性应用,采用 Apache 2.0 许可证。OpenSearch 是基于 Apache Lucene 的分布式搜索和分析引擎。

本笔记本展示了如何使用与 OpenSearch 数据库相关的功能。

要运行,您应该有一个正在运行的 OpenSearch 实例:在此处查看简单的 Docker 安装方式

similarity_search 默认执行近似 k-NN 搜索,该搜索使用多种算法之一,如 lucene、nmslib、faiss,适用于大型数据集。要执行暴力搜索,我们还有其他称为脚本评分和无痛脚本的搜索方法。请查看此处了解更多详细信息。

安装

安装 Python 客户端。

pip install opensearch-py

我们想要使用 OpenAIEmbeddings,所以我们需要获取 OpenAI API 密钥。

import os
import getpass

os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import OpenSearchVectorSearch
from langchain.document_loaders import TextLoader
from langchain.document_loaders import TextLoader

loader = TextLoader("../../../state_of_the_union.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

embeddings = OpenAIEmbeddings()

使用自定义参数的 similarity_search 使用 Approximate k-NN 搜索

docsearch = OpenSearchVectorSearch.from_documents(
docs, embeddings, opensearch_url="http://localhost:9200"
)

# 如果使用默认的 Docker 安装,请改用以下实例化方式:
# docsearch = OpenSearchVectorSearch.from_documents(
# docs,
# embeddings,
# opensearch_url="https://localhost:9200",
# http_auth=("admin", "admin"),
# use_ssl = False,
# verify_certs = False,
# ssl_assert_hostname = False,
# ssl_show_warn = False,
# )
query = "总统对 Ketanji Brown Jackson 说了什么"
docs = docsearch.similarity_search(query, k=10)
print(docs[0].page_content)
docsearch = OpenSearchVectorSearch.from_documents(
docs,
embeddings,
opensearch_url="http://localhost:9200",
engine="faiss",
space_type="innerproduct",
ef_construction=256,
m=48,
)

query = "总统对 Ketanji Brown Jackson 说了什么"
docs = docsearch.similarity_search(query)
print(docs[0].page_content)

使用自定义参数的 similarity_search 使用 Script Scoring

docsearch = OpenSearchVectorSearch.from_documents(
docs, embeddings, opensearch_url="http://localhost:9200", is_appx_search=False
)

query = "总统对 Ketanji Brown Jackson 说了什么"
docs = docsearch.similarity_search(
"总统对 Ketanji Brown Jackson 说了什么",
k=1,
search_type="script_scoring",
)
print(docs[0].page_content)

使用自定义参数的 similarity_search 使用 Painless Scripting

docsearch = OpenSearchVectorSearch.from_documents(
docs, embeddings, opensearch_url="http://localhost:9200", is_appx_search=False
)
filter = {"bool": {"filter": {"term": {"text": "走私"}}}}
query = "总统对 Ketanji Brown Jackson 说了什么"
docs = docsearch.similarity_search(
"总统对 Ketanji Brown Jackson 说了什么",
search_type="painless_scripting",
space_type="cosineSimilarity",
pre_filter=filter,
)
print(docs[0].page_content)

最大边际相关搜索 (MMR)

如果您想查找一些相似的文档,但又希望获得多样化的结果,可以考虑使用 MMR 方法。最大边际相关性优化了与查询的相似性和所选文档之间的多样性。

query = "总统对 Ketanji Brown Jackson 说了什么"
docs = docsearch.max_marginal_relevance_search(query, k=2, fetch_k=10, lambda_param=0.5)

使用现有的 OpenSearch 实例

也可以使用已经存在的具有向量的文档的 OpenSearch 实例。

# 这只是一个示例,您需要更改这些值以指向另一个 opensearch 实例
docsearch = OpenSearchVectorSearch(
index_name="index-*",
embedding_function=embeddings,
opensearch_url="http://localhost:9200",
)

# 您可以指定自定义字段名称,以匹配您用于存储嵌入、文档文本值和元数据的字段
docs = docsearch.similarity_search(
"谁在问今天午餐吃什么?",
search_type="script_scoring",
space_type="cosinesimil",
vector_field="message_embedding",
text_field="message",
metadata_field="message_metadata",
)

使用 AOSS (Amazon OpenSearch Service Serverless)

# 这只是一个示例,展示如何使用 AOSS、faiss 引擎和 efficient_filter,您需要设置正确的值。

service = 'aoss' # 必须将服务设置为 'aoss'
region = 'us-east-2'
credentials = boto3.Session(aws_access_key_id='xxxxxx',aws_secret_access_key='xxxxx').get_credentials()
awsauth = AWS4Auth('xxxxx', 'xxxxxx', region,service, session_token=credentials.token)

docsearch = OpenSearchVectorSearch.from_documents(
docs,
embeddings,
opensearch_url="host url",
http_auth=awsauth,
timeout = 300,
use_ssl = True,
verify_certs = True,
connection_class = RequestsHttpConnection,
index_name="test-index-using-aoss",
engine="faiss",
)

docs = docsearch.similarity_search(
"特征选择是什么",
efficient_filter=filter,
k=200,
)

使用 AOS (Amazon OpenSearch Service)

# 这只是一个示例,展示如何使用 AOS,您需要设置正确的值。

service = 'es' # 必须将服务设置为 'es'
region = 'us-east-2'
credentials = boto3.Session(aws_access_key_id='xxxxxx',aws_secret_access_key='xxxxx').get_credentials()
awsauth = AWS4Auth('xxxxx', 'xxxxxx', region,service, session_token=credentials.token)

docsearch = OpenSearchVectorSearch.from_documents(
docs,
embeddings,
opensearch_url="host url",
http_auth=awsauth,
timeout = 300,
use_ssl = True,
verify_certs = True,
connection_class = RequestsHttpConnection,
index_name="test-index",
)

docs = docsearch.similarity_search(
"特征选择是什么",
k=200,
)