Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Сервіс пошуку реалізований у вигляді API та надає функціональність для обробки пошукових запитів.

Він підтримує параметри фільтрації, сортування та пагінації для ефективного отримання результатів.

Postman колекція ТУТ

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

Запити не вимагать авторизації

Доступні фільтри:

bySellingMethod

Дозволяє шукати обʼєкти процедур по "Напрямку роботи".

Доступні Напрямки роботи ТУТ (шукай колонку Назва процедури в ЦБД (sellingMethod))

Приклад запиту:

Code Block
curl --location '

...

https://procedure

...

.prozorro.sale/api/

...

Software requirements

  • python3.9
  • Elasticsearch
  • aiohttp

System requirements

  • Make
  • Docker
  • docker-compose

Usage

Building an image

Code Block
languagebash
make docker-build

Run

Code Block
languagebash
make run

Remove running services

Code Block
languagebash
make remove-compose

Running integration tests

Code Block
languagebash
make test-integration

Build sphinx docs based on the docstring description.

Code Block
languagebash
make build-docs

Build sphinx docs based on the docstring description.

Code Block
languagebash
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

...

Code Block
languagebash
python3 -m prozorro_sale.create_indexes -u localhost -i procedures

...

  • main index for procedures (name: procedures-<VERSION>, alias: procedures)
  • timestamp index for sync (name: procedures_ts)

CLI script for ops

For usage

Code Block
languagebash
 ➜ 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

Code Block
languagebash
 ➜ 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

При любом релизе происходит следующий порядок действий:

  1. Выполняються k8s (pre-upgrade) джобы по созданию темплейтов для индексов. Поды джоб в своих названиях имеют search-create-index-action Для каждого типа обьекта, создаеться отдельный темплейт с матчингом по имени (action, lease, procedures, ...). Эластик использует эти шаблоны, для дальнейшего автоматического построения индексации, разделения процедур по различным индексам, выделение полей для полнотекстового поиска и ... Порядок выполнения действий в джобе следующий:

    1. Проверить сушествование темплейта в ElasticSearch

      • При наличии, проверить соответствия версии темплейта из релиза и тот который в ElasticSearch
        • Если версии отличаються, удалить все индексы связаные с этим темплейтом
        • Если версии одинаковые, нечего не делать
    2. Обносить/Создать темплейт

    !Этот набор действий должен всегда предшествовать любой операции по добавлению новых данных в эластик. Если не будет правильного шаблона, эластик не сможет правильно построить индексы и search-api не вернет не какого результата🚀️

  1. Запускаеться сервис k8s Search Api. Поды в своих названиях имеют *search-api
  1. Запускаються поды реалтайм синхронизации всех новых данных получаемых из Mirror Services. Поды в своих названиях имеют search-mirror-client-action Из ElasticSearch он получает последнию временную отметку засинхронизированных данных и запрашивает у Mirror Services данные с этого момента. Порядок выполнения действий в поде следующий:
    • Получить временную метку последних засинхронезированых документов из ElasticSearch:
      • При наличии временной метки, запросить у Mirror Services данные начиная с неё и отправить их в ElasticSearch
      • При отсутствии временной метки:
        • Запросить у Mirror Services все данные и отправить их в ElasticSearch
        • Дождаться от мирор сервиса ответа об окончании синхронизации
        • Завершить работу и перезапуститься средствами k8s с выполнением операций с начала текушей последовательности

...

search/procedures' \
--header 'Content-Type: application/json' \
--data '{
    "page": 1,
    "limit": 100,
    "filters": [
        {
            "field": "sellingMethod",
            "operator": "in",
            "value": [
                "commercialPropertyLease-english",
                "commercialPropertyLease-dutch"
            ]
        }
    ]
}'

byDateModified

Дозволяє шукати обʼєкти процедур по даті останньої зміни обʼєкта ЦБД

Приклад запиту:

Code Block
curl --location 'https://procedure.prozorro.sale/api/search/procedures' \
--header 'Content-Type: application/json' \
--data '{
    "page": 1,
    "limit": 100,
    "filters": [
        {
            "field": "dateModified",
            "operator": "gt",
            "value": "2025-05-14T00:00:47.00Z"
        }
    ],
    "sort": [
        {
            "field": "datePublished",
            "direction": "desc"
        }
    ]
}'

...