Search Procedure API Service
Service to search by procedures/registry public data
Description
Service sync procedures/registry/auctions data and provide search with elasticsearch.
Search provided on top of the public data only, as it synchronized from the public data source.
For the full-text search, there is `full_text_search` field. It`s a service field, not shown by public api.
Swagger documentation
Search endpoints listed - https://procedure-dev.prozorro.sale/api/doc/search, search fold.
Software requirements
- python3.9
- Elasticsearch
- aiohttp
System requirements
- Make
- Docker
- docker-compose
Usage
Building an image
make docker-build
Run
make run
Remove running services
make remove-compose
Running integration tests
make test-integration
Build sphinx docs based on the docstring description.
make build-docs
Build sphinx docs based on the docstring description.
make clean-docs
Elastic indexes description
There are multiple indexes built on service with standard naming patterns:
- Procedures (k8s_namespace)_procedures_(procedure_type).
- Example: ``prozorro_dev_procedures_basicsell``
- Registry:
- (k8s_namespace)_registry
- (k8s_namespace)_action
- (k8s_namespace)_lease
Create indexes for elastic
python3 -m prozorro_sale.create_indexes -u localhost -i procedures
This will create 2 indexes:
- main index for procedures (name: procedures-<VERSION>, alias: procedures)
- timestamp index for sync (name: procedures_ts)
CLI script for ops
For usage
➜ manage --help Usage: manage [OPTIONS] COMMAND [ARGS]... This is the Search interactive shell and a set of devops scripts for maintenance. Options: --help Show this message and exit. Commands: debug Shows the parsed manage file -V shows version indexes Manages elastic indexes init Initialize a manage shell in current directory $ manage init... shell Runs a Python shell with context
For work with Procedure documents
➜ manage indexes Usage: manage indexes [OPTIONS] COMMAND [ARGS]... With this command you can manage elastic indexes Options: --help Show this message and exit. Commands: delete-index Delete elastic index list-index Listing elastic indexes
Indexing WorkFlow
Search Indexing WorkFlow
Сервис Search працює на базі ElasticSearch та забезпечує:
- CBD API для роботи з ElasticSearch
- Генерацію темплейтів для побудови індексів
- Отримання інформації із Mirror Services CBD та надсилання інформації в ElasticSearch
- Реіндексацію даних.
Indexing WorkFlow
При любом релизе происходит следующий порядок действий:
Выполняються k8s (pre-upgrade) джобы по созданию темплейтов для индексов. Поды джоб в своих названиях имеют search-create-index-action Для каждого типа обьекта, создаеться отдельный темплейт с матчингом по имени (action, lease, procedures, ...). Эластик использует эти шаблоны, для дальнейшего автоматического построения индексации, разделения процедур по различным индексам, выделение полей для полнотекстового поиска и ... Порядок выполнения действий в джобе следующий:
Проверить сушествование темплейта в ElasticSearch
- При наличии, проверить соответствия версии темплейта из релиза и тот который в ElasticSearch
- Если версии отличаються, удалить все индексы связаные с этим темплейтом
- Если версии одинаковые, нечего не делать
- При наличии, проверить соответствия версии темплейта из релиза и тот который в ElasticSearch
Обносить/Создать темплейт
!Этот набор действий должен всегда предшествовать любой операции по добавлению новых данных в эластик. Если не будет правильного шаблона, эластик не сможет правильно построить индексы и search-api не вернет не какого результата🚀️
- Запускаеться сервис k8s Search Api. Поды в своих названиях имеют *search-api
- Запускаються поды реалтайм синхронизации всех новых данных получаемых из Mirror Services. Поды в своих названиях имеют search-mirror-client-action Из ElasticSearch он получает последнию временную отметку засинхронизированных данных и запрашивает у Mirror Services данные с этого момента. Порядок выполнения действий в поде следующий:
- Получить временную метку последних засинхронезированых документов из ElasticSearch:
- При наличии временной метки, запросить у Mirror Services данные начиная с неё и отправить их в ElasticSearch
- При отсутствии временной метки:
- Запросить у Mirror Services все данные и отправить их в ElasticSearch
- Дождаться от мирор сервиса ответа об окончании синхронизации
- Завершить работу и перезапуститься средствами k8s с выполнением операций с начала текушей последовательности
- Получить временную метку последних засинхронезированых документов из ElasticSearch:
- Запускаються джобы по реиндексации данных из Mirror Services. Поды в своих названиях имеют search-reindex-data После запуска, через 300 секунд, получают весь набор данных из Mirror Services и отправляют его в ElasticSearch. Это сделано для того чтобы после каждого релиза и миграций, в ElasticSearch всегда были актуальные данные. Порядок выполнения действий в джобе следующий:
- Подождать 300 секунд
- Запросить у Mirror Services все данные и отправить их в ElasticSearch
- Дождаться от мирор сервиса ответа об окончании синхронизации
- Завершить работу