Spaces:
Sleeping
Sleeping
import json | |
import logging | |
import time | |
from pathlib import Path | |
from elasticsearch import Elasticsearch | |
from tqdm import tqdm | |
def create_index_elastic_group( | |
path: str, | |
logger: logging.Logger | None = None, | |
): | |
if logger is None: | |
logger = logging.getLogger(__name__) | |
# Подключение к Elasticsearch | |
es = Elasticsearch(hosts='localhost:9200') | |
INDEX_NAME = 'group_search_elastic_nn' | |
# Удаление старого индекса, если он существует | |
if es.indices.exists(index=INDEX_NAME): | |
es.indices.delete(index=INDEX_NAME) | |
mapping = { | |
"mappings": { | |
"properties": { | |
"group_name_nn": {"type": "text", "analyzer": "standard"}, | |
"group_composition_nn": { | |
"type": "nested", | |
"properties": { | |
"person_name_nn": {"type": "text", "analyzer": "standard"}, | |
"position_in_group_nn": { | |
"type": "text", | |
"analyzer": "standard", | |
}, | |
}, | |
}, | |
} | |
} | |
} | |
# Создание индекса с указанным маппингом | |
es.indices.create(index=INDEX_NAME, body=mapping) | |
for ind, path in tqdm(enumerate(Path(path).iterdir())): | |
# Открываем файл и читаем его содержимое | |
with open(path, 'r', encoding='utf-8') as file: | |
data = json.load(file) | |
# Индексирование документа в Elasticsearch | |
es.index(index=INDEX_NAME, id=ind + 1, body=data) | |
# Подсчет количества документов в индексе | |
count_response = es.count(index=INDEX_NAME) | |
logger.info( | |
f"{ind}, Total documents in '{INDEX_NAME}': {count_response['count']}" | |
) | |
time.sleep(0.5) | |
if es.indices.exists(index=INDEX_NAME): | |
logger.info(f"Index '{INDEX_NAME}' exists.") | |
# Подсчет количества документов в индексе | |
count_response = es.count(index=INDEX_NAME) | |
logger.info(f"Total documents in '{INDEX_NAME}': {count_response['count']}") | |
query = "Какие действия являются первоочередными в момент обнаружения происшествия?" | |
# Поиск документов, где поле "person_full_name" содержит определенное значение "Александров Д.В." | |
# query_ = { | |
# "query": { | |
# "function_score": { | |
# "query": { | |
# "multi_match": { | |
# "query": f"{query}", | |
# "fields": ["group_name"], | |
# "fuzziness": "AUTO", | |
# "analyzer": "standard" | |
# } | |
# }, | |
# "functions": [ | |
# { | |
# "filter": { | |
# "multi_match": { | |
# "query": "персонального состава Персональный состав Комитета ПАО ГМК Норильский никель Рабочей группы", | |
# "fields": ["group_name"], | |
# "operator": "or" | |
# } | |
# }, | |
# "weight": 0.9 #// Понижает вес документов с этими словами | |
# } | |
# ], | |
# "boost_mode": "multiply" # // Умножает вес документов с фильтром на указанный коэффициент | |
# } | |
# } | |
# } | |
query_ = { | |
"query": { | |
"bool": { | |
"should": [ | |
{ | |
"multi_match": { | |
"query": f"{query}", | |
"fields": ["group_name"], | |
"fuzziness": "AUTO", | |
"analyzer": "standard", | |
} | |
}, | |
{ | |
"multi_match": { | |
"query": "персонального состава Персональный состав Комитета ПАО ГМК Норильский никель Рабочей группы", | |
"fields": ["group_name"], | |
"operator": "or", | |
"boost": 0.1, | |
} | |
}, | |
] | |
} | |
} | |
} | |
# Выполнение поиска в Elasticsearch | |
response = es.search(index=INDEX_NAME, body=query_, size=2) | |
logger.info(f"Number of hits: {response['hits']['total']['value']}") | |
# Вывод результата поиска | |
for hit in response['hits']['hits']: | |
logger.info(hit['_source']) | |
if __name__ == '__main__': | |
path = '/mnt/ntr_work/project/nmd800/data/group_card' | |
create_index_elastic_group(path) | |