Text Search (nueva) devuelve información sobre un conjunto de lugares en función de una cadena (por ejemplo, "pizza en Buenos Aires", "tiendas de zapatos cerca de Santiago" o "Calle principal 123"). El servicio responde con una lista de lugares que coinciden con la cadena de texto y con cualquier personalización de ubicación que se haya establecido.
Además de los parámetros obligatorios, Text Search (nuevo) admite el perfeccionamiento de las consultas con parámetros opcionales para obtener mejores resultados.
Text Search (nueva) es similar a Nearby Search (nueva). La diferencia principal entre ambas es que Text Search (nueva) te permite especificar una cadena de búsqueda arbitraria, mientras que Nearby Search (nueva) requiere un área específica en la que se debe realizar la búsqueda.
Solicitudes de Text Search
Una solicitud de Text Search tiene el siguiente formato:
// 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(); });
En este ejemplo, harás lo siguiente:
Configura la lista de campos para que solo incluya
Place.Field.IDyPlace.Field.DISPLAY_NAME. Esto significa que los objetosPlacede la respuesta que representan cada lugar coincidente solo contienen esos dos campos.Usa
SearchByTextRequest.Builderpara crear un objetoSearchByTextRequestque defina la búsqueda.Establece la cadena de consulta de texto en "Spicy Vegetarian Food".
Establece la cantidad máxima de lugares de resultados en 10. El valor predeterminado y el máximo es 20.
Restringe el área de búsqueda al rectángulo definido por las coordenadas de latitud y longitud. No se devuelven coincidencias fuera de esta área.
Agrega un
OnSuccessListenery obtén los lugares que coincidan del objetoSearchByTextResponse.
Respuestas de Text Search
La clase
SearchByTextResponse
representa la respuesta de una solicitud de búsqueda. Un objeto SearchByTextResponse contiene lo siguiente:
Es una lista de objetos
Placeque representan todos los lugares que coinciden, con un objetoPlacepor lugar coincidente.Cada objeto
Placesolo contiene los campos definidos por la lista de campos que se pasa en la solicitud.
Por ejemplo, en la solicitud, definiste una lista de campos de la siguiente manera:
// Specify the list of fields to return. final List<Place.Field> placeFields = Arrays.asList(Place.Field.ID, Place.Field.DISPLAY_NAME);
Esta lista de campos significa que cada objeto Place de la respuesta contiene solo el ID de lugar y el nombre de cada lugar coincidente. Luego, puedes usar los métodos Place.getId() y Place.getName() para acceder a estos campos en cada objeto Place.
Para ver más ejemplos de acceso a datos en un objeto Place, consulta Cómo acceder a los campos de datos de un objeto Place.
Paginación
La clase SearchByTextResponse de Text Search proporciona acceso a la paginación de los resultados de la búsqueda de texto a través de su método getPagination(), que devuelve un objeto Pagination.
Usa el método hasNextPage() del objeto Pagination para determinar si hay páginas de resultados adicionales disponibles. Este método devuelve un valor booleano (verdadero o falso).
Mientras hasNextPage() devuelva verdadero, llama al método fetchNextPage() para recuperar la siguiente página de resultados.
En el siguiente ejemplo, se muestra cómo comprobar si hay una página siguiente disponible y, luego, cargarla.
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 } });
Parámetros obligatorios
Los parámetros obligatorios para
SearchByTextRequest
son los siguientes:
-
Lista de campos
Especifica qué campos de datos de lugar deseas que se completen. Pasa una lista de valores
Place.Fieldque especifiquen los campos de datos que se devolverán. No hay una lista predeterminada de campos devueltos en la respuesta.Las listas de campos son una práctica de diseño recomendada para garantizar que no solicites datos innecesarios, lo que ayuda a evitar tiempos de procesamiento y cargos de facturación adicionales.
Especifica uno o más de los siguientes campos:
Los siguientes campos activan el SKU Text Search Essentials ID Only:
Place.Field.DISPLAY_NAME*
* Se usa en lugar dePlace.Field.NAME(obsoleto en la versión 4.0).
Place.Field.ID
Place.Field.RESOURCE_NAME*
* Contiene el nombre del recurso del lugar con el siguiente formato:places/PLACE_ID.
UtilizaDISPLAY_NAMEpara acceder al nombre del lugar en forma de texto.Para obtener una lista completa de los campos y sus SKUs asociados, consulta Campos de datos de Place (nuevo).
Los siguientes campos activan el SKU de Text Search Pro:
Place.Field.ACCESSIBILITY_OPTIONS*
Se usa en lugar dePlace.Field.WHEELCHAIR_ACCESSIBLE_ENTRANCE(obsoleto).
Place.Field.ADDRESS_COMPONENTS
Place.Field.ADR_FORMAT_ADDRESS
Place.Field.BUSINESS_STATUS
Place.Field.FORMATTED_ADDRESS*
Se usa en lugar dePlace.Field.ADDRESS(obsoleto).
Place.Field.GOOGLE_MAPS_URI
Place.Field.ICON_BACKGROUND_COLOR
Place.Field.ICON_MASK_URL*
Se usa en lugar dePlace.Field.ICON_URL(obsoleto).
Place.Field.LOCATION*
Se usa en lugar dePlace.Field.LAT_LNG(obsoleto).
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.VIEWPORTPara obtener una lista completa de los campos y sus SKUs asociados, consulta Campos de datos de Place (nuevo).
Los siguientes campos activan el SKU de Text Search Enterprise:
Place.Field.CURRENT_OPENING_HOURS
Place.Field.CURRENT_SECONDARY_OPENING_HOURS
Place.Field.INTERNATIONAL_PHONE_NUMBER*
* Se usa en lugar dePlace.Field.PHONE_NUMBER, que está obsoleto.
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*
* Se usa en lugar dePlace.Field.USER_RATINGS_TOTAL, que está obsoleto.
Place.Field.WEBSITE_URIPara obtener una lista completa de los campos y sus SKUs asociados, consulta Campos de datos de Place (nuevo).
Los siguientes campos activan el SKU de 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.TAKEOUTPara obtener una lista completa de los campos y sus SKUs asociados, consulta Campos de datos de Place (nuevo).
Para establecer el parámetro de la lista de campos, llama al método
setPlaceFields()cuando compiles el objetoSearchByTextRequest. -
Búsqueda de texto
Es la cadena de texto en la que se basa la búsqueda, por ejemplo, "restaurante", "calle principal 123" o "mejor lugar para visitar en San Francisco". La API devuelve posibles coincidencias en función de esta cadena y ordena los resultados según la relevancia percibida.
Para establecer el parámetro de consulta de texto, llama al método
setTextQuery()cuando compiles el objetoSearchByTextRequest.
Parámetros opcionales
Usa el objeto SearchByTextRequest para especificar los parámetros opcionales de tu solicitud.
Tipo incluido
Restringe los resultados a los lugares que coinciden con el tipo especificado que se define en la tabla A. Solo se puede especificar un tipo. Por ejemplo:
setIncludedType("bar")setIncludedType("pharmacy")
Para establecer el parámetro de tipo incluido, llama al método
setIncludedType()cuando compiles el objetoSearchByTextRequest.Sesgo de ubicación
Especifica un área para buscar. Esta ubicación sirve como sesgo, lo que significa que se pueden mostrar resultados alrededor de la ubicación especificada, incluidos los resultados fuera del área especificada.
Puedes especificar una restricción de ubicación o una preferencia de ubicación, pero no ambas. Piensa en la restricción de ubicación como la especificación de la región en la que deben estar los resultados y en la preferencia de ubicación como la especificación de la región en la que es probable que estén los resultados o cerca de ella, teniendo en cuenta que, cuando se usa la preferencia de ubicación, los resultados pueden estar fuera del área especificada.
Especifica la región como un Viewport rectangular o como un círculo.
Un círculo se define por el punto central y el radio en metros. El radio debe estar entre 0.0 y 50000.0, inclusive. Por ejemplo:
// 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();
Un rectángulo es un viewport de latitud y longitud, representado como dos puntos diagonalmente opuestos, uno bajo y otro alto. El punto bajo marca la esquina sudoeste del rectángulo, y el punto alto representa la esquina noreste del rectángulo.
Un viewport se considera una región cerrada, lo que significa que incluye su límite. Los límites de latitud deben estar comprendidos entre -90 y 90 grados, inclusive, y los límites de longitud deben estar comprendidos entre -180 y 180 grados, inclusive:
- Si
low=high, el viewport consta de ese único punto. - Si
low.longitude>high.longitude, el rango de longitud se invierte (el viewport cruza la línea de longitud de 180 grados). - Si
low.longitude= -180 grados yhigh.longitude= 180 grados, el viewport incluye todas las longitudes. - Si
low.longitude= 180 grados yhigh.longitude= -180 grados, el rango de longitud está vacío. - Si
low.latitude>high.latitude, el rango de latitud está vacío.
Se deben propagar los valores bajo y alto, y el cuadro representado no puede estar vacío. Un viewport vacío genera un error.
Por ejemplo, para ver un viewport rectangular, consulta las solicitudes de Text Search.
Para establecer el parámetro de sesgo de ubicación, llama al método
setLocationBias()cuando compiles el objetoSearchByTextRequest.- Si
Restricción de ubicación
Especifica un área para buscar. No se devuelven resultados fuera del área especificada. Especifica la región como un Viewport rectangular. Consulta la descripción de Personalización de ubicación para obtener información sobre cómo definir el viewport.
Puedes especificar una restricción de ubicación o una preferencia de ubicación, pero no ambas. Piensa en la restricción de ubicación como la especificación de la región dentro de la cual deben estar los resultados, y en la personalización de ubicación como la especificación de la región cerca de la cual deben estar los resultados, aunque pueden estar fuera del área.
Para establecer el parámetro de restricción de ubicación, llama al método
setLocationRestriction()cuando compiles el objetoSearchByTextRequest.-
Recuento máximo de resultados
Especifica la cantidad máxima de resultados de lugares que se mostrarán. Debe estar entre 1 y 20 (predeterminado), ambos incluidos.
Para establecer el parámetro de recuento máximo de resultados, llama al método
setMaxResultCount()cuando compiles el objetoSearchByTextRequest. Calificación mínima
Restringe los resultados solo a aquellos cuya calificación promedio de los usuarios sea mayor o igual que este límite. Los valores deben estar entre 0.0 y 5.0 (inclusive) en incrementos de 0.5. Por ejemplo: 0, 0.5, 1.0, …, 5.0 inclusive. Los valores se redondean al 0.5 más cercano. Por ejemplo, un valor de 0.6 elimina todos los resultados con una calificación inferior a 1.0.
Para establecer el parámetro de calificación mínima, llama al método
setMinRating()cuando compiles el objetoSearchByTextRequest.Abierto ahora
Si es
true, solo se devuelven los lugares que están abiertos en el momento en que se envía la consulta. Si esfalse, se devuelven todas las empresas, independientemente de su estado de apertura. Los lugares que no especifican los horarios de atención en la base de datos de Google Places se muestran si estableces este parámetro enfalse.Para establecer el parámetro de apertura actual, llama al método
setOpenNow()cuando compiles el objetoSearchByTextRequest.-
Niveles de precios
De forma predeterminada, los resultados incluyen lugares que proporcionan servicios en todos los niveles de precios. Para restringir los resultados de modo que solo se incluyan lugares con niveles de precios específicos, puedes pasar una lista de valores enteros que correspondan a los niveles de precios de los lugares que deseas que se muestren:
1: El lugar ofrece servicios económicos.2: El lugar ofrece servicios de precio moderado.3: El lugar ofrece servicios costosos.4: El lugar ofrece servicios muy costosos.
Para establecer el parámetro de niveles de precios, llama al método
setPriceLevels()cuando compiles el objetoSearchByTextRequest. Preferencia de clasificación
Especifica cómo se clasifican los resultados en la respuesta según el tipo de consulta:
- Para una búsqueda categórica, como "Restaurantes en la ciudad de Nueva York",
SearchByTextRequest.RankPreference.RELEVANCE(clasifica los resultados por relevancia de la búsqueda) es la opción predeterminada. Puedes establecer la preferencia de clasificación enSearchByTextRequest.RankPreference.RELEVANCEoSearchByTextRequest.RankPreference.DISTANCE(clasifica los resultados por distancia). - Para una búsqueda no categórica, como "Mountain View, CA", te recomendamos que dejes sin configurar el parámetro de preferencia de clasificación.
Para establecer el parámetro de preferencia de clasificación, llama al método
setRankPreference()cuando compiles el objetoSearchByTextRequest.- Para una búsqueda categórica, como "Restaurantes en la ciudad de Nueva York",
Código de la región
Es el código de región que se usa para dar formato a la respuesta, especificado como un valor de código CLDR de dos caracteres. Este parámetro también puede tener un efecto de sesgo en los resultados de la búsqueda. No hay un valor predeterminado.
Si el nombre del país del campo de dirección de la respuesta coincide con el código de región, el código de país se omite de la dirección.
La mayoría de los códigos CLDR son idénticos a los códigos ISO 3166-1, con algunas excepciones notables. Por ejemplo, el ccTLD del Reino Unido es "uk" (.co.uk), mientras que su código ISO 3166-1 es "gb" (técnicamente para la entidad "Reino Unido de Gran Bretaña e Irlanda del Norte"). El parámetro puede afectar los resultados según la legislación aplicable.
Para establecer el parámetro de código de región, llama al método
setRegionCode()cuando compiles el objetoSearchByTextRequest.Filtrado estricto de tipos
Se usa con el parámetro de tipo include. Cuando se establece en
true, solo se devuelven los lugares que coinciden con los tipos especificados por el tipo de inclusión. Cuando se establece enfalse, el valor predeterminado, la respuesta puede contener lugares que no coinciden con los tipos especificados.Para establecer el parámetro de filtrado de tipo estricto, llama al método
setStrictTypeFiltering()cuando compiles el objetoSearchByTextRequest.