Механизм Text Search в рамках Google Maps JavaScript API используется для поиска географических объектов по произвольному текстовому запросу. В отличие от структурированных запросов (категории, типы мест, координатные фильтры), текстовый поиск анализирует строку запроса как естественный язык и сопоставляет её с базой мест, адресов и организаций.
В основе работы лежит сервис Places Library платформы Google Maps Platform, который объединяет данные о миллионах объектов: ресторанах, отелях, достопримечательностях, учреждениях и географических точках.
Text Search применяется в сценариях, где пользователь вводит свободную форму запроса: «кафе рядом», «музей современного искусства», «аптека открыта сейчас», «hotel in Berlin near center».
Text Search работает поверх Places Service и взаимодействует с серверной инфраструктурой Google Maps Platform. Основные этапы обработки запроса:
Результат представляет собой массив объектов PlaceResult, содержащих метаданные о найденных местах.
Text Search недоступен напрямую в базовом объекте карты и требует подключения библиотеки places.
<script
src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=places">
</script>
После загрузки становится доступен конструктор
google.maps.places.PlacesService.
const map = new google.maps.Map(document.getElementById("map"), {
center: { lat: 51.5074, lng: -0.1278 },
zoom: 13,
});
const service = new google.maps.places.PlacesService(map);
const request = {
query: "coffee shop",
fields: ["name", "geometry", "formatted_address", "rating"]
};
service.textSearch(request, (results, status) => {
if (status === google.maps.places.PlacesServiceStatus.OK) {
results.forEach(place => {
console.log(place.name, place.geometry.location.toString());
});
}
});
Объект запроса может содержать следующие параметры:
Пример расширенного запроса:
const request = {
query: "restaurant sushi",
location: new google.maps.LatLng(34.0522, -118.2437),
radius: 3000,
type: "restaurant"
};
Результаты Text Search формируются на основе нескольких факторов:
Алгоритм не является строго детерминированным и может изменяться без изменения API-интерфейса.
Каждый результат поиска содержит структуру PlaceResult:
Пример обработки:
service.textSearch(request, (results) => {
results.forEach(place => {
const position = place.geometry.location;
new google.maps.Marker({
map,
position,
title: place.name,
});
});
});
Text Search подчиняется ограничениям платформы:
Пагинация осуществляется через next_page_token, который
становится активным с задержкой.
let service = new google.maps.places.PlacesService(map);
function search(pageToken = null) {
const request = {
query: "museum",
pageToken: pageToken
};
service.textSearch(request, (results, status, pagination) => {
if (status === google.maps.places.PlacesServiceStatus.OK) {
results.forEach(r => console.log(r.name));
if (pagination && pagination.hasNextPage) {
setTimeout(() => {
pagination.nextPage();
}, 2000);
}
}
});
}
Text Search поддерживает ограничение по типам объектов. Типы соответствуют классификации Places API:
restaurantcafelodgingmuseumstorehospitalПример:
const request = {
query: "pizza",
type: "restaurant"
};
Добавление location и radius существенно
изменяет результаты, превращая глобальный поиск в локальный.
const request = {
query: "bank",
location: new google.maps.LatLng(48.8566, 2.3522),
radius: 1000
};
Без указания координат система выполняет глобальный поиск, что снижает точность выдачи.
Каждый результат содержит place_id, который используется
для последующих запросов Place Details.
const detailRequest = {
placeId: place.place_id,
fields: ["name", "formatted_phone_number", "opening_hours"]
};
service.getDetails(detailRequest, (place, status) => {
console.log(place.name, place.formatted_phone_number);
});
Статусы ответа:
OK — успешный запросZERO_RESULTS — ничего не найденоOVER_QUERY_LIMIT — превышен лимитREQUEST_DENIED — ошибка ключа или доступаINVALID_REQUEST — некорректный запросОбработка статуса критична для стабильных приложений:
if (status !== google.maps.places.PlacesServiceStatus.OK) {
console.error("Ошибка поиска:", status);
return;
}
При работе с Text Search важно учитывать:
Оптимизация особенно важна при динамических интерфейсах (autocomplete-поиск, карты в реальном времени).
Text Search ориентирован на семантические запросы, тогда как Nearby Search — на географическую близость.
Text Search:
Nearby Search:
Оба метода доступны через Places Service и могут комбинироваться в гибридных интерфейсах.
Text Search используется в следующих архитектурных моделях:
Особенно эффективно сочетание Text Search с динамическим обновлением карты и кластеризацией маркеров.