81 lines
2.8 KiB
Python
81 lines
2.8 KiB
Python
|
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)
|
|||
|
|