Фильтрация результатов поиска

В экосистеме HERE Maps API поиск географических объектов строится вокруг набора параметров, которые позволяют не просто получать список совпадений по тексту, но и управлять релевантностью результатов, их географическим контекстом, типами объектов и степенью детализации. В основе лежит Search API, который возвращает структурированные данные: адреса, POI (points of interest), координаты и метаданные.

Фильтрация в этом контексте — это не отдельный этап, а комбинация ограничений запроса, параметров смещения (bias), жёстких ограничений (restriction) и постобработки результата.


Контекст поиска как основа фильтрации

Любой запрос в HERE Search API интерпретируется в контексте:

  • географического положения пользователя или центра поиска
  • текстовой строки (query)
  • типа искомого объекта
  • заданных ограничений области

Фильтрация начинается уже на уровне параметров запроса:

const platform = new H.service.Platform({
  apikey: 'YOUR_API_KEY'
});

const service = platform.getSearchService();

Географическая фильтрация: bias и restriction

Смещение результатов (bias)

Bias не отсекает данные, но изменяет их релевантность, «подталкивая» выдачу к определённой области.

Наиболее часто используется at:

service.discover({
  at: '49.8047,73.1094', // Караганда
  q: 'restaurant'
}, result => {
  console.log(result.items);
});

Особенности:

  • результаты вне зоны не исключаются
  • но значительно понижается их релевантность
  • используется для локального поиска

Жёсткое ограничение области (in)

Фильтрация становится строгой при использовании bounding box:

service.discover({
  in: '49.75,73.05;49.85,73.20',
  q: 'cafe'
}, result => {
  console.log(result.items);
});

Здесь результаты:

  • полностью ограничены прямоугольной областью
  • не могут выходить за её пределы
  • применяются для картографических сценариев и UI-виджетов

Комбинация bias + restriction

На практике используется гибрид:

  • at задаёт центр релевантности
  • in ограничивает область
service.discover({
  at: '49.8047,73.1094',
  in: '49.75,73.05;49.85,73.20',
  q: 'hotel'
}, console.log);

Фильтрация по типам объектов

Search API поддерживает строгую классификацию результатов через категории.

Категории (categories)

service.discover({
  at: '49.8047,73.1094',
  categories: '100-1000-0000' // restaurants
}, console.log);

Категории позволяют:

  • исключить нерелевантные POI
  • ускорить поиск
  • повысить точность выдачи

Примеры категорий:

  • 100-1000-0000 — рестораны
  • 500-5000-0000 — гостиницы
  • 400-4000-0000 — транспорт

Текстовая фильтрация (q)

Параметр q — основной фильтр по строке запроса.

service.discover({
  at: '49.8047,73.1094',
  q: 'sushi bar'
}, console.log);

Особенности:

  • поддерживает частичный ввод
  • учитывает синонимы
  • использует языковую нормализацию

Фильтрация по стране и административным уровням

В Search API доступна фильтрация по административным границам через дополнительные параметры или через bounding box.

Хотя прямой параметр country не всегда используется в Discover API, он реализуется через структурированные запросы и Geocode API.

Пример фильтрации через геокодинг:

service.geocode({
  q: 'Almaty',
  in: 'countryCode:KAZ'
}, console.log);

Это позволяет:

  • ограничить выдачу конкретной страной
  • устранить дубликаты городов с одинаковыми названиями
  • улучшить точность геокодирования

Фильтрация по расстоянию

Радиусная фильтрация используется для создания локальных сценариев поиска.

service.discover({
  at: '49.8047,73.1094',
  limit: 50,
  circle: '49.8047,73.1094;r=5000',
  q: 'ATM'
}, console.log);

Смысл:

  • результаты ограничиваются радиусом 5 км
  • используется для мобильных приложений
  • повышает релевантность локальных объектов

Ограничение количества результатов

Параметр limit управляет объёмом выдачи:

service.discover({
  at: '49.8047,73.1094',
  q: 'pharmacy',
  limit: 10
}, console.log);

Применение:

  • уменьшение нагрузки на UI
  • ускорение рендеринга
  • контроль API-ответов

Постфильтрация результатов

Несмотря на мощные серверные фильтры, часто используется клиентская обработка:

service.discover(params, result => {
  const filtered = result.items.filter(item => {
    return item.address.countryCode === 'KAZ' &&
           item.distance < 3000;
  });

  console.log(filtered);
});

Типичные критерии:

  • страна (countryCode)
  • расстояние (distance)
  • рейтинг или popularity (если доступно)
  • наличие категорий

Фильтрация по структуре данных POI

Каждый результат содержит структурированные поля:

  • title
  • position
  • address
  • category
  • distance

Пример использования фильтрации по категории:

result.items.filter(item =>
  item.categories?.some(c => c.id.startsWith('100'))
);

Это позволяет:

  • выделять рестораны, магазины и сервисы
  • строить кастомные слои на карте
  • группировать POI по типам

Исключение результатов (negative filtering)

В чистом Search API нет прямого оператора NOT, но исключение реализуется логикой клиента:

const excludedCategories = ['hospital', 'school'];

const filtered = result.items.filter(item => {
  return !item.categories.some(c =>
    excludedCategories.includes(c.name)
  );
});

Используется для:

  • удаления социальных объектов
  • построения коммерческих карт
  • кастомных интерфейсов поиска

Приоритетизация и сортировка результатов

Хотя фильтрация и сортировка тесно связаны, в HERE API сортировка часто управляется автоматически, но может корректироваться:

  • по расстоянию
  • по релевантности
  • по типу объекта

Клиентская сортировка:

const sorted = result.items.sort((a, b) =>
  a.distance - b.distance
);

Комбинированные сценарии фильтрации

Реальные приложения используют сразу несколько уровней:

service.discover({
  at: '49.8047,73.1094',
  in: '49.75,73.05;49.85,73.20',
  q: 'coffee',
  limit: 20
}, result => {
  const final = result.items
    .filter(i => i.distance < 2000)
    .filter(i => i.categories?.length > 0);

  console.log(final);
});

Такая схема объединяет:

  • географическое ограничение
  • текстовый поиск
  • ограничение выдачи
  • клиентскую постобработку

Фильтрация через Autocomplete API

В автодополнении также применяются фильтры:

service.autosuggest({
  at: '49.8047,73.1094',
  q: 'rest',
  limit: 5
}, console.log);

Дополнительные ограничения:

  • приоритет ближайших объектов
  • исключение нерелевантных категорий
  • усиление локального контекста

Влияние внутренних моделей релевантности

HERE Technologies использует внутреннюю модель ранжирования, которая учитывает:

  • популярность объекта
  • плотность POI в регионе
  • исторические данные запросов
  • соответствие тексту
  • географическую близость

Фильтрация в этом случае — это не только техническое ограничение, но и управление весами в ранжировании результатов.


Ошибки при фильтрации и их источники

Типичные проблемы:

  • слишком узкий bounding box → пустые результаты
  • отсутствие bias → нерелевантная выдача
  • чрезмерная клиентская фильтрация → потеря полезных данных
  • неправильные категории → пропущенные POI

Корректная стратегия всегда сочетает:

  • серверные фильтры (in, at, categories)
  • мягкое ранжирование
  • минимальную клиентскую очистку данных