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 |
SELECT country, city, name, ROW_NUMBER() OVER(ORDER BY country DESC, city DESC) rownum FROM `travel-sample` AS t1 WHERE t1.type = "hotel" AND SEARCH(t1.description, "garden") AND ANY r in reviews satisfies r.ratings.Service > 3 END; |
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 |
SELECT country, city, name, ROW_NUMBER() OVER(ORDER BY country DESC, city DESC) rownum FROM `travel-sample` AS t1 WHERE t1.type = "hotel" /* predicate-1 */ AND SEARCH(t1.description, "garden") /* predicate-2 */ AND ANY r in reviews satisfies r.ratings.Service > 3 END; /* predicate-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 |
SELECT LOWER(country), /* scalar function */ city, lastname || " " || firstname AS fullname /* string operator */ ROW_NUMBER() OVER(ORDER BY country DESC, city DESC) rownum /* window function */ FROM `travel-sample` AS t1 WHERE LOWER(t1.type) = "hotel" /* scalar function */ AND SEARCH(t1.description, "garden") AND ARRAY_CONTAINS(public_likes, "Joe Black") /* Array function */ |
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 |
SELECT hotel.name hname, airport.city FROM `travel-sample` hotel LEFT OUTER JOIN `travel-sample` airport ON hotel.city = airport.city WHERE hotel.type = 'hotel' AND SEARCH(hotel.description, "garden") AND airport.type = 'airport' ; |
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 |
WITH hotel AS ( SELECT name, city FROM `travel-sample` WHERE type = 'hotel' AND search(description, "garden")), airport AS ( SELECT name, city FROM `travel-sample` WHERE type = 'airport' AND SEARCH(city, "angeles")) SELECT hotel.name hname, airport.city FROM hotel INNER JOIN airport ON hotel.city = airport.city ORDER BY airport.city, 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 |
/* INSERT INTO... SELECT statement. */ INSERT INTO mybucket (KEY id, VALUES v) SELECT meta().id id, v FROM `travel-sample` v WHERE SEARCH(v, "+type:hotel +description:clean"); /* DELETE statement */ DELETE FROM `travel-sample` WHERE SEARCH(v, "+type:hotel +description:clean"); /* UPDATE statement */ UPDATE `travel-sample` SET new_field = "search n update!" WHERE SEARCH(v, "+type:hotel +description:clean"); |
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.




