Релевантность представляет собой степень соответствия результата поисковому запросу. В картографических приложениях этот показатель определяет, какие объекты, адреса, организации или географические точки будут показаны пользователю первыми.
В экосистеме HERE Maps API механизмы релевантности используются практически во всех сервисах поиска:
Корректное ранжирование результатов позволяет:
Поисковые сервисы HERE работают по многоступенчатой схеме обработки запроса.
Основные этапы:
Например, запрос:
Starbucks
может вернуть сотни тысяч объектов по всему миру. Система должна определить:
После этого результаты будут отсортированы по степени полезности.
В поисковых ответах HERE присутствует параметр релевантности.
Типичный результат:
{
"title": "Starbucks",
"id": "here:pds:place:123456",
"resultType": "place",
"distance": 350,
"position": {
"lat": 40.7128,
"lng": -74.0060
}
}
Хотя внутренние алгоритмы HERE не раскрываются полностью, система учитывает множество факторов:
Первый уровень ранжирования основан на анализе текста.
Рассмотрим запрос:
McDonald
Возможные результаты:
McDonald's
McDonald Avenue
McDonald Library
Наиболее вероятно, что пользователь ищет ресторан сети McDonald’s, поэтому такие объекты получают больший вес.
Полное совпадение обычно получает максимальный рейтинг.
Запрос:
Berlin
Результат:
Berlin
будет ранжирован выше, чем:
Berlin Street
New Berlin
Berlin Park
Поисковый механизм способен находить результаты даже при неполном вводе.
Пример:
Starb
Результаты:
Starbucks
Starbucks Coffee
Starbucks Reserve
Такая логика активно используется в Autosuggest API.
Система поддерживает поиск с опечатками.
Запрос:
Amsterdm
может вернуть:
Amsterdam
Несмотря на ошибку в написании, алгоритмы определяют наиболее вероятный вариант.
Местоположение пользователя является одним из важнейших факторов ранжирования.
Для определения контекста используются:
Пример:
const url =
'https://discover.search.hereapi.com/v1/discover' +
'?q=pizza' +
'&at=52.5200,13.4050' +
'&apiKey=YOUR_API_KEY';
Запрос выполняется относительно центра Берлина.
Результаты поблизости будут иметь более высокий рейтинг.
Параметр at задает центральную точку поиска.
const at = '48.8566,2.3522';
Запрос:
fetch(
`https://discover.search.hereapi.com/v1/discover?q=cafe&at=${at}&apiKey=${apiKey}`
)
Система будет считать Париж наиболее значимой областью поиска.
Без параметра at результаты могут оказаться менее
релевантными.
Для повышения качества выдачи полезно ограничивать пространство поиска.
const bbox =
'13.082,52.338,13.761,52.675';
Запрос:
fetch(
`https://discover.search.hereapi.com/v1/discover?q=hotel&in=bbox:${bbox}&apiKey=${apiKey}`
)
В этом случае результаты за пределами области исключаются.
const circle =
'circle:52.5200,13.4050;r=5000';
Запрос:
fetch(
`https://discover.search.hereapi.com/v1/discover?q=gas station&in=${circle}&apiKey=${apiKey}`
)
Результаты будут отбираться внутри радиуса 5 километров.
Это значительно повышает релевантность локального поиска.
Для большинства категорий объектов расстояние играет критическую роль.
Запрос:
fetch(
`https://discover.search.hereapi.com/v1/discover?q=pharmacy&at=52.52,13.40&apiKey=${apiKey}`
)
Возможный ответ:
[
{
"title": "Pharmacy A",
"distance": 120
},
{
"title": "Pharmacy B",
"distance": 450
},
{
"title": "Pharmacy C",
"distance": 1200
}
]
Чем ближе объект к указанной точке, тем выше вероятность его появления в начале списка.
Популярные объекты часто получают дополнительный вес.
Например:
Eiffel Tower
При поиске в Париже этот объект обычно оказывается выше менее известных достопримечательностей.
На ранжирование могут влиять:
Поиск может учитывать принадлежность объекта к определенной категории.
Запрос:
restaurant
вернет объекты категории ресторанов.
Пример использования категории:
fetch(
`https://discover.search.hereapi.com/v1/discover?q=restaurant&at=40.7128,-74.0060&apiKey=${apiKey}`
)
Система не станет ранжировать выше объекты, относящиеся к гостиницам или магазинам.
Autosuggest API использует собственный механизм ранжирования.
Пример запроса:
fetch(
`https://autosuggest.search.hereapi.com/v1/autosuggest?q=berl&at=52.52,13.40&apiKey=${apiKey}`
)
Ответ может содержать:
[
{
"title": "Berlin"
},
{
"title": "Berlin Central Station"
},
{
"title": "Berlin Brandenburg Airport"
}
]
Алгоритм оценивает:
HERE поддерживает локализацию поисковых запросов.
Пример:
fetch(
`https://discover.search.hereapi.com/v1/discover?q=hotel&lang=de-DE&at=52.52,13.40&apiKey=${apiKey}`
)
Параметр:
lang=de-DE
позволяет получать более релевантные результаты для немецкоязычных пользователей.
Поддерживаются десятки языков и региональных настроек.
При преобразовании адреса в координаты также используется система ранжирования.
Запрос:
fetch(
`https://geocode.search.hereapi.com/v1/geocode?q=Main Street 10&apiKey=${apiKey}`
)
Возможны несколько совпадений.
Система оценивает:
Фильтры позволяют исключать нерелевантные результаты еще до этапа отображения.
Пример:
fetch(
`https://discover.search.hereapi.com/v1/discover?q=hotel&in=countryCode:DEU&apiKey=${apiKey}`
)
Поиск будет ограничен Германией.
Дополнительные преимущества:
После получения ответа возможно дополнительное ранжирование на стороне клиента.
Пример сортировки по расстоянию:
results.sort((a, b) => a.distance - b.distance);
Сортировка по названию:
results.sort((a, b) =>
a.title.localeCompare(b.title)
);
Сортировка по нескольким критериям:
results.sort((a, b) => {
if (a.distance !== b.distance) {
return a.distance - b.distance;
}
return a.title.localeCompare(b.title);
});
В крупных приложениях часто используется комбинированная оценка.
Пример вычисления рейтинга:
function calculateScore(item) {
let score = 0;
score += item.popularity * 0.5;
score += (10000 - item.distance) * 0.3;
score += item.textMatch * 0.2;
return score;
}
Затем выполняется сортировка:
results.sort(
(a, b) =>
calculateScore(b) -
calculateScore(a)
);
Подобный подход позволяет учитывать бизнес-логику конкретного приложения.
Ответы Search API могут содержать различные типы сущностей:
place
street
houseNumber
locality
administrativeArea
pointOfInterest
Каждый тип может иметь собственный приоритет.
Пример:
const priority = {
pointOfInterest: 5,
place: 4,
locality: 3,
street: 2,
houseNumber: 1
};
Сортировка:
results.sort(
(a, b) =>
priority[b.resultType] -
priority[a.resultType]
);
Для повышения релевантности полезно классифицировать запросы до отправки в HERE.
Примеры:
| Запрос | Тип |
|---|---|
| Berlin | Город |
| Hotel Berlin | Категория + город |
| Brandenburg Gate | Достопримечательность |
| Alexanderplatz 1 | Адрес |
| Coffee near me | Поиск рядом |
На основании типа запроса можно выбирать подходящий сервис:
Это позволяет получать более точные результаты.
При разработке поисковых систем обычно отслеживаются следующие показатели:
Доля релевантных результатов среди найденных.
Precision =
релевантные результаты /
все результаты
Доля найденных релевантных результатов среди всех существующих.
Recall =
найденные релевантные /
все релевантные
Показывает, насколько высоко располагается правильный результат.
MRR = 1 / позиция результата
Чем выше показатель, тем эффективнее работает система ранжирования.
&at=latitude,longitude
Это один из наиболее эффективных способов улучшения релевантности.
Использование:
bbox
circle
countryCode
существенно уменьшает количество нерелевантных объектов.
Автодополнение помогает пользователю формировать более точные запросы еще до выполнения основного поиска.
Особенно полезно для приложений доставки, логистики, туризма и навигации.
История выбора результатов позволяет строить собственные алгоритмы релевантности поверх возможностей HERE Search API.
Наиболее качественное ранжирование достигается при одновременном учете:
В результате поисковая подсистема на базе HERE Maps API способна предоставлять высокоточную выдачу, адаптированную к контексту пользователя, географическому положению и особенностям конкретной предметной области.