Новая версия текстового поиска возвращает информацию о местах на основе введенной фразы, например "кафе в Москве", "обувные магазины в Санкт-Петербурге" или "улица Центральная, 123". Ответ содержит список мест, соответствующих текстовой строке с учетом указанного предпочтительного местоположения.
Помимо обязательных параметров, текстовый поиск (New) поддерживает уточнение запросов с помощью необязательных параметров для получения более точных результатов.
Новая версия текстового поиска похожа на новую версию поиска поблизости. Основное отличие между ними заключается в том, что в новой версии текстового поиска можно указать произвольную строку поиска, а в новой версии поиска поблизости нужно задать определенную область поиска.
Запросы текстового поиска
Запрос текстового поиска имеет следующий формат:
// Specify the list of fields to return. final List<Place.Field> placeFields = Arrays.asList(Place.Field.ID, Place.Field.DISPLAY_NAME); // Define latitude and longitude coordinates of the search area. LatLng southWest = new LatLng(37.38816277477739, -122.08813770258874); LatLng northEast = new LatLng(37.39580487866437, -122.07702325966572); // Use the builder to create a SearchByTextRequest object. final SearchByTextRequest searchByTextRequest = SearchByTextRequest.builder("Spicy Vegetarian Food", placeFields) .setMaxResultCount(10) .setLocationRestriction(RectangularBounds.newInstance(southWest, northEast)).build(); // Call PlacesClient.searchByText() to perform the search. // Define a response handler to process the returned List of Place objects. placesClient.searchByText(searchByTextRequest) .addOnSuccessListener(response -> { List<Place> places = response.getPlaces(); });
В этом примере вы:
В списке полей должны быть только
Place.Field.IDиPlace.Field.DISPLAY_NAME. Это означает, что объектыPlaceв ответе, представляющие каждое подходящее место, содержат только эти два поля.Используйте
SearchByTextRequest.Builder, чтобы создать объектSearchByTextRequest, определяющий поиск.Задайте строку текстового запроса "Острая вегетарианская еда".
Установите максимальное количество мест в результатах поиска равным 10. Значение по умолчанию и максимальное значение – 20.
Ограничивает область поиска прямоугольником, заданным координатами широты и долготы. Результаты за пределами этой области не возвращаются.
Добавьте
OnSuccessListenerи получите соответствующие места из объектаSearchByTextResponse.
Ответы на запросы в текстовом поиске
Класс SearchByTextResponse представляет ответ на поисковый запрос. Объект SearchByTextResponse содержит:
Список объектов
Place, представляющих все подходящие места. Каждому месту соответствует один объектPlace.Каждый объект
Placeсодержит только поля, определенные в списке полей, переданном в запросе.
Например, в запросе вы определили список полей следующим образом:
// Specify the list of fields to return. final List<Place.Field> placeFields = Arrays.asList(Place.Field.ID, Place.Field.DISPLAY_NAME);
Этот список полей означает, что каждый объект Place в ответе содержит только идентификатор места и название каждого подходящего места. Затем вы можете использовать методы Place.getId() и Place.getName(), чтобы получить доступ к этим полям в каждом объекте Place.
Другие примеры доступа к данным в объекте Place можно найти в разделе Как получить доступ к полям данных объекта Place.
Разбивка на страницы
Класс SearchByTextResponse текстового поиска предоставляет доступ к разбивке результатов поиска на страницы с помощью метода getPagination(), который возвращает объект Pagination.
Чтобы определить, доступны ли дополнительные страницы с результатами, используйте метод hasNextPage() объекта Pagination. Этот метод возвращает логическое значение (истина или ложь).
Если функция hasNextPage() возвращает значение true, вызовите метод fetchNextPage(), чтобы получить следующую страницу результатов.
В следующем примере показано, как проверить, доступна ли следующая страница, а затем загрузить ее.
Kotlin
val searchByTextRequest = searchByTextRequest("restaurants", Arrays.asList(Place.Field.NAME)) { maxResultCount = 10 } // using pagination object (Preferred) placesClient.searchByText(searchByTextRequest) .addOnSuccessListener {response: SearchByTextResponse -> val places = response.places val pagination = response.pagination if (pagination.hasNextPage()) { pagination.setPageSize(20) pagination.fetchNextPage() .addOnSuccessListener { nextPageResponse -> val nextPagePlaces = nextPageResponse.getPlaces() } .addOnFailureListener {// Handle error with given status code} } } .addOnFailureListener { // TODO: Handle error with given status code. exception -> { exception.printStackTrace(); } }
Java
SearchByTextRequest searchByTextRequest = SearchByTextRequest.builder("restaurants", Arrays.asList(Place.Field.NAME)).setMaxResultCount(10).build(); // using pagination object (Preferred) placesClient.searchByText(searchByTextRequest) .addOnSuccessListener((response) -> { List<Place> places = response.getPlaces(); Log.i(TAG, "Places result: " + places); Pagination pagination = response.getPagination(); if (pagination.hasNextPage()) { pagination.setPageSize(20); // change the page size from 10 to 20 pagination.fetchNextPage() .addOnSuccessListener((nextPageResponse) -> { List<Place> nextPagePlaces = nextPageResponse.getPlaces(); Log.i(TAG, "Next page places result: " + nextPagePlaces); }); } }) .addOnFailureListener((exception) -> { if (exception instanceof ApiException) { // Handle error with given status code } });
Обязательные параметры
Обязательные параметры для SearchByTextRequest:
-
Список полей
Укажите, какие поля данных нужно вернуть. Передайте список значений
Place.Field, указывающих, какие поля данных нужно вернуть. В ответе нет списка полей по умолчанию.Списки полей помогут вам не запрашивать ненужные данные и тем самым сократить время обработки и снизить расходы.
Укажите одно или несколько из следующих полей:
Следующие поля активируют код Text Search Essentials ID Only:
Place.Field.DISPLAY_NAME*
* Используйте вместоPlace.Field.NAME(поддержка прекращена в версии 4.0).
Place.Field.ID
Place.Field.RESOURCE_NAME*
* Содержит название ресурса места в форматеplaces/PLACE_ID.
Чтобы получить текстовое название места, используйтеDISPLAY_NAME.Полный список полей и связанных с ними кодов приведен в разделе Поля данных о местах (новая версия).
Следующие поля активируют код Text Search Pro:
Place.Field.ACCESSIBILITY_OPTIONS*
Используется вместоPlace.Field.WHEELCHAIR_ACCESSIBLE_ENTRANCE(поддержка прекращена).
Place.Field.ADDRESS_COMPONENTS
Place.Field.ADR_FORMAT_ADDRESS
Place.Field.BUSINESS_STATUS
Place.Field.FORMATTED_ADDRESS*
Используйте вместоPlace.Field.ADDRESS(поддержка прекращена).
Place.Field.GOOGLE_MAPS_URI
Place.Field.ICON_BACKGROUND_COLOR
Place.Field.ICON_MASK_URL*
Используйте вместоPlace.Field.ICON_URL(поддержка прекращена).
Place.Field.LOCATION*
Используйте вместоPlace.Field.LAT_LNG(поддержка прекращена).
Place.Field.PHOTO_METADATAS
Place.Field.PLUS_CODE
Place.Field.PRIMARY_TYPE
Place.Field.PRIMARY_TYPE_DISPLAY_NAME
Place.Field.SHORT_FORMATTED_ADDRESS
Place.Field.SUB_DESTINATIONS
Place.Field.TYPES
Place.Field.UTC_OFFSET
Place.Field.VIEWPORTПолный список полей и связанных с ними кодов приведен в разделе Поля данных о местах (новые).
Следующие поля активируют SKU текстового поиска Enterprise:
Place.Field.CURRENT_OPENING_HOURS
Place.Field.CURRENT_SECONDARY_OPENING_HOURS
Place.Field.INTERNATIONAL_PHONE_NUMBER*
* Используйте вместоPlace.Field.PHONE_NUMBER, который больше не поддерживается.
Place.Field.NATIONAL_PHONE_NUMBER
Place.Field.OPENING_HOURS
Place.Field.PRICE_LEVEL
Place.Field.RATING
Place.Field.SECONDARY_OPENING_HOURS
Place.Field.USER_RATING_COUNT*
* Используйте вместо устаревшего тегаPlace.Field.USER_RATINGS_TOTAL.
Place.Field.WEBSITE_URIПолный список полей и связанных с ними кодов приведен в разделе Поля данных о местах (новые).
Следующие поля активируют код Text Search Enterprise Plus:
Place.Field.ALLOWS_DOGS
Place.Field.CURBSIDE_PICKUP
Place.Field.DELIVERY
Place.Field.DINE_IN
Place.Field.EDITORIAL_SUMMARY
Place.Field.EV_CHARGE_OPTIONS
Place.Field.FUEL_OPTIONS
Place.Field.GOOD_FOR_CHILDREN
Place.Field.GOOD_FOR_GROUPS
Place.Field.GOOD_FOR_WATCHING_SPORTS
Place.Field.LIVE_MUSIC
Place.Field.MENU_FOR_CHILDREN
Place.Field.OUTDOOR_SEATING
Place.Field.PARKING_OPTIONS
Place.Field.PAYMENT_OPTIONS
Place.Field.RESERVABLE
Place.Field.RESTROOM
Place.Field.REVIEWS
Place.Field.SERVES_BEER
Place.Field.SERVES_BREAKFAST
Place.Field.SERVES_BRUNCH
Place.Field.SERVES_COCKTAILS
Place.Field.SERVES_COFFEE
Place.Field.SERVES_DESSERT
Place.Field.SERVES_DINNER
Place.Field.SERVES_LUNCH
Place.Field.SERVES_VEGETARIAN_FOOD
Place.Field.SERVES_WINE
Place.Field.TAKEOUTПолный список полей и связанных с ними кодов приведен в разделе Поля данных о местах (новая версия).
Чтобы задать параметр списка полей, вызовите метод
setPlaceFields()при создании объектаSearchByTextRequest. -
Текстовый запрос
Строка для текстового поиска, например "ресторан", "улица Центральная, 123" или "лучшие места в Санкт-Петербурге". На основе этой строки API возвращает список подходящих мест, упорядоченных по их предполагаемой релевантности.
Чтобы задать параметр текстового запроса, вызовите метод
setTextQuery()при создании объектаSearchByTextRequest.
Необязательные параметры
Используйте объект SearchByTextRequest, чтобы указать необязательные параметры запроса.
Включенный тип
В результаты поиска включаются только места указанного типа (см. таблицу А). Можно указать только один тип. Пример:
setIncludedType("bar")setIncludedType("pharmacy")
Чтобы задать параметр включенного типа, вызовите метод
setIncludedType()при создании объектаSearchByTextRequest.Предвзятость, связанная с местоположением
Указывает область поиска. Это местоположение используется в качестве предпочтения, то есть могут быть возвращены результаты, находящиеся рядом с указанным местоположением, в том числе за пределами заданной области.
Вы можете указать ограничение или смещение местоположения, но не оба параметра одновременно. Ограничение местоположения задает регион, в котором должны находиться результаты, а предпочтение местоположения – регион, в котором результаты, скорее всего, будут находиться или рядом с которым они будут расположены. При этом результаты могут быть и за пределами указанной области.
Укажите регион в виде прямоугольной области просмотра или круга.
Круг определяется центральной точкой и радиусом в метрах. Радиус должен быть в диапазоне от 0,0 до 50 000,0 включительно. Пример:
// Define latitude and longitude coordinates of the center of the search area. LatLng searchCenter = new LatLng(37.38816277477739, -122.08813770258874); // Use the builder to create a SearchByTextRequest object. // Set the radius of the search area to 500.0 meters. final SearchByTextRequest searchByTextRequest = SearchByTextRequest.builder("Spicy Vegetarian Food", placeFields) .setMaxResultCount(10) .setLocationBias(CircularBounds.newInstance(searchCenter, 500.0)).build();
Прямоугольник – это область просмотра с координатами широты и долготы, представленная двумя диагонально противоположными точками с минимальными и максимальными значениями. Нижняя точка обозначает юго-западный угол прямоугольника, а верхняя – северо-восточный.
Область просмотра считается замкнутым регионом, то есть включает в себя свои границы. Широта должна находиться в диапазоне от -90 до +90 градусов, а долгота – в диапазоне от -180 до +180 градусов.
- Если
low=high, то область просмотра состоит из одной точки. - Если
low.longitude>high.longitude, диапазон долготы инвертируется (область просмотра пересекает линию долготы 180 градусов). - Если
low.longitude= -180 градусов, аhigh.longitude= 180 градусов, область просмотра включает все долготы. - Если
low.longitude= 180 градусов, аhigh.longitude= -180 градусов, диапазон долготы пуст. - Если
low.latitude>high.latitude, диапазон широты пуст.
Необходимо указать оба значения, и представленная область не может быть пустой. Пустой видовой экран приводит к ошибке.
Пример прямоугольной области просмотра приведен в разделе Запросы текстового поиска.
Чтобы задать параметр предпочтительного местоположения, вызовите метод
setLocationBias()при создании объектаSearchByTextRequest.- Если
Ограничение по местоположению
Определяет область поиска. Результаты за пределами указанной области не возвращаются. Укажите регион в виде прямоугольной области просмотра. Информацию о том, как задать область просмотра, можно найти в описании параметра Предпочтительная область поиска.
Вы можете указать ограничение или смещение местоположения, но не оба параметра одновременно. Ограничение местоположения задает регион, в котором должны находиться результаты, а предпочтение местоположения – регион, рядом с которым должны находиться результаты (но они могут быть и за его пределами).
Чтобы задать параметр ограничения области карты, вызовите метод
setLocationRestriction()при создании объектаSearchByTextRequest.-
Максимальное количество результатов
Указывает максимальное количество результатов, которые нужно вернуть. Значение должно быть в диапазоне от 1 до 20 (по умолчанию) включительно.
Чтобы задать максимальное количество результатов, вызовите метод
setMaxResultCount()при создании объектаSearchByTextRequest. Минимальная оценка
Ограничивает результаты только теми, у которых средняя оценка пользователей больше или равна этому пределу. Значения должны быть в диапазоне от 0,0 до 5,0 (включительно) с шагом 0,5. Примеры: 0; 0,5; 1,0; …; 5,0 включительно. Значения округляются до ближайшего числа, кратного 0,5. Например, значение 0,6 исключает все результаты с рейтингом менее 1,0.
Чтобы задать параметр минимальной оценки, вызовите метод
setMinRating()при создании объектаSearchByTextRequest.Открыто
Если задано значение
true, возвращаются только те места, которые открыты в момент отправки запроса. Если указано значениеfalse, возвращаются все компании независимо от статуса. Если в запросе указан этот параметр, то все места, для которых в базе данных Google Places не указаны часы работы, игнорируются.falseЧтобы задать параметр "Открыто сейчас", вызовите метод
setOpenNow()при создании объектаSearchByTextRequest.-
Уровни цен
По умолчанию в результатах поиска показываются места, предлагающие услуги всех ценовых категорий. Чтобы ограничить результаты местами, которые соответствуют определенному диапазону цен, передайте список целочисленных значений, соответствующих диапазонам цен для мест, которые вы хотите получить:
1– место, где можно получить недорогие услуги.2– место, где услуги стоят умеренно.3– место, где предоставляются дорогие услуги.4– место, где предоставляются очень дорогие услуги.
Чтобы задать параметр уровней цен, вызовите метод
setPriceLevels()при создании объектаSearchByTextRequest. Предпочтительная позиция
Указывает, как результаты ранжируются в ответе в зависимости от типа запроса:
- Для запросов по категориям, например "рестораны в Москве", по умолчанию используется параметр
SearchByTextRequest.RankPreference.RELEVANCE(сортировка результатов по релевантности). Вы можете задать предпочтительный способ ранжирования:SearchByTextRequest.RankPreference.RELEVANCEилиSearchByTextRequest.RankPreference.DISTANCE(ранжирование результатов по расстоянию). - Для запросов, не относящихся к категориям, например "Москва", рекомендуем не задавать параметр rankPreference.
Чтобы задать параметр предпочтения ранга, вызовите метод
setRankPreference()при создании объектаSearchByTextRequest.- Для запросов по категориям, например "рестораны в Москве", по умолчанию используется параметр
Код области
Код региона, используемый для форматирования ответа, указывается в виде двухсимвольного кода CLDR. Этот параметр также может влиять на результаты поиска. Значение по умолчанию не задано.
Если название страны в поле адреса в ответе совпадает с кодом региона, код страны не указывается в адресе.
Большинство кодов CLDR совпадают с кодами ISO 3166-1, однако имеются некоторые исключения. Например, ccTLD Великобритании – uk (.co.uk), а код ISO 3166-1 – gb (технически для Соединенного Королевства Великобритании и Северной Ирландии). Параметр может влиять на результаты в соответствии с действующим законодательством.
Чтобы задать параметр кода региона, вызовите метод
setRegionCode()при создании объектаSearchByTextRequest.Строгая фильтрация по типу
Используется с параметром типа include. Если задано значение
true, возвращаются только места, соответствующие типам, указанным в параметре include type. Если задано значениеfalse(по умолчанию), ответ может содержать места, не соответствующие указанным типам.Чтобы задать параметр строгой фильтрации по типу, вызовите метод
setStrictTypeFiltering()при создании объектаSearchByTextRequest.