Bakalarska_praca/Backend/index-server-es.py
2024-11-11 10:56:44 +01:00

81 lines
2.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from elasticsearch import Elasticsearch
from langchain.embeddings import HuggingFaceEmbeddings
from elasticsearch.helpers import bulk
import json
# Настройка подключения к Elasticsearch с аутентификацией и HTTPS
es = Elasticsearch(
[{'host': 'localhost', 'port': 9200, 'scheme': 'https'}],
http_auth=('elastic', 'S7DoO3ma=G=9USBPbqq3'), # замените на ваш пароль
verify_certs=False # Отключить проверку SSL-сертификата, если используется самоподписанный сертификат
)
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")
def create_index():
# Определяем маппинг для индекса
mapping = {
"mappings": {
"properties": {
"text": {
"type": "text",
"analyzer": "standard"
},
"vector": {
"type": "dense_vector",
"dims": 384 # Размерность векторного представления
},
"full_data": {
"type": "object",
"enabled": False # Отключаем индексацию вложенных данных
}
}
}
}
es.indices.create(index='drug_docs', body=mapping, ignore=400)
def load_drug_data(json_path):
with open(json_path, 'r', encoding='utf-8') as f:
data = json.load(f)
return data
def index_documents(data):
actions = []
total_docs = len(data)
for i, item in enumerate(data, start=1):
doc_text = f"{item['link']} {item.get('pribalovy_letak', '')} {item.get('spc', '')}"
vector = embeddings.embed_query(doc_text)
action = {
"_index": "drug_docs",
"_id": i,
"_source": {
'text': doc_text,
'vector': vector,
'full_data': item
}
}
actions.append(action)
# Отображение прогресса
print(f"Индексируется документ {i}/{total_docs}", end='\r')
# Опционально: индексируем пакетами по N документов
if i % 100 == 0 or i == total_docs:
bulk(es, actions)
actions = []
# Если остались неиндексированные документы
if actions:
bulk(es, actions)
print("\nИндексирование завершено.")
if __name__ == "__main__":
create_index()
data_path = "/home/poiasnik/esDB/cleaned_general_info_additional.json"
drug_data = load_drug_data(data_path)
index_documents(drug_data)