Новая версия текстового поиска возвращает информацию о местах на основе введенной фразы, например "кафе в Москве", "обувные магазины в Санкт-Петербурге" или "улица Центральная, 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 в Text Search предоставляет доступ к разбивке результатов текстового поиска на страницы с помощью метода getPagination(), который возвращает объект Pagination.
Чтобы определить, доступны ли дополнительные страницы с результатами, используйте метод hasNextPage() объекта Pagination. Этот метод возвращает логическое значение (true или false).
Пока 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 SKU:
Place.Field.DISPLAY_NAME*
* Используйте вместоPlace.Field.NAME(поддержка прекращена в версии 4.0).
Place.Field.ID
Place.Field.RESOURCE_NAME*
* Содержит название ресурса места в видеplaces/PLACE_ID.
Чтобы получить текстовое название места, используйтеDISPLAY_NAME.Полный список полей и связанных с ними кодов SKU приведен в разделе Поля данных о местах (новые).
Следующие поля активируют SKU текстового поиска 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 приведен в разделе Поля данных о местах (новые).
Следующие поля активируют 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Полный список полей и связанных с ними кодов SKU приведен в разделе Поля данных о местах (новые).
Код 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Полный список полей и связанных с ними кодов SKU приведен в разделе Поля данных о местах (новые).
Чтобы задать параметр списка полей, вызовите метод
setPlaceFields()при создании объектаSearchByTextRequest. -
Текстовый запрос
Строка для текстового поиска, например "ресторан", "улица Центральная, 123" или "лучшие места в Санкт-Петербурге". На основе этой строки API возвращает список подходящих мест, упорядоченных по их предполагаемой релевантности.
Чтобы задать параметр текстового запроса, вызовите метод
setTextQuery()при создании объектаSearchByTextRequest.
Необязательные параметры
Используйте объект SearchByTextRequest, чтобы указать необязательные параметры запроса.
Тип данных для скачивания
В результаты поиска включаются только места указанного типа, определенного в таблице А. Можно указать только один тип. Пример:
setIncludedType("bar")setIncludedType("pharmacy")
Чтобы задать параметр includedTypes, вызовите метод
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(ранжирование результатов по расстоянию). - Для запросов, не относящихся к категориям, например "Mountain View, CA", рекомендуем не задавать параметр rank preference.
Чтобы задать параметр предпочтительного ранга, вызовите метод
setRankPreference()при создании объектаSearchByTextRequest.- Для запросов по категориям, например "рестораны в Москве", по умолчанию используется значение
Код области
Код региона, используемый для форматирования ответа, указывается в виде двухсимвольного кода CLDR. Этот параметр также может влиять на результаты поиска. Значение по умолчанию не задано.
Если название страны в поле адреса в ответе совпадает с кодом региона, код страны опускается.
Большинство кодов CLDR совпадают с кодами ISO 3166-1, однако имеются некоторые исключения. Например, ccTLD Великобритании – uk (.co.uk), а код ISO 3166-1 – gb (технически относится к Соединенному Королевству Великобритании и Северной Ирландии). Параметр может влиять на результаты в соответствии с действующим законодательством.
Чтобы задать параметр кода региона, вызовите метод
setRegionCode()при создании объектаSearchByTextRequest.Строгая фильтрация по типу
Используется с параметром include type. Если задано значение
true, возвращаются только места, соответствующие типам, указанным в параметре include type. Если задано значениеfalse(по умолчанию), ответ может содержать места, не соответствующие указанным типам.Чтобы задать параметр строгой фильтрации по типу, вызовите метод
setStrictTypeFiltering()при создании объектаSearchByTextRequest.