这里写自定义目录标题
在腾讯云上申请es集群
购买方式: link
买好之后,在控制台上你就可以看到这个
然后点击创建好的es集群,然后在这里配置一下访问的白名单
用python 连接es,并导入数据
# 1. 建立 Elasticsearch 连接
def connect_elasticsearch():
# Elasticsearch 连接配置
es = Elasticsearch(
hosts=["https://es-h1ruad8u.public.tencentelasticsearch.com:9200"],
# 填入用户名和密码
basic_auth=('username', 'passwd'),
ca_certs="server-certificates.pem",
client_cert="client-certificates.pem", # 如果需要
client_key="client-certificates.key", # 如果需要
verify_certs=True, # 如果是自签名证书,可能需要设置为 False
request_timeout=30
)
# 检查连接是否成功
if es.ping():
print("成功连接到 Elasticsearch")
else:
print("连接失败")
return es
#使用向量模型
def load_model():
# 指定本地保存路径
model_path = "./models/all-MiniLM-L6-v2"
# 检查模型是否已经存在,如果不存在则下载并保存
if not os.path.exists(model_path):
print("模型不存在,正在下载...")
model = SentenceTransformer('all-MiniLM-L6-v2')
# 保存到本地
model.save(model_path)
print(f"模型已下载并保存到 {model_path}")
else:
print("模型已存在,直接从本地加载...")
# 直接从本地加载模型
model = SentenceTransformer(model_path)
return model
# 创建索引
def create_index(es_client, index_name="embeddings_demo"):
# 定义 mapping,设置 embedding 字段为 dense_vector 类型
mapping = {
"mappings": {
"properties": {
"embedding": {
"type": "dense_vector",
"dims": 384 # 替换为你的 embedding 维度
},
"text": {
"type": "text"
}
}
}
}
# 创建索引(如果不存在)
if not es_client.indices.exists(index=index_name):
es_client.indices.create(index=index_name, body=mapping)
print(f"创建索引 {index_name}")
else:
print(f"索引 {index_name} 已存在")
#插入数据
def process_text_list(es_client, index_name, text_list, model):
for i, text in enumerate(text_list):
embedding = model.encode(text).tolist()
# 使用递增的 doc_id
doc_id = str(i + 1)
# 导入数据
result = import_embedding(
es_client,
index_name=index_name,
doc_id=doc_id,
text=text,
embedding=embedding
)
print(f"导入结果 (doc_id={doc_id}): {result}")
连接es,并进行文本检索
def check_cosine_similarity(es_client, index_name, embedding, threshold=0.9):
query = {
"query": {
"script_score": {
"query": {"match_all": {}},
"script": {
"source": "cosineSimilarity(params.query_vector, 'embedding') + 1.0",
"params": {"query_vector": embedding}
}
}
},
"min_score": threshold + 1.0,
"size": 1 # 这个可以调整
}
response = es_client.search(index=index_name, body=query)
hits = response["hits"]["hits"]
if len(hits) > 0:
print(f"找到相似文本: {hits[0]['_source']['text']}, 相似度: {hits[0]['_score'] - 1.0}")
return len(hits) > 0