Новая версия текстового поиска

Выберите платформу: Android iOS JavaScript Веб-сервис

Разработчики из Европейской экономической зоны (ЕЭЗ)

Функция текстового поиска (новая) возвращает информацию о наборе мест на основе строки (например, "пицца в Нью-Йорке", "обувные магазины рядом с Оттавой" или "Главная улица, 123"). Сервис отвечает списком мест, соответствующих текстовой строке, с учетом любых заданных параметров местоположения.

Помимо обязательных параметров , функция текстового поиска (новая версия) поддерживает уточнение запросов с помощью необязательных параметров для получения лучших результатов.

Получите список мест с помощью текстового поиска.

Выполните запрос на текстовый поиск, вызвав GMSPlacesClient searchByTextWithRequest: передав объект GMSPlaceSearchByTextRequest , определяющий параметры запроса, и метод обратного вызова типа GMSPlaceSearchByTextResultCallback для обработки ответа.

Объект GMSPlaceSearchByTextRequest определяет все обязательные и необязательные параметры запроса. К обязательным параметрам относятся:

  • Список полей, которые должны быть возвращены в объекте GMSPlace , также называемый маской полей , определяется свойством GMSPlaceProperty . Если вы не укажете хотя бы одно поле в списке полей или если вы его опустите, вызов вернет ошибку.
  • Текстовый запрос .

В этом примере запроса на текстовый поиск указано, что объекты GMSPlace в ответе должны содержать название места и идентификатор места для каждого объекта GMSPlace в результатах поиска. Он также фильтрует ответ, чтобы возвращать только места типа «ресторан».

Places Swift SDK

let restriction = GMSPlaceRectangularLocationOption(
      northEast: CLLocationCoordinate2D(latitude: 20, longitude: 30),
      southWest: CLLocationCoordinate2D(latitude: 40, longitude: 50)
)
let searchByTextRequest = SearchByTextRequest(
        textQuery: "pizza in New York",
        placeProperties: [ .name, .placeID ],
        locationRestriction: restriction,
        includedType: .restaurant,
        maxResultCount: 5,
        minRating: 3.5,
        priceLevels: [ .moderate, .inexpensive ],
        isStrictTypeFiltering: true
)
switch await placesClient.searchByText(with: searchByTextRequest) {
case .success(let places):
  // Handle places
case .failure(let placesError):
  // Handle error
}

Быстрый

// Create the GMSPlaceSearchByTextRequest object.
let myProperties = [GMSPlaceProperty.name, GMSPlaceProperty.placeID].map {$0.rawValue}
let request = GMSPlaceSearchByTextRequest(textQuery:"pizza in New York", placeProperties:myProperties)
request.isOpenNow = true
request.includedType = "restaurant"
request.maxResultCount = 5
request.minRating = 3.5
request.rankPreference = .distance
request.isStrictTypeFiltering = true
request.locationBias =  GMSPlaceCircularLocationOption(CLLocationCoordinate2DMake(40.7, -74.0), 200.0)

// Array to hold the places in the response
var placeResults: [GMSPlace] = []

let callback: GMSPlaceSearchByTextResultCallback = { [weak self] results, error in
  guard let self, error == nil else {
    if let error {
      print(error.localizedDescription)
    }
    return
  }
  guard let results = results as? [GMSPlace] else {
    return
  }
  placeResults = results
}

GMSPlacesClient.shared().searchByText(with: request, callback: callback)

Objective-C

// Create the GMSPlaceSearchByTextRequest object.
GMSPlaceSearchByTextRequest *request =
    [[GMSPlaceSearchByTextRequest alloc] initWithTextQuery:@"pizza in New York" placeProperties:@[GMSPlacePropertyName, GMSPlacePropertyPlaceID]];
