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)
|
||
|