Con Couchbase v6.5, Full-Text Search está ahora integrado en el constructor de consultas N1QL de Couchbase. Los clientes ahora pueden aprovechar los índices FTS directamente con N1QL. Esto proporciona a los desarrolladores una única API para combinar la coincidencia exacta de predicados N1QL y la potente búsqueda FTS.
El único reto constante para muchos desarrolladores de aplicaciones con bases de datos relacionales es el rendimiento de las consultas. Los problemas de rendimiento de las consultas suelen limitarse a lo que ofrecen las bases de datos relacionales: un servidor de bases de datos más grande o mejores índices.
Con Couchbase, el rendimiento de las consultas N1QL también depende de componentes similares. Pero a diferencia de los RDBMS relacionales, la arquitectura de aislamiento de servicios de Couchbase significa que tanto el servicio de consultas como el de índices pueden escalarse de forma independiente. Con un dimensionamiento y una planificación de la capacidad adecuados, Couchbase puede ofrecer un rendimiento vertiginoso, como se muestra en el siguiente ejemplo. Evaluación comparativa de Altoros NoSQL informe.
Más allá de los predicados de consulta - N1QL y la búsqueda
Los clientes pueden alcanzar tiempos de respuesta de milisegundos para consultas con índices apropiados. Sin embargo, hay ocasiones en las que los predicados de consulta utilizados por los índices GSI de Couchbase no se conocen de antemano. La solución ideal es disponer de un sistema de indexación que pueda funcionar con cualquier combinación de los predicados de consulta disponibles.
Couchbase Adaptive Indexing puede abordar muchos de estos casos de uso. Couchbase Full-Text Search es otra aproximación a los casos de uso de patrones irregulares. Ofrecen capacidades de búsqueda de texto y difusa en cualquier campo del documento.
Consideremos el siguiente documento de gestión de actividades. Una actividad:
- Pertenecer siempre a un cliente (cuenta)
- También puede tener varios contactos de la organización del cliente y están representados por una matriz de contactos
- Puede incluir múltiples participantes, representados por una serie de usuarios.
- Puede ser de tipo cita o tarea, ambos con sus correspondientes atributos específicos, como título, fecha de inicio, fecha de vencimiento, etc.
- Una actividad de tipo Task tiene un array de ToDo list
El caso práctico
John, un representante de servicio de un centro de llamadas de Acme Ltd necesita recuperar todas las actividades del cliente mientras está al teléfono con un cliente. El cliente puede proporcionar uno o varios de los siguientes valores para que John consulte la aplicación:
- Título de la actividad: La consulta debe devolver todas las actividades que tengan este texto, en cualquier parte del título de la actividad.
- Nombre del cliente: El nombre del cliente introducido puede estar incompleto, por lo que la consulta debe utilizar un comodín para que coincida con el nombre del cliente.
- Nombre, correo electrónico o teléfono de contacto: El cliente también puede facilitar los datos de la persona de contacto. Estos también pueden estar incompletos.
- Un nombre de participante: El cliente también puede facilitar el nombre del gestor de la cuenta, un empleado de Acme con el que el cliente ha interactuado y que ha participado en la actividad.
- Fecha de la actividad: El cliente puede proporcionar un intervalo de fechas y horas para las actividades.
- El representante de servicio puede recibir una o varias de las informaciones anteriores. El patrón no es fijo.
- El tiempo de respuesta de la consulta debe ser de ~1 seg.
- El volumen de datos es de 3 millones al año y el periodo de conservación de 3 años.
¿Cuáles son los retos para recuperar esta información?
- El cliente puede proporcionar hasta ocho campos, y ninguno de ellos es obligatorio. Esto supondría un reto para el diseño eficiente de un índice GSI, ya que la clave principal del índice debe estar presente para la selección del índice. Como resultado, los índices GSI no pueden cubrir todos los casos.
- Coincidencia de comodines: El título de la actividad, el nombre del cliente y del contacto, el correo electrónico o el teléfono pueden estar incompletos, por lo que no funcionará una técnica de coincidencia de predicado N1QL exacta.
- Tanto los contactos como los participantes son objetos hijos de las actividades. En el modelo de datos JSON, los contactos y los participantes se representan como dos matrices separadas. Si necesitamos un índice de cobertura, debe incluir uno o más elementos de ambas matrices.
Las soluciones
1. El enfoque más sencillo es utilizar predicados N1QL:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
SELECCIONE meta(a).id, a.título, a.fechaInicio, a.cuenta.nombre, a.contactos, a.participantes DESDE crm a DONDE a.tipo=Actividad Y a.activityType=Nombramiento Y ( BAJO(a.título) COMO 1TP3Inteligencia artificial% Y BAJO(a.cuenta.nombre) COMO '%collins%' Y CUALQUIER c en a.contactos SATISFACE BAJO(c.nombre) COMO '%rogers%' FIN Y CUALQUIER c en a.contactos SATISFACE BAJO(c.correo electrónico) = elliottpamela@gmail.com FIN Y CUALQUIER c en a.contactos SATISFACE c.teléfono COMO '%6816%' FIN Y CUALQUIER p en a.participantes SATISFACE BAJO(p.nombre)COMO '%james%' FIN Y a.fechaInicio entre '2016-08-29' Y '2016-08-30' ) |
También se requerirían los siguientes índices GSI:
1 2 3 4 5 6 |
CREAR ÍNDICE crm_activity_appt_startDate_accid_dur EN `crm`(`activityType`,`fechaInicio`,`accidente`,`duración`) DONDE `tipo` = Actividad CREAR ÍNDICE act_account_name_type EN `crm`(inferior((`cuenta`).`nombre`)) DONDE `tipo` = Actividad CREAR ÍNDICE act_contacts_name_type EN `crm`(DISTINTO ARRAY inferior(`c`.`nombre`) PARA c en contactos FIN) DONDE `tipo` = Actividad CREAR ÍNDICE act_contacts_email_type EN `crm`(DISTINTO ARRAY inferior(`c`.`correo electrónico`) PARA c en contactos FIN) DONDE `tipo` = Actividad CREAR ÍNDICE act_contacts_phone_type EN `crm`(DISTINTO ARRAY c.teléfono PARA c en contactos FIN) DONDE `tipo` = Actividad CREAR ÍNDICE act_participants_name_type EN `crm`(DISTINTO ARRAY inferior(`p`.`nombre`) PARA p en participantes FIN) DONDE `tipo` = Actividad |
Tenga en cuenta que la consulta anterior puede utilizar uno o todos los índices disponibles para mejorar el rendimiento de la consulta. Sin embargo, todavía podría haber problemas de rendimiento debido a la necesidad de que el plan de consulta utilice la operación IntersectScan.
2. Apalancamiento Índice FTS
Couchbase Full-Text Search podría ayudar con este caso de uso, debido a su capacidad de búsqueda no exacta, así como la capacidad de buscar en los campos en cualquier orden. He aquí un índice FTS que puede cubrir los criterios de búsqueda.
2.1 Usando CURL - Esto es soportado en Couchbase 5.5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
SELECCIONE meta(a).id, a.título,a.fechaInicio, a.cuenta.nombre, a.contactos, a.participantes DESDE CURL("http://localhost:8094/api/index/all_acts/query", {"solicitud":"POST","cabecera":"Content-Type: application/json", "datos": '{"explain":false, "fields": ["*"], "highlight": {}, "query": {"conjuncts": [ {"campo": "título", "coincidencia": "inteligencia artificial"} , {"field": "contacts.name", "match": "rogers"} , {"field": "contacts.email", "match": "eliottpamela@gmail.com"} , {"field": "contacts.phone", "wildcard": "*6816*"} , {"field": "participants.name", "match": "james"} , {"field": "account.name", "match": "collins"} , {"field": "startDate", "start": "2016-08-29", "end": "2016-08-30", "inclusive_start": true, "inclusive_end": true} ] } }', "usuario":"Administrador:contraseña"}) resultado UNNEST resultado.hits h INTERIOR ÚNASE A crm a EN (h.id = meta(a).id) Y a.tipo=Actividad |
2.2 Con integración N1QL/FTS mediante SEARCH_QUERY
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
SELECCIONE meta(a).id, a.título,a.fechaInicio, a.cuenta.nombre, a.contactos, a.participantes DESDE BÚSQUEDA_CONSULTA("todos_los_actos",{"explicar":falso,"campos": ["*"],"destacar": {}, "consulta": {"Conjuntos":[ {"campo":"título, "match": "inteligencia artificial"} , {"campo":"contactos.nombre", "match":"rogers"} , {"campo":"contactos.email", "match":"eliottpamela@gmail.com"} , {"campo":"contactos.telefono", "comodín":"*6816*"} , {"campo": "participantes.nombre", "match":"james"} , {"campo": "nombre.cuenta", "match":"collins"} , {"campo": "startDate","inicio": "2016-08-29", "fin":"2016-08-30", "inicio_inclusivo": verdadero, "inclusive_end": verdadero} ] }} ) como resultado UNNEST resultado.hits h INTERIOR ÚNASE A crm a EN (h.id = meta(a).id) Y a.tipo=Actividad |
2.3 Con integración N1QL/FTS mediante el predicado SEARCH de N1QL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
SELECCIONE meta(a).id, a.título,a.fechaInicio, a.cuenta.nombre, a.contactos, a.participantes DESDE crm a DONDE a.tipo=Actividad Y a.activityType=Nombramiento Y BUSCAR(a, {"Conjuntos": [ {"campo":"título, "match": "inteligencia artificial"}, {"campo":"contactos.nombre", "match":"rogers"}, {"campo":"contactos.email", "match":"eliottpamela@gmail.com"}, {"campo":"contactos.telefono", "comodín":"*6816*"}, {"campo": "participantes.nombre", "match":"james"}, {"campo": "nombre.cuenta", "match":"collins"}, {"campo": "startDate","inicio": "2016-08-29", "fin":"2016-08-30", "inicio_inclusivo": verdadero, "inclusive_end": verdadero} ] }, {"índice":"todos_los_actos"}) /* buena práctica proporcionar el nombre específico del índice */ |
Notas:
- El ejemplo anterior aprovecha la consulta compuesta FTS con la construcción conjunct para combinar todos los predicados en un único SEARCH(). Consulta la documentación de Couchbase FTS para más detalles sobre FTS Tipo de consulta
- El enunciado anterior debe construirse mediante programación para incluir sólo los predicados de búsqueda necesarios.
- El diseño del índice FTS debe incluir los campos que se utilizan en SEARCH()
- El predicado N1QL a.type='actividad' debe estar presente en la consulta para la selección del índice FTS
N1QL SEARCH_QUERY y SEARCH predicate es parte de la característica N1QL/FTS Integration disponible en Couchbase v6.5 y actualizaré el blog con la documentación cuando esté disponible.
Para más detalles sobre la sintaxis de la consulta FTS https://docs.couchbase.com/server/6.0/fts/full-text-intro.html
N1QL y resumen de búsqueda:
- La integración N1QL/FTS permite que una consulta utilice la construcción de búsqueda FTS directamente como predicados de búsqueda.
- El uso del índice FTS en la consulta N1QL alivia la necesidad de disponer de un índice exacto para cada patrón de consulta
- N1QL/FTS ofrece a los desarrolladores una opción adicional para resolver los problemas de rendimiento de las consultas
- El índice FTS es adecuado cuando se necesita buscar en varios campos en cualquier orden.
- El índice FTS se adapta bien a los casos en los que hay que buscar campos en varias matrices
Recursos
- Descargar: Descargar Couchbase Server 6.5
- Documentación: Novedades de Couchbase Server 6.5
- Todos los blogs de 6.5
Nos encantaría que nos dijera qué le han parecido las funciones de la versión 6.5 y en qué beneficiarán a su empresa en el futuro. Por favor, comparta su opinión a través de los comentarios o en el foro.