Con el tiempo, el sector de las bases de datos se ha dado cuenta de que la búsqueda de texto completo y SQL son dos caras de la misma moneda. La búsqueda de texto necesita más procesamiento de consultas, y el procesamiento de consultas necesita la búsqueda de texto para filtrar eficazmente los patrones de texto. Las bases de datos SQL han incorporado la búsqueda de texto completo en su interior, aunque para sistemas SMP de un solo nodo.
-
- SQL Server admite CONTAINS() para la búsqueda de texto
- Oracle admite CONTAINS() para la búsqueda de texto
- MySQL ha añadido fSoporte de texto completo
- PostgreSQL dispone de búsqueda de texto compatible durante mucho tiempo.
Couchbase Full-Text Search (FTS) se crea con tres motivaciones principales:
-
- Búsqueda transparente en varios campos de un documento
- Vaya más allá de la coincidencia exacta de valores proporcionando derivación lingüística, emparejamiento difusoetc.
- Proporcionar los resultados de búsqueda en función de la relevancia
FTS lo consigue con un índice invertido y un rico conjunto de predicados de consulta: desde la simple búsqueda de palabras a la concordancia de patrones, pasando por complejos predicados de rango. Además de la búsqueda, admite la agregación mediante facetas de búsqueda.
En el mundo NoSQL, Lucene es un índice de búsqueda popular y también lo son los servidores de búsqueda basados en Lucene: Solr y Elasticsearch. Siguiendo a sus primos RDBMS, Elasticsearch, Opendistro para Elasticsearch todos han añadido SQL para sus búsquedas. Couchbase introdujo el servicio de texto completo, FTS y ha seguido con el apoyo a la búsqueda dentro de N1QL.
-
- FTS con N1QL
- Elasticsearch con SQL
- Opendistro para Elasticsearch con SQL
- Y el recién llegado a las búsquedas, MongoDB, ha añadido buscar en MQL utilizando Lucene en su oferta Atlas.
Las implementaciones SQL de Elasticsearch con SQL y MQL de MongoDB viene con una larga lista de limitaciones.
Elasticsearch con SQL ha enumerado aquí sus limitaciones:
-
- Lista completa: https://www.elastic.co/guide/en/elasticsearch/reference/current/sql-limitations.html
- Además, el lenguaje es comprensiblemente limitado debido a su incipiente aplicación.
- No admite operaciones de conjuntos, uniones, etc.
- Sin funciones de ventana.
MQL de MongoDB La integración de búsquedas viene acompañada de una larga lista de limitaciones.
-
- Disponible sólo en el servicio de búsqueda Atlas, no en el producto on-prem.
- La búsqueda sólo puede ser la PRIMERA operación dentro de la cadena aggregate().
- Disponible sólo dentro de la canalización de agregación (aggregate()) y no en find(), insert(), update(), remove() otras operaciones.
La integración con su API aggregate(), viene con algunas limitaciones: Sólo puede ser la primera operación del pipeline no disponible en su base de datos on-prem. Las características que discutimos en este artículo están en Couchbase 6.5 y superiores.
Aquí tienes un ejemplo de N1QL:
1 2 3 4 5 6 7 8 9 10 11 |
SELECCIONE país, ciudad, nombre, ROW_NUMBER() OVER(ORDENAR POR país DESC, ciudad DESC) rownum DESDE Viajar-muestra AS t1 DONDE t1.tipo = "hotel" Y BUSCAR(t1.descripción, "jardín") Y CUALQUIER r en reseñas satisface r.ratings.Service > 3 FIN; |
Esto incluye lo siguiente además de SEARCH():
- Proyección de los campos de los documentos: país, ciudad, nombre
- Generación del número de fila mediante la función de ventana ROW_NUMBER()
- Predicado escalar adicional t1.type = "hotel"
- Predicado de matriz sobre revisiones (CUALQUIERA)
Obtendrá el beneficio COMPLETO de un procesamiento de consultas de primera clase, además de una búsqueda eficiente. Eso no es todo - hay aún más con N1QL. Los beneficios y eficacia de SQL son bien conocidos. N1QL es SQL para JSON. El objetivo de N1QL es ofrecer a desarrolladores y empresas un lenguaje expresivo, potente y completo para consultar, transformar y manipular datos JSON.
Las ventajas de utilizar N1QL con la búsqueda son los siguientes:
- Predicados:
- FTS es excelente para las búsquedas basadas en la relevancia. SQL es excelente para el procesamiento de consultas complejas: predicados complejos, predicados de matriz, escalares adicionales, etc.
- Operadores y funciones:
- Tratamiento de predicados (tratamiento de filtros)
- Predicados escalares y de matriz adicionales
- Las funciones escalares y de matriz también pueden utilizarse dentro de los predicados
- Subconsultas
- Subconsultas correlacionadas
- Subconsultas no correlacionadas
- Áridos
- Funciones de ventana
- Tratamiento de predicados (tratamiento de filtros)
- procesamiento JOIN
- N1QL puede hacer INNER JOIN, LEFT OUTER JOIN, (limitado) RIGHT OUTER JOIN, NEST, UNNEST
- JOINS entre cubos, colecciones y resultados de subconsultas.
- Operaciones SET
- UNIÓN
- UNIÓN TODOS
- EXCEPTO
- EXCEPTO TODOS
- INTERSECT
- INTERSECTAR TODO
- CTE (Expresión común de tabla) y Cláusula LET para mejorar la redacción de consultas
- Más que SEARCH()
- Además de SELECT, puede utilizar el predicado SEARCH() en las cláusulas WHERE de las sentencias INSERT, UPDATE, DELETE, MERGE.
- Puede PREPARAR estas sentencias y EJECUTARLAS repetida y eficazmente.
- Obtendrá la seguridad habitual a través de los roles RBAC mediante GRANT & REVOKE.
- Productividad del desarrollador: Escriba la consulta en SQL, el lenguaje que ya conocen.
Veamos cómo ejecuta esto el motor N1QL. Abhinav Dangeti de la ingeniería FTS de Couchbase ya ha escrito un gran blog que detalla la toma de decisiones y ejemplos. Este artículo pretende explicarlo visualmente con ejemplos adicionales en las categorías mencionadas anteriormente.
1. ARQUITECTURA para la EJECUCIÓN DE CONSULTAS
Hemos añadido tres pasos importantes a la ejecución de la consulta la consulta utiliza SEARCH() :
- El planificador considera el índice de búsqueda FTS como una de las rutas de acceso válidas si el predicado search() existe en la consulta.
- Si se selecciona el índice de búsqueda, crea el plan enviando el predicado de búsqueda al índice FTS.
- Cuando se selecciona el índice de búsqueda, el ejecutor emite la petición de búsqueda a uno de los nodos FTS (en lugar de la petición de escaneo al servicio de índice)
- Antes de finalizar los resultados de la búsqueda, el servicio de consulta vuelve a verificar la adecuación del documento a los datos.
2. PROCESAMIENTO DE PREDICADOS
En la siguiente consulta, el predicado SEARCH() (predicado-2) se introduce en la petición de búsqueda FTS. Todos los demás predicados son procesados por el motor de consulta después de la búsqueda en la fase "Filtro", como se muestra en la figura anterior "Dentro de un servicio de consulta". Hay una excepción. Cuando el índice FTS ha creado un índice con Campo de tipo JSON (doc_config.type_field en el documento de definición del índice) (en este caso tipo = "hotel") para crear el índice sobre el subconjunto del documento, tanto la selección del índice como el pushdown de búsqueda aprovechan este predicado. Incluso en este caso, el predicado se vuelve a aplicar después de la obtención del documento.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
SELECCIONE país, ciudad, nombre, ROW_NUMBER() OVER(ORDENAR POR país DESC, ciudad DESC) rownum DESDE Viajar-muestra AS t1 DONDE t1.tipo = "hotel" /* predicado-1 */ Y BUSCAR(t1.descripción, "jardín") /* predicado-2 */ Y CUALQUIER r en reseñas satisface r.ratings.Service > 3 FIN; /* predicado-2 */ |
3. OPERADORES y FUNCIONES
He aquí un ejemplo de consulta que aprovecha los operadores y las funciones.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
SELECCIONE BAJO(país), /* función escalar */ ciudad, apellido || " " || nombre AS nombre completo /* operador de cadena */ ROW_NUMBER() OVER(ORDENAR POR país DESC, ciudad DESC) rownum /* función ventana */ DESDE Viajar-muestra AS t1 DONDE BAJO(t1.tipo) = "hotel" /* función escalar */ Y BUSCAR(t1.descripción, "jardín") Y ARRAY_CONTAINS(public_likes, "Joe Black") /* Función de matriz */ |
Este es el plan de consulta para esta consulta. IndexSearch realiza la solicitud de búsqueda FTS y se integra en el canal de ejecución de la consulta. Por lo tanto, la consulta se beneficia de todas las demás capacidades de N1QL. Esto refleja las etapas de la tubería en la figura anterior.
4. Tratamiento JOIN
La función SEARCH() también puede utilizarse como parte del proceso de unión. En este caso, el FTS se utiliza para encontrar todas las ciudades que tienen hoteles con jardín y luego se unen con aeropuertos.
1 2 3 4 5 6 7 8 9 10 11 |
SELECCIONE nombre.hotel hname, aeropuerto.ciudad DESDE Viajar-muestra hotel LEFT OUTER JOIN Viajar-muestra aeropuerto EN hotel.ciudad = aeropuerto.ciudad DONDE hotel.tipo = hotel Y BUSCAR(hotel.description, "jardín") Y aeropuerto.tipo = aeropuerto ; |
5. Expresiones comunes de tabla (CTE).
N1QL en el servicio de consulta soporta CTEs no recursivos. Puede utilizar SEARCH() dentro de cada expresión. La tabla derivada de esa expresión (hotel y aeropuerto) se utilizan como espacios clave dentro de la consulta.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
CON hotel AS ( SELECCIONE nombre, ciudad DESDE Viajar-muestra DONDE tipo = hotel Y buscar(descripción, "jardín")), aeropuerto AS ( SELECCIONE nombre, ciudad DESDE Viajar-muestra DONDE tipo = aeropuerto Y BUSCAR(ciudad, "angeles")) SELECCIONE nombre.hotel hname, aeropuerto.ciudad DESDE hotel INNER JOIN aeropuerto EN hotel.ciudad = aeropuerto.ciudad ORDENAR POR aeropuerto.ciudad, hotel.name; |
5. Uso en UPDATEs
SEARCH() puede utilizarse en cualquier lugar donde se permita un predicado dentro de otras sentencias DML.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/* INSERTAR EN... sentencia SELECT. */ INSERTAR EN mybucket (CLAVE id, VALORES v) SELECCIONE meta().id id, v DESDE Viajar-muestra v DONDE BUSCAR(v, "+tipo:hotel +descripción:limpio"); /* Declaración DELETE */ BORRAR DESDE Viajar-muestra DONDE BUSCAR(v, "+tipo:hotel +descripción:limpio"); /* Declaración UPDATE */ ACTUALIZACIÓN Viajar-muestra SET nuevo_campo = "¡busca y actualiza!" DONDE BUSCAR(v, "+tipo:hotel +descripción:limpio"); |
Los ejemplos pueden fluir mucho tiempo. He mostrado ejemplos comunes. Se utiliza en varias sentencias SQL (DMLs)
Conclusión:
Couchbase FTS proporciona un motor de búsqueda de texto escalable y distribuido. Lo hemos integrado perfectamente en N1QL en el servicio de consultas de Couchbase para que obtengas toda la potencia de las consultas con toda la potencia de la búsqueda. Hay más innovación sobre esto en la tubería. Permanece atento.