Este artículo técnico muestra la vida de una consulta de búsqueda de texto completo a través de un sistema Couchbase distribuido, desde que se origina en un cliente hasta que se recibe una respuesta.
Antes de sumergirnos en el mundo del servidor, un poco sobre el cliente - aquí es donde o ...
- en un sistema donde el usuario tiene una aplicación/programa que utiliza uno de los SDKs de Couchbase o simplemente una petición curl/HTTP (REST) escrita para conectarse a un cluster distribuido de Couchbase
- la interfaz de búsqueda de Couchbase en uno de los servidores del clúster
- el banco de trabajo de consultas Couchbase en uno de los servidores del clúster
- la interfaz de línea de comandos de consulta de Couchbase en uno de los servidores del clúster
Creo que este puede ser el momento adecuado para saber (si no lo sabes ya) que Couchbase aloja un servicio distribuido de Búsqueda de Texto Completo que requiere configuración. Esto significa que si configuras un índice Full Text Search sobre uno de estos clústeres para ingerir datos desde un bucket de Couchbase, se te permitirá particionar el índice entre múltiples servidores.
Si no sabes cómo configurar un índice de búsqueda de texto completo en Couchbase, este puede ser un buen momento para consultar nuestra documentación aquí. Para obtener más información sobre los distintos tipos de consultas que admite el servicio de búsqueda, haga clic en aquí.
Un usuario avanzado probablemente dividiría su índice en suficientes particiones para que los datos indexados se distribuyan uniformemente (más o menos) por el clúster de servidores que alojan el servicio de "búsqueda". Tampoco tendrá que preocuparse de buscar entre los datos distribuidos cuando lance una consulta al sistema: los servicios de búsqueda se comunicarán dentro del clúster para elaborar una respuesta completa para el usuario.
Antes de entrar en detalles, he aquí un GIF que ilustra a un usuario que recibe una respuesta tras enviar una solicitud (query) desde un cliente. Su cluster Couchbase tiene un índice Full Text Search que está particionado en seis piezas sobre tres servidores que alojan el servicio de búsqueda.
Una consulta de Búsqueda de Texto Completo una vez construida en el cliente puede ser dirigida a cualquier servidor en el cluster de Couchbase que aloja el servicio de búsqueda. Estas son las etapas por las que pasa ...
- El servidor al que el cliente dirige la petición de búsqueda asume el papel de orquestador o de nodo coordinador una vez que recibe la solicitud externa.
- El nodo coordinador busca primero el índice (asegurándose de que existe).
- El nodo coordinador obtiene el "plan" con el que se desplegó el índice. El plan contiene detalles sobre en cuántas particiones se dividió el índice y toda la información de los servidores donde reside cualquiera de estas particiones.
- El nodo coordinador establece una lista única de servidores a los que debe enviar una petición "interna". Un servidor del clúster de Couchbase es elegible si y sólo si aloja una partición perteneciente al índice considerado.
- Una vez que el nodo coordinador ha enviado las peticiones internas a cada uno de los servidores, esperará a recibir respuesta de ellos. Simultáneamente, si alguna de las particiones del índice reside en el nodo coordinador, las peticiones de búsqueda se envían también a cada una de esas particiones (vinculadas al disco).
- Los servidores del clúster que reciban la petición "interna" del nodo coordinador la reenviarán a cada una de las particiones índice que alberguen (vinculadas a disco).
- Peticiones de búsqueda separadas que se envían simultáneamente a todas las particiones de índices residentes en un servidor y el servidor espera a recibir respuesta de ellas.
- Una vez que el servidor recibe respuesta de todas las particiones que alberga, fusiona los resultados obtenidos de cada una de las particiones antes de empaquetarlos en una respuesta y enviarla de vuelta al nodo coordinador.
- Así que para resumir, el nodo coordinador espera respuestas de ...
- cada una de las particiones de índice residentes en el nodo
- cada uno de los servidores del clúster a los que envió la solicitud interna
- Una vez obtenidos todos los resultados de las particiones del índice local y de las particiones del índice remoto, el nodo coordinador los fusiona todos, los empaqueta en una respuesta y los envía de vuelta al cliente donde se originó la petición.
Esta secuencia de pasos es lo que nosotros, aquí en Couchbase, llamamos el servicio de búsqueda de texto completo. dispersar-reunir operación.
La solicitud de búsqueda que el usuario debe formular en el cliente contiene la consulta de búsqueda y, opcionalmente, una serie de filtros de paginación, clasificación, puntuación, etc. Haga clic en aquí para obtener documentación sobre la configuración de las peticiones de búsqueda y las opciones disponibles. He aquí un ejemplo de solicitud de búsqueda en el índice viajes
usando curl ...
1 2 3 |
rizo -XPOST -H "Content-type:application/json" -u nombre de usuario:contraseña http://127.0.0.1:8094/api/index/travels/query -d '{"query": {"match": "travel"}, "size": 3}' |
Al igual que la solicitud de búsqueda, la respuesta de búsqueda también está en formato JSON. He aquí un ejemplo de respuesta que muestra los tres primeros resultados agregados de seis particiones del índice para la solicitud anterior...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
{ "status": { "total": 6, "fallido": 0, "con éxito": 6 }, "solicitud": { "consulta": { "match": "viaje", "longitud_prefijo": 0, "confusión": 0, "operador": "o" }, "tamaño": 3, "de": 0, "destacar": null, "campos": null, "facetas": null, "explicar": falso, "clasificar": [ "-_score" ], "incluirLocalizaciones": falso, "buscar_después": null, "search_before": null }, "éxitos": [ { "índice": "travels_171257755a51518a_54820232", "id": "hito_22398", "puntuación": 0.7297252942480978, "clasificar": [ "_score" ] }, { "índice": "travels_171257755a51518a_13aa53f3", "id": "hito_12338", "puntuación": 0.6413638317042266, "clasificar": [ "_score" ] }, { "índice": "travels_171257755a51518a_f4e0a48a", "id": "landmark_7369", "puntuación": 0.6156080123720656, "clasificar": [ "_score" ] } ], "total_hits": 205, "max_score": 0.7297252942480978, "tomó": 804766, "facetas": null } |
En cuanto al contenido de la respuesta de búsqueda ...
- El "estado" contiene ...
- el "total"número de particiones del índice del que se han obtenido y fusionado los resultados
- el número de esas particiones que eran "éxito" al responder a la solicitud
- el número de esas particiones que "fallido" responder a la solicitud por cualquier motivo
- El "solicitar"contiene la solicitud de búsqueda (query) recibida del cliente.
- “hits" es un array de objetos, donde cada objeto es esencialmente un resultado o un documento golpeado.
- El "índice"dentro de cada objeto es la partición índice donde reside el documento
- El "id" es la clave del documento tal y como se ha insertado en el bucket de couchbase
- El "puntuación"es la pertinencia del documento para los parámetros de búsqueda, calculada mediante la función tf-idf algoritmo.
- El "ordenar" indica qué campo se ha utilizado para ordenar las respuestas positivas obtenidas.
- “visitas_totales"es el número total de resultados disponibles para la solicitud de búsqueda (consulta).
- “puntuación_máxima"es la puntuación tf-idf (relevancia) máxima de cualquiera de los documentos encontrados.
- “tomó"es el tiempo en nanosegundos que tarda el nodo coordinador en procesar la solicitud y enviar la respuesta agregada.
- “facetas" contiene contenido relevante si la consulta de búsqueda solicita alguna faceta/información agregada.
Además, no se incluyen en esta respuesta de búsqueda ...
- Si alguna de las particiones del índice no responde a la solicitud debido a algún error, se mostrará un mensaje "erroresSe incluirá el subcampo "error" indicando la naturaleza del error o errores. He aquí un ejemplo ...
1 2 3 4 5 6 7 8 9 10 |
"status": { "total": 6, "fallido": 2, "con éxito": 4, "errores": { "pindex_name_1": "razón del fracaso", "pindex_name_2": "razón del fracaso" } } |
- El ejemplo anterior es una situación en la que el servicio de búsqueda responde al usuario con una respuesta "parcial" de resultados agregados de sólo aquellas particiones de índice que tuvieron éxito. El usuario debe investigar la salud de un clúster y cuál es la causa de que algunas de las particiones de índice fallen o dejen de responder.
Espero que este artículo te sea de ayuda. Consigue la última versión de Couchbase Server en la página Descargas ¡página!