{"id":22454428,"url":"https://github.com/gaganovalexander/cdi-project","last_synced_at":"2026-04-04T22:32:21.535Z","repository":{"id":261851902,"uuid":"885526486","full_name":"GaganovAlexander/CDI-project","owner":"GaganovAlexander","description":"Проект поисковика по pdf документам  для ЦДИ РЖД","archived":false,"fork":false,"pushed_at":"2024-12-17T20:37:49.000Z","size":53,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-27T13:15:54.616Z","etag":null,"topics":["docker","docker-compose","elasticsearch","pdf-converter","python","quart","redis"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/GaganovAlexander.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-11-08T18:57:40.000Z","updated_at":"2024-12-17T20:37:53.000Z","dependencies_parsed_at":"2025-02-01T17:39:15.778Z","dependency_job_id":null,"html_url":"https://github.com/GaganovAlexander/CDI-project","commit_stats":null,"previous_names":["gaganovalexander/cdi-project"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/GaganovAlexander/CDI-project","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GaganovAlexander%2FCDI-project","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GaganovAlexander%2FCDI-project/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GaganovAlexander%2FCDI-project/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GaganovAlexander%2FCDI-project/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GaganovAlexander","download_url":"https://codeload.github.com/GaganovAlexander/CDI-project/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GaganovAlexander%2FCDI-project/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263984989,"owners_count":23539769,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","docker-compose","elasticsearch","pdf-converter","python","quart","redis"],"created_at":"2024-12-06T07:07:37.773Z","updated_at":"2025-12-30T22:15:12.366Z","avatar_url":"https://github.com/GaganovAlexander.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CDI Project - текстовый помошник для построения стратегия развития ЦДИ до 2030 года\n\n#### Описание\nЭтот проект предназначен для помощи в разработки стратегии развития Центра Дигитализации и Инноваций (ЦДИ) до 2030 года. В рамках проекта происходит сбор, обработка и анализ нормативных документов, которые будут использованы для формирования рекомендаций и планов развития.\n\n### Особенности проекта\n- Автоматизация обработки нормативной документации\n- Конвертация PDF документов в структурированный формат JSON\n- Использование Elasticsearch для индексации и поиска по тексту документов\n- Поддержка запросов на естественном языке для удобного доступа к информации\n- WEB-API для взаимодействия с пользователем\n\n### Текущие результаты\nПроект находится в стадии разработки. На данном этапе:\n- Обеспечена начальная обработка и конвертация документов\n- Добавлен препроцессинг текстов в виде исправления орфаграфии и лематизации\n- Настроены базовые индексационные процессы для Elasticsearch\n- Начата работа над интеграцией поиска с использованием естественного языка\n- Создан веб интерфейс (API) для взаимодействия с пользователем или веб-приложением\n- Упрощён деплой проекта за счёт использования Docker и Docker Compose\n- Добавлена проверка на наличие файла, чтобы предотвратить повторные загрузки одних и тех же документов\n- Приложение полностью написанно асинхронно\n- Настроена оптимизация потока запросов на поиск с помощью Redis\n\n### Приоритетные цели\n- Добавить удаление стоп-слов и пунктуации в препроцессинг\n\n### Дополнительные цели\n- Оптимизировать и улучшить качество поиска по документам\n\n## Хранение файлов\nЗагруженные PDF файлы сохраняются в папке `pdfs`. Лимит размера файла — 20 МБ.\n\n## Фоновые процессы\nРазбор PDF и индексация в Elasticsearch выполняются в фоновом режиме с использованием потоков. Для общения между потоками используются записи в Redis.\n\n\n# Установка приложения\nСледуйте этим шагам для установки и запуска приложения.\n\n## 1. Клонирование репозитория и переход в созданную папку:\n```bash\ngit clone https://github.com/GaganovAlexander/CDI-project \u0026\u0026 cd CDI-project\n```\n\n## 2. Запуск скрипта настройки\nДля создания `.env` файла, необходимого для корректной работы приложения, запустите скрипт `setup.sh`. Это можно сделать с помощью следующей команды:\n```bash\nsource ./setup.sh\n```\n\n## 3. Запуск приложения с использованием Docker Compose\nПосле того как .env файл будет создан, вы можете запустить приложение с помощью Docker Compose.\n\nСоберите образы:\n```bash\ndocker compose build\n```\nЗапустите контейнеры:\n```bash\ndocker compose up -d\n```\nЧтобы проверить статус контейнеров, используйте:\n```bash\ndocker compose ps\n```\nЕсли вам нужно остановить контейнеры:\n```bash\ndocker compose down\n```\n\n## Настройка Nginx\nДобавьте в Nginx блок(пример без SSL):\n```nginx\nserver {\n  listen 80;\n  server_name \u003cВАШ ДОМЕН ИЛИ ip-АДРЕСС\u003e;\n\n  client_max_body_size 20M; \n\n  location / {\n    proxy_pass http://127.0.0.1:\u003cПОРТ, КОТОРЫЙ ВЫ УКАЗАЛИ КАК APP_PORT ВО ВРЕМЯ КОНФИГУРАЦИИ setup.sh\u003e;\n  }\n\n  location /pdfs {\n    root \u003cПОЛНЫЙ ПУТЬ ДО ПАПКИ ПРОЕКТА (ЕСЛИ НАЗВАНИЕ НЕ МЕНЯЛИ, КОНЕЧНАЯ ПАПКА - CDI-project)\u003e;\n  }\n}\n```\nНе забудьте перезапустить Nginx:\n```bash\nsudo service nginx reload\n```\n\n# Документация к API для обработки PDF\nЭтот API предоставляет конечные точки для загрузки, обработки и поиска PDF документов. Он обрабатывает загруженные PDF, сохраняет их содержимое в Elasticsearch и позволяет пользователям искать по ним с использованием естественного языка.\n\n## Конечные точки\n### 1. Загрузка PDF\n**POST /upload**\n\nЭта конечная точка позволяет загружать PDF файл для обработки. Вы можете либо загрузить файл напрямую, либо предоставить URL на PDF файл.\n\n#### Тело запроса (Form Data)\n- **file**: PDF файл для загрузки (необязательно при наличии file_url).\n- **file_url**: URL PDF файла для загрузки (необязательно при наличии file).\n\n#### Ответ\n- **200 OK**:\n\n  Если файл успешно загружен и обработка началась.\n  ```json\n  {\n    \"message\": \"File uploaded successfully, processing started\",\n    \"task_id\": 1\n  }\n  ```\n- **400 Bad Request**: \n\n  Если нет сразу обоих полей file и file_url\n  ```json\n  {\n    \"error\": \"No file or file URL provided\"\n  }\n  ```\n  Если есть поле file, но самого файла нет\n  ```json\n  {\n    \"error\": \"No selected file\"\n  }\n  ```\n  Если выбран файл не в формате .pdf\n  ```json\n  {\n    \"error\": \"Invalid file format, only PDF allowed\"\n  }\n  ```\n- **409 Conflict**\n  ```json\n  {\n    \"error\": \"File has already been uploaded\"\n  }\n  ```\n\n### 2. Получение прогресса обработки\n**GET /progress/\u003ctask_id\u003e**\n\nЭта конечная точка позволяет проверить прогресс выполнения конкретной задачи. Возвращает текущий прогресс разбора PDF и индексации документа в Elasticsearch.\n\n#### Параметры запроса\n- **task_id**: Уникальный идентификатор задачи, для которой нужно получить прогресс.\n\n#### Ответ\n- **200 OK**: Если задача существует и обрабатывается или уже закончена.\n  ```json\n  {\n    \"pdf_parsing_progress\": 50,\n    \"adding_doc_to_elastic_progress\": 25\n  }\n  ```\n- **404 Not Found**: Если задача не существует или не началась.\n  ```json\n  {\n    \"error\": \"Task not found or not started yet\"\n  }\n  ```\n\n### 3. Поиск по запросу\n**POST /search**\n\nЭта конечная точка позволяет искать документы, сохраненные в Elasticsearch, по запросу пользователя.\n\n#### Запрос\n- **query**: Поисковый запрос.\n\n#### Тело запроса (JSON)\n```json\n{\n  \"query\": \"поисковый запрос\"\n}\n```\n\n#### Ответ\n- **200 OK**: Если запрос успешно обработан.\n  ```json\n  {\n    \"results\": [\n      {\n            \"bbox\": [\n                70.94400024414062,\n                570.1958618164062,\n                527.9199829101562,\n                678.9252319335938\n            ],\n            \"document_name\": \"файл.pdf\",\n            \"page_number\": 1,\n            \"paragraph_number\": 10,\n            \"score\": 2.5717645,\n            \"text\": \"текс параграфа\"\n        },\n      ...\n    ]\n  }\n  ```\n- **400 Bad Request**: Если запрос не был предоставлен.\n  ```json\n  {\n    \"error\": \"No query provided\"\n  }\n  ```\n\n### 4. Путь к pdf файлам на сервере\n**GET /pdfs/\u003cимя файла: str\u003e**\n\nЭта конечная точка позволит получить pdf файл с сервера, чтобы после отобразить его пользователю\n\n#### Параметры запроса\n- **\u003cимя файла\u003e** - такое же как в поле document_name в ответе на **/search**\n\n#### Ответ\n- **200, .pdf файл**: если такой файл есть\n- **404**: если такого файла нет\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgaganovalexander%2Fcdi-project","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgaganovalexander%2Fcdi-project","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgaganovalexander%2Fcdi-project/lists"}