request.isOpenNow = YES;
request.includedType = @"restaurant";
request.maxResultCount = 5;
request.minRating = 3.5;
request.rankPreference = GMSPlaceSearchByTextRankPreferenceDistance;
request.isStrictTypeFiltering = YES;
request.priceLevels = @[ @(kGMSPlacesPriceLevelFree), @(kGMSPlacesPriceLevelCheap) ];
request.locationBias = GMSPlaceCircularLocationOption(CLLocationCoordinate2DMake(40.7, -74.0), 200.0);

// Array to hold the places in the response
_placeResults = [NSArray array];

// Create the GMSPlaceSearchByTextRequest object.
[_placesClient searchByTextWithRequest:request
    callback:^(NSArray<GMSPlace *> *_Nullable placeResults, NSError * _Nullable error) {
      if (error != nil) {
        NSLog(@"An error occurred %@", [error localizedDescription]);
        return;
      } else {
        if (placeResults.count > 0) {
          // Get list of places.
          _placeResults = placeResults;
      }
    }
  }
];

Ответы на текстовый поиск

API текстового поиска возвращает массив совпадений в виде объектов GMSPlace , причем для каждого совпавшего места используется один объект GMSPlace .

Получить статус "Открыто"

Объект GMSPlacesClient содержит функцию-член с именем isOpenWithRequest ( isOpenRequest в Swift и isPlaceOpenRequest в GooglePlacesSwift), которая возвращает ответ, указывающий, открыто ли место в данный момент, исходя из времени, указанного в вызове.

Этот метод принимает один аргумент типа GMSPlaceIsOpenWithRequest , содержащий:

  • Объект GMSPlace или строка, указывающая идентификатор места. Дополнительную информацию о создании объекта Place с необходимыми полями см. в разделе «Подробности о месте» .
  • Необязательный объект NSDate (Obj-C) или Date (Swift), указывающий время, которое вы хотите проверить. Если время не указано, используется текущее время.
  • Метод GMSPlaceOpenStatusResponseCallback для обработки ответа.
  • >

Для работы метода GMSPlaceIsOpenWithRequest необходимо задать следующие поля в объекте GMSPlace :

  • GMSPlacePropertyUTCOffsetMinutes
  • GMSPlacePropertyBusinessStatus
  • GMSPlacePropertyOpeningHours
  • GMSPlacePropertyCurrentOpeningHours
  • GMSPlacePropertySecondaryOpeningHours

Если эти поля не указаны в объекте Place или если вы передаете идентификатор места, метод использует GMSPlacesClient GMSFetchPlaceRequest: для их получения.

isOpenWithRequest response

isOpenWithRequest возвращает объект GMSPlaceIsOpenResponse , содержащий логическое значение с именем status , указывающее, открыто ли предприятие, закрыто или его статус неизвестен.

Язык Значение при открытии Стоимость при закрытии Значение, если статус неизвестен
Места Свифт true false nil
Быстрый .open .closed .unknown
Objective-C GMSPlaceOpenStatusOpen GMSPlaceOpenStatusClosed GMSPlaceOpenStatusUnknown

Оплата за isOpenWithRequest

Пример: Выполните запрос GMSPlaceIsOpenWithRequest

В следующем примере показано, как инициализировать объект GMSPlaceIsOpenWithRequest внутри существующего объекта GMSPlace .

