op-fast-wikidata-search

Эта утилита работает с открытыми данными по Санкт-Петербургу в формате csv-таблиц, размещенными на сайте http://data.gov.spb.ru/. Она анализирует файлы с музеями и достопримечательностями.

Компиляция утилиты осуществлется с помощью подключения в командной строке директории, которая содержит исходный код и выполнения команды make. Дальнейший запуск осуществляется командой: ./opendata_search.out <ключи>. Формат ключа -key, далее через пробел передается значение ключа, например -geosearch 30.624,59.895,65. Поддерживаемые ключи: -file, -search, -geosearch, -limit, -complexsearch, -complexgeosearch.

Файлы для поиска передаются в утилиту с помощью ключа -file: ./opendata_search.out -file test_data.csv Если файл не задан явно, поиск осуществляется в файлах по умолчанию (./data/data-museums.csv и ./data/data-sights.csv). Сначала загружается файл с музеями, потом - с достопримечательностями.

Утилита имеет искать файлы по фрагменту названия, описания или исторической справки. Для использования этой функции вызовите утилиту с ключом -search <фрагмент>. Например, следующий запуск: ./opendata_search.out -search памятник вернет все объекты, содержащие слово "памятник" в названии, описании или исторической справке. Если в поисковом запросе содержится несколько слов, необходимо заключить запрос в двойные кавычки, например -search "Аничков дворец".

Также утилита умеет искать объекты по заданным координатам и радиусу поиска, задаваемому в метрах. Следующая команда: ./opendata_search.out -geosearch 56.389,30.689,4000 вернет объекты, находящиеся в радиусе 4 километров от точки с координатами 56.389, 30.689 (в долях градусов), напечатав их название, адрес и расстояние от заданной точки. Обратите внимание, что разделителем является знак запятой, пробелы между координатами, радиусом не допускаются!

Утилита использует специальный ключ -limit для работы в режиме ограниченной памяти. Ключ limit ограничивает количество десериализованных объектов, которые могут одновременно хранится в оперативной памяти компьютера. Пример использования: ./opendata_search.out -limit 50 - количество хранящихся в памяти объектов не будет превышать 50 в любой момент исполнения.

В утилите присутствует ключ -complexsearch для специального режима поиска по полям объектов. В этом режиме перед выполнением поиска все культурные объекты преобразуются в несколько коллекций (по одной коллекции на каждое из полей для поиска - имя, адрес, описание и историческая справка): std::map<std::string, std::vector<CulturalObject *>>, где ключами являются все слова, содержащиеся в поле объекта (например, для строки "Невский пр-т, д.37" такими словами будут "Невский", "пр-т," и "д.37"), а значением - массив (вектор) указателей на объекты, которые содержат это слово в заданном поле. После такого преобразованияполученный поисковый запрос разбивается на слова по пробельному символу и осуществляется быстрый поиск по добавленным ключам. Пример вызова: ./opendata_search.out -complexsearch "Меншиковский дворец". Поиск в этом режиме не поддерживает ключ -limit, а также, если был получен поисковый запрос с ключом -search, то он будет сброшен и перезаписан запросом -complexsearch.

Последний из ключей, распознаваемых утилитой - -complexgeosearch. Формат вызова и результат совпадает с вызовом -search, но утилита перед поиском разбивает город на квадраты с размером стороны 1000 метров, и далее получает список квадратов, граничащих с переданной точкой, и осуществляет поиск только в них. Обратите внимание, что в этом режиме карта города ограничена территорией Санкт-Петербурга, и поиск за его пределами (например, в Ленинградской области) в общем случае не будет осуществляться.

Утилита поддерживает комбинации ключей (-file, -search и -limit); (-file, -geosearch и -limit); (-complexsearch и -geosearch). При вызове -search и -geosearch одновременно будут последовательно найдены сначала объекты, поля которых совпадают с полученным объектом, а затем - будут найдены объекты по координатам. При этом, если был использован также ключ -limit , результаты будут выводится на печать последовательно и порционно: сначала поиск по полям N объектов, затем поиск по координатам N объектов, и так далее до конца файла.

Утилита начинает свою работу сразу после вызова ее в комнадной строке, найденные объекты распечатываются в стандартный консольный вывод непосредственно после обнаружения совпадений. Во время чтения файла, а также преобразования файлов в структуру вектора карт в случае вызова утилиты с ключом -complexsearch в консоли отображается простой прогресс-бар, показывающий прогресс в процентах от количества требуемых объектов, которые нужно считать или преобразовать. Во время исполнения программы результаты выводятся на печать незамедлительно в случае нахождения объектов, поэтому прогресс-бар на этом этапе не предусмотрен.