El widget de búsqueda proporciona una interfaz de búsqueda que se puede personalizar para aplicaciones web. El widget solo requiere una pequeña cantidad de código HTML y JavaScript para implementarse, y habilita funciones de búsqueda comunes como facetas y paginación. También puedes personalizar partes de la interfaz con CSS y JavaScript.
Si necesitas más flexibilidad de la que ofrece el widget, considera usar la API de consulta. Para obtener información sobre cómo crear una interfaz de búsqueda con la API de consulta, visita Crea una interfaz de búsqueda con la API de consulta.
Compila una interfaz de búsqueda
Para compilar una interfaz de búsqueda, debes seguir varios pasos:
- Configura una aplicación de búsqueda.
- Genera un ID de cliente para la aplicación.
- Agrega el lenguaje de marcado HTML para el cuadro de búsqueda y los resultados.
- Carga el widget en la página.
- Inicializa el widget.
Configura una aplicación de búsqueda
Cada interfaz de búsqueda debe tener una aplicación de búsqueda definida en la Consola del administrador. La aplicación de búsqueda proporciona información adicional para la consulta, como las fuentes de datos, las facetas y la configuración de calidad de la búsqueda.
Para crear una aplicación de búsqueda, consulta Crea una experiencia de búsqueda personalizada.
Genera un ID de cliente para la aplicación
Además de los pasos que aparecen en la sección Configura el acceso a la API de Google Cloud Search, debes generar un ID de cliente para la aplicación web.
Cuando configures el proyecto, realiza los siguientes pasos:
- Selecciona el tipo de cliente del navegador web.
- Proporciona la URI de origen de tu aplicación.
- Toma nota del ID de cliente que se creó. Necesitarás este ID para completar los próximos pasos. No es necesario el secreto del cliente para el widget.
Si deseas obtener información adicional, consulta OAuth 2.0 para la aplicación web del lado del cliente.
Agrega el lenguaje de marcado HTML
El widget requiere una pequeña cantidad de código HTML para funcionar. Debes proporcionar la siguiente información:
- Un elemento
input
para el cuadro de búsqueda. - Un elemento en el cual fijar la ventana emergente de sugerencias.
- Un elemento para contener los resultados de la búsqueda.
- Un elemento para contener los controles de facetas (opcional).
El siguiente fragmento de código HTML muestra el HTML para un widget de búsqueda, en el que los elementos a unir se identifican por su atributo id
:
Carga el widget
El widget se carga de manera dinámica través de una secuencia de comandos de cargador. Para incluir el cargador, usa la etiqueta <script>
como se muestra a continuación:
Debes proporcionar una devolución de llamada onload
en la etiqueta de la secuencia de comandos. La función recibe una llamada cuando el cargador está listo. Cuando el cargador esté listo, continúa con la carga del widget. Para ello, llama a gapi.load()
a fin de cargar el cliente de API, el Acceso con Google y los módulos de Cloud Search.
Se llama a la función initializeApp()
después de que se cargaron todos los módulos.
Inicializa el widget
En primer lugar, inicializa la biblioteca cliente llamando a gapi.client.init()
o gapi.auth2.init()
con tu ID de cliente generado y el alcance https://www.googleapis.com/auth/cloud_search.query
. A continuación, usa las clases gapi.cloudsearch.widget.resultscontainer.Builder
y gapi.cloudsearch.widget.searchbox.Builder
para configurar el widget y vincularlo a tus elementos HTML.
En el siguiente ejemplo, se muestra cómo inicializar el widget:
En el ejemplo anterior, se hace referencia a dos variables para la configuración que se definen de la siguiente manera:
Personaliza la experiencia de acceso
De forma predeterminada, el widget solicita a los usuarios acceder y autorizar la aplicación en el momento en que comienzan a escribir una consulta. Puedes usar el Acceso con Google para sitios web a fin de ofrecer una experiencia de acceso más personalizada a los usuarios.
Autoriza a los usuarios directamente
Usa Acceder con Google para supervisar el estado de acceso del usuario y permitir que los usuarios accedan o salgan según sea necesario. Por ejemplo, en el siguiente ejemplo, se observa el estado isSignedIn
para supervisar los cambios de acceso y se usa el método GoogleAuth.signIn()
para iniciar el acceso desde un clic en un botón:
Para obtener más detalles, consulta Acceder con Google.
Usuarios con acceso automático
Puedes optimizar aún más la experiencia de acceso mediante la autorización previa de la aplicación en nombre de los usuarios de tu organización. Esta técnica también es útil si se usa Cloud Identity Aware Proxy para proteger la aplicación.
Para obtener información adicional, consulta Usa el acceso a Google en aplicaciones de TI.
Personaliza la interfaz
Puedes cambiar la apariencia de la interfaz de búsqueda mediante una combinación de técnicas:
- Anular los estilos con CSS
- Decorar los elementos con un adaptador
- Crear elementos personalizados con un adaptador
Anula los estilos con CSS
El widget de búsqueda cuenta con su propio CSS para diseñar elementos de sugerencias, resultados y controles de paginación. Puedes volver a diseñar estos elementos según sea necesario.
Durante la carga, el widget de búsqueda carga de manera dinámica su hoja de estilo predeterminada. Esto sucede después de que se cargan las hojas de estilo de la aplicación, lo que prioriza las reglas. Para garantizar que tus propios estilos tengan prioridad sobre los estilos predeterminados, usa los selectores principales para aumentar la especificidad de las reglas predeterminadas.
Por ejemplo, la siguiente regla no tiene efecto si se carga en una etiqueta link
o style
estática en el documento.
.cloudsearch_suggestion_container {
font-size: 14px;
}
En su lugar, califica la regla con el ID o la clase del contenedor principal declarado en la página.
#suggestions_anchor .cloudsearch_suggestion_container {
font-size: 14px;
}
Para ver una lista de las clases de compatibilidad y un ejemplo de código HTML que proporciona el widget, consulta la referencia Clases de CSS compatibles.
Decora los elementos con un adaptador
Para decorar un elemento antes de la renderización, crea y registra un adaptador que implemente uno de los métodos de decoración, como decorateSuggestionElement
o decorateSearchResultElement.
.
Por ejemplo, el siguiente adaptador agrega una clase personalizada a los elementos de sugerencias y resultados.
Para registrar el adaptador cuando inicialices el widget, usa el método setAdapter()
de la clase Builder
correspondiente:
Los decoradores pueden modificar los atributos del elemento del contenedor y cualquier elemento secundario. Los elementos secundarios se pueden agregar o quitar durante la decoración. Sin embargo, si realizas cambios estructurales a los elementos, debes considerar la posibilidad de crear elementos directamente en vez de decorarlos.
Crea elementos personalizados con un adaptador
Para crear un elemento personalizado para una sugerencia, un contenedor de facetas o un resultado de la búsqueda, crea y registra un adaptador que implemente createSuggestionElement
, createFacetResultElement
o createSearchResultElement
, respectivamente.
En los siguientes adaptadores, se muestra cómo crear elementos personalizados de resultados de la búsqueda y sugerencias con las etiquetas HTML <template>
.
Para registrar el adaptador cuando inicialices el widget, usa el método setAdapter()
de la clase Builder
correspondiente:
La creación de elementos personalizados de faceta con createFacetResultElement
está sujeta a varias restricciones:
- Debes adjuntar la clase de CSS
cloudsearch_facet_bucket_clickable
al elemento en que los usuarios hagan clic para activar o desactivar un bucket. - Debes unir cada bucket a un elemento contenedor con la clase de CSS
cloudsearch_facet_bucket_container
. - No puedes procesar los depósitos en un orden diferente del que aparecen en la respuesta.
Por ejemplo, el siguiente fragmento procesa facetas mediante vínculos, en vez de casillas de verificación.
Personaliza el comportamiento de la búsqueda
La configuración de la aplicación de búsqueda representa la configuración predeterminada de una interfaz de búsqueda, y es estática. Para implementar filtros o facetas dinámicos, como permitir a los usuarios activar o desactivar las fuentes de datos, puedes anular la configuración de la aplicación de búsqueda interceptando la solicitud de búsqueda con un adaptador.
Implementa un adaptador con el método interceptSearchRequest
para modificar las solicitudes que se realizan a la API de búsqueda antes de la ejecución.
Por ejemplo, el siguiente adaptador intercepta las solicitudes para restringir las consultas a una fuente que selecciona el usuario:
Para registrar el adaptador cuando inicialices el widget, usa el método setAdapter()
cuando compiles el ResultsContainer
.
El siguiente código HTML se usa a fin de mostrar un cuadro de selección para filtrar por fuentes:
El siguiente código escucha el cambio, establece la selección y vuelve a ejecutar la consulta si es necesario.
También puedes interceptar la respuesta de búsqueda mediante la implementación de interceptSearchResponse
en el adaptador.
Fija la versión de la API
De forma predeterminada, el widget usa la última versión estable de la API. Para bloquear una versión específica, establece el parámetro de configuración cloudsearch.config/apiVersion
a la versión preferida antes de inicializar el widget.
La versión predeterminada de la API será 1.0 si se configura o no como un valor no válido.
Fija la versión del widget
Para evitar cambios inesperados en las interfaces de búsqueda, establece el parámetro de configuración cloudsearch.config/clientVersion
de la siguiente manera:
gapi.config.update('cloudsearch.config/clientVersion', 1.1);
La versión predeterminada del widget será 1.0 si se deja sin configurar o se configura como un valor no válido.
Asegura la interfaz de búsqueda
Los resultados de la búsqueda contienen información altamente sensible. Sigue las recomendaciones para proteger las aplicaciones web, especialmente contra ataques de clickjacking.
Para obtener más información, consulta el proyecto guía de OWASP.
Cómo habilitar la depuración
Usa interceptSearchRequest
para habilitar la depuración del widget de búsqueda. Por ejemplo:
if (!request.requestOptions) {
// Make sure requestOptions is populated
request.requestOptions = {};
}
// Enable debugging
request.requestOptions.debugOptions = {enableDebugging: true}
return request;