Places Swift SDK

        let isOpenRequest = IsPlaceOpenRequest(place: place)
        switch await placesClient.isPlaceOpen(with: isOpenRequest) {
          case .success(let isOpenResponse):
            switch isOpenResponse.status {
              case true:
                // Handle open
              case false:
                // Handle closed
              case nil:
                // Handle unknown
          case .failure(let placesError):
            // Handle error
        }
        

Быстрый

    let isOpenRequest = GMSPlaceIsOpenRequest(place: place, date: nil)
      GMSPlacesClient.shared().isOpen(with: isOpenRequest) { response, error in
        if let error = error {
          // Handle Error
        }
        switch response.status {
          case .open:
            // Handle open
          case .closed:
            // Handle closed
          case .unknown:
            // Handle unknown
        }
      }
        

Objective-C

          GMSPlaceIsOpenRequest *isOpenRequest = [[GMSPlaceIsOpenRequest alloc] initWithPlace:place date:nil];

          [[GMSPlacesClient sharedClient] isOpenWithRequest:isOpenRequest callback:^(GMSPlaceIsOpenResponse response, NSError *_Nullable error) {
            if (error) {
              // Handle error
            }

            switch (response.status) {
              case GMSPlaceOpenStatusOpen:
                // Handle open
              case GMSPlaceOpenStatusClosed:
                // Handle closed
              case GMSPlaceOpenStatusUnknown:
                // Handle unknown
            }
          }];
          

Пагинация

Функция поиска по тексту предоставляет объект пагинации , логический параметр hasNextPage , который возвращается в первом ответе на вызов функции поиска по тексту. Если следующая страница доступна, вы можете использовать функцию fetchNextPage() для ее загрузки.

В следующем примере показано, как проверить наличие следующей страницы и затем загрузить её.

Быстрый

public struct PlaceSearchPagination {
  public var pageSize: Int
  public var hasNextPage: Bool
  public func fetchNextPage() async -> SearchByTextResponse
}

public struct SearchByTextResponse {
  public var pagination: PlaceSearchPagination?
  public var places: [Place]?
  public var error: PlaceError?
}

PlacesClient.swift
public func searchByText(with request: SearchByTextRequest) async -> SearchByTextResponse

let searchByTextRequest = SearchByTextRequest(textQuery: "restaurants",
    placeProperties: [PlaceProperty.displayName],
    locationBias: CircularCoordinateRegion(center: CLLocationCoordinate2D(latitude: 0, longitude: 0), radius: 100))

searchByTextRequest.maxResultCount = 10

var searchByTextResponse = await PlacesClient.shared.searchByText(with: searchByTextRequest)
print("Found \(searchByTextResponse.places.count) places")

searchByTextResponse.pagination.pageSize = 20

// Continue making requests until no more results are found in pagination object
while searchByTextResponse.pagination.hasNextPage {
    searchByTextResponse = await searchByTextResponse.pagination.fetchNextPage()
    print("Found \(searchByTextResponse.places.count) places")
}
    

Objective-C

GMSPlaceSearchByTextRequest *searchByTextRequest = [[GMSPlaceSearchByTextRequest alloc]
    initWithTextQuery: @"restaurants"
    placeProperties: @[GMSPlacePropertyAll]];

searchByTextRequest.maxResultCount = 10;

__block void (^recursiveCallback)(GMSPlaceSearchByTextResponse *, NSError *);
recursiveCallback = ^(GMSPlaceSearchByTextResponse * response, NSError* error) {
    NSLog(@"Found %d places", response.places.count);
    if (response.pagination.hasNextPage) {
      [response.pagination fetchNextPageWithCompletion:recursiveCallback];
   }
};
[GMSPlacesClient.sharedClient searchByTextWithRequest:searchByTextRequest  
                                           completion:recursiveCallback];
    

Необходимые параметры

Используйте объект GMSPlaceSearchByTextRequest для указания необходимых параметров поиска.

  • Список полей

    Укажите, какие свойства данных места следует вернуть. Передайте список свойств GMSPlace , указывающих поля данных для возврата. Если вы не укажете маску поля, запрос вернет ошибку.

    Использование списков полей — это хорошая практика проектирования, позволяющая избежать запроса лишних данных, что помогает сэкономить время на обработке и увеличить расходы на выставление счетов.

    Укажите одно или несколько из следующих полей:

    • Следующие поля активируют функцию Text Search Essentials ID Only SKU :

      GMSPlacePropertyPlaceID
    • Следующие поля активируют артикул Text Search Pro :

      GMSPlacePropertyAddressComponents
      GMSPlacePropertyBusinessStatus
      GMSPlacePropertyCoordinate
      GMSPlacePropertyFormattedAddress
      GMSPlacePropertyIconBackgroundColor
      GMSPlacePropertyIconImageURL
      GMSPlacePropertyName
      GMSPlacePropertyPhotos
      GMSPlacePropertyPlusCode
      GMSPlacePropertyTypes
      GMSPlacePropertyUTCOffsetMinutes
      GMSPlacePropertyViewport
      GMSPlacePropertyWheelchairAccessibleEntrance
    • Следующие поля запускают функцию текстового поиска Enterprise SKU :

      GMSPlacePropertyCurrentOpeningHours
      GMSPlacePropertySecondaryOpeningHours
      GMSPlacePropertyPhoneNumber
      GMSPlacePropertyPriceLevel
      GMSPlacePropertyRating
      GMSPlacePropertyOpeningHours
      GMSPlacePropertyUserRatingsTotal
      GMSPlacePropertyWebsite
    • Следующие поля запускают функцию текстового поиска Enterprise Plus :

      GMSPlacePropertyCurbsidePickup
      GMSPlacePropertyDelivery
      GMSPlacePropertyDineIn
      GMSPlacePropertyEditorialSummary
      GMSPlacePropertyReservable
      GMSPlacePropertyReviews
      GMSPlacePropertyServesBeer
      GMSPlacePropertyServesBreakfast
      GMSPlacePropertyServesBrunch
      GMSPlacePropertyServesDinner
      GMSPlacePropertyServesLunch
      GMSPlacePropertyServesVegetarianFood
      GMSPlacePropertyServesWine
      GMSPlacePropertyTakeout
  • текстовый запрос

    Текстовая строка для поиска, например: "ресторан", "123 Main Street" или "лучшее место для посещения в Сан-Франциско".

Дополнительные параметры

Используйте объект GMSPlaceSearchByTextRequest для указания необязательных параметров поиска.

  • включенный тип

    Ограничивает результаты местами, соответствующими указанному типу, определенному в таблице А. Можно указать только один тип. Например:

    • let request = SearchByTextRequest()
      request.includedType = "bar"
    • let request = SearchByTextRequest()
      request.includedType = "pharmacy"
  • isOpenNow

    Если true , возвращаются только те заведения, которые открыты на момент отправки запроса. Если false , возвращаются все заведения независимо от их статуса. Если вы установите для этого параметра значение false , будут возвращены заведения, у которых не указаны часы работы в базе данных Google Places.

  • isStrictTypeFiltering

    Используется с параметром includeType . Если установлено значение true , возвращаются только места, соответствующие includeType типам. Если значение false (по умолчанию), ответ может содержать места, не соответствующие указанным типам.

  • locationBias

    Указывает область поиска. Это местоположение служит в качестве смещения, что означает, что могут быть получены результаты вокруг указанного местоположения, включая результаты за пределами указанной области.

    Вы можете указать locationRestriction или locationBias , но не оба параметра одновременно. Рассматривайте locationRestriction как указание региона, в пределах которого должны находиться результаты, а locationBias как указание региона, рядом с которым результаты должны находиться, но могут находиться за его пределами.

    Укажите область в виде прямоугольника или круга.

    • Окружность определяется центром и радиусом в метрах. Радиус должен находиться в диапазоне от 0,0 до 50000,0 включительно. Радиус по умолчанию равен 0,0. Например:

      let request = SearchByTextRequest()
      request.locationBias =  GMSPlaceCircularLocationOption(CLLocationCoordinate2DMake(40.7, -74.0), 200.0)
    • Прямоугольник — это область просмотра, отображаемая по широте и долготе, в виде двух расположенных по диагонали нижней и верхней точек. Нижняя точка обозначает юго-западный угол прямоугольника, а верхняя — северо-восточный угол.

      Область просмотра считается замкнутой областью, то есть включает в себя свои границы. Границы широты должны находиться в диапазоне от -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 , диапазон широт пуст.
  • locationRestriction

    Указывает область поиска. Результаты за пределами указанной области не возвращаются. Укажите область в виде прямоугольной области просмотра. Информацию об определении области просмотра см. в описании параметра locationBias .

    Вы можете указать locationRestriction или locationBias , но не оба параметра одновременно. Рассматривайте locationRestriction как указание региона, в пределах которого должны находиться результаты, а locationBias как указание региона, рядом с которым результаты должны находиться, но могут находиться за его пределами.

  • maxResultCount

    Указывает максимальное количество результатов поиска мест, которые необходимо вернуть. Должно быть от 1 до 20 (по умолчанию) включительно.

  • минРейтинг

    Отображает только те результаты, средний пользовательский рейтинг которых больше или равен этому пределу. Значения должны быть в диапазоне от 0,0 до 5,0 (включительно) с шагом 0,5. Например: 0, 0,5, 1,0, ..., 5,0 включительно. Значения округляются до ближайшего 0,5. Например, значение 0,6 исключает все результаты с рейтингом ниже 1,0.

  • уровни цен

    Ограничьте поиск местами, отмеченными определенными ценовыми уровнями. По умолчанию выбраны все ценовые уровни.

    Укажите массив из одного или нескольких значений, определенных параметром PriceLevel .

    Например:

        let request = SearchByTextRequest()
        request.priceLevels = [GMSPlacesPriceLevel.moderate.rawValue, GMSPlacesPriceLevel.cheap.rawValue]
  • rankPreference

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

    • Для категориального запроса, такого как "Рестораны в Нью-Йорке", значение по умолчанию — .relevance (ранжировать результаты по релевантности поиска). Вы можете установить rankPreference на .relevance или .distance (ранжировать результаты по расстоянию).
    • Для некатегориальных запросов, таких как "Mountain View, CA", мы рекомендуем не задавать rankPreference .
  • regionCode

    Региональный код, используемый для форматирования ответа, указывается в виде двухсимвольного кода CLDR . Этот параметр также может влиять на результаты поиска. Значение по умолчанию отсутствует.

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

    Большинство кодов CLDR идентичны кодам ISO 3166-1, за некоторыми заметными исключениями. Например, национальный домен верхнего уровня Соединенного Королевства — «uk» (.co.uk), а его код ISO 3166-1 — «gb» (технически обозначающий «Соединенное Королевство Великобритании и Северной Ирландии»). Параметр может влиять на результаты в зависимости от применимого законодательства.

  • следует включить предприятия, работающие исключительно в данной сфере.

    Если true , в результатах поиска отображаются компании, работающие исключительно в пределах зоны обслуживания. Компания, работающая исключительно в пределах зоны обслуживания, — это компания, которая посещает клиентов или доставляет им товары напрямую, но не обслуживает клиентов по их корпоративному адресу.

    Например:

    Places Swift SDK

    let request = SearchByTextRequest()
    request.shouldIncludePureServiceAreaBusinesses = true

    Быстрый

    let request = SearchByTextRequest()
    request.shouldIncludePureServiceAreaBusinesses: true

    Objective-C

    GMSPlaceSearchByTextRequest *request =
        [[GMSPlaceSearchByTextRequest alloc] initWithTextQuery:@"pizza in New York" placeProperties:@[GMSPlacePropertyAll]];
    request.shouldIncludePureServiceAreaBusinesses = YES;

Отображайте атрибуцию в своем приложении

Когда ваше приложение отображает информацию, полученную от GMSPlacesClient , такую ​​как фотографии и отзывы, оно также должно отображать необходимые атрибуты.

Например, свойство reviews объекта GMSPlacesClient содержит массив, содержащий до пяти объектов GMSPlaceReview . Каждый объект GMSPlaceReview может содержать информацию об авторстве и его авторстве. Если вы отображаете отзыв в своем приложении, то вы также должны отображать любую информацию об авторстве или его авторстве.

Для получения более подробной информации см. документацию по атрибуции .