¿Cuántas veces has escrito una consulta SQL que utilizaba un COMO
y algunos comodines para buscar texto en una cadena? ¿Qué rendimiento obtuviste cuando lo ejecutaste con millones de registros? Probablemente no fue bueno, ¿verdad?
Aunque puedes usar comodines en SQL, probablemente no sea la mejor manera para la mayoría de los escenarios. Esto incluye las consultas N1QL. En su lugar, conozca Full Text Search (FTS), una tecnología que ha existido por un tiempo, pero recientemente incluida en Couchbase Servidor.
La búsqueda de texto completo en Couchbase se basa en Bleveuna biblioteca de búsqueda e indexación escrita en Golang.
Búsqueda difusa con búsqueda de texto completo en Couchbase
Cuando se compara FTS con una consulta comodín N1QL o SQL, hay algo más que comparar que el mero aspecto del rendimiento. Tomemos como ejemplo su capacidad de coincidencia difusa. Supongamos que tenemos la siguiente consulta:
1 |
SELECCIONAR * DESDE `por defecto` DONDE mensaje COMO '%bananas%'; |
¿Qué ocurre si la base de datos tiene un registro que contiene Plátanos con mayúsculas B? En esta circunstancia no se incluiría en los resultados. ¿Qué ocurre si eres como yo y no sabes deletrear, dejando resultados como plátanos en la base de datos? Tampoco se incluirá en los resultados.
Con la búsqueda de texto completo, se puede realizar la siguiente consulta con un factor de imprecisión:
1 |
plátano~2 |
Ignorando que SQL y FTS tienen una sintaxis de consulta diferente, lo anterior ofrecería dos factores de imprecisión. Esto significa que dos caracteres del término de búsqueda pueden alterarse para llegar a nuestro resultado. Nuestros datos podrían incluir cualquiera de los siguientes:
1 2 3 4 |
plátano bannanna bana bnan |
No se limita sólo a los cuatro anteriores, pero se entiende la idea.
Pero, ¿y si nuestra base de datos contiene bandana que en este caso no es un error tipográfico. ¿Realmente queremos que las búsquedas de otros elementos legítimos aparezcan en nuestros resultados?
Al ejecutar una consulta de búsqueda de texto completo para un término o conjunto de términos, cada resultado se puntúa en función de su relevancia para la consulta de búsqueda inicial. Puede envolver su lógica de negocio alrededor de los resultados puntuados.
Los distintos tipos de consultas en la búsqueda de texto completo de Couchbase
Hay muchas tipos de consultas FTS que se pueden realizar en Couchbase. El tipo de consulta que he estado mencionando hasta ahora se clasifica mejor como una consulta de coincidencia, donde el término de búsqueda se utiliza para comparar con el índice con y sin confusión.
Otros tipos de consulta son, entre otros:
- Coincidencia, Frase, Difuso, Prefijo, Regexp, Comodín, Campo booleano
- Conjunción, Disyunción, Booleano, Doc ID
- Intervalo de fechas, Intervalo numérico
- Cadena de consulta
Cada tipo de consulta está diseñado para una tarea diferente. Encontrará más información sobre su función en la sección documentación oficial en relación con los tipos de consultas.
Creación de un índice de búsqueda de texto completo en Couchbase
Antes de poder realizar una búsqueda, se debe crear un índice. Esto no debe confundirse con los índices N1QL, ya que son dos cosas muy diferentes.
Dentro del Panel Administrativo de Couchbase, tendrás la oportunidad de crear índices de Búsqueda de Texto Completo.
Para crear un índice, tendrás que darle un nombre y asignarle un bucket. Debe producirse un mapeo, por lo que deberás especificar qué propiedad del documento representa el tipo de documento JSON que es. Tomemos como ejemplo lo siguiente
1 2 3 4 5 |
{ "tipo": "persona", "nombre": "Nic", "apellido": "Raboy" } |
En tipo
obviamente dice que este documento en particular es un persona
documento.
Con el tipo JSON asignado al tipo de documento, deben producirse más asignaciones. Por ejemplo, digamos que este índice en particular es para persona
documentos. Se debe crear una nueva correspondencia de tipos y nombrarla de forma adecuada a lo que pueda existir en el documento de tipo
propiedad.
Ahora, dependiendo de cómo quieras indexar tus campos, puedes elegir indexar todo, o indexar sólo ciertas propiedades. Si desea indexar ciertas propiedades, deberá añadir un nuevo campo hijo debajo del mapeo de tipos que acabamos de crear.
Indexar determinadas propiedades significa que cuando se ejecute la búsqueda, sólo se buscará en esas propiedades, no en todos los campos del documento.
Incluya el FTS en sus aplicaciones
Con un índice creado, probablemente queramos incluir funcionalidad en una aplicación usando uno de los varios SDKs de Couchbase Server.
Supongamos que queremos hacer una Match Query con Node.js. El código podría ser algo como lo siguiente:
1 2 3 4 5 |
var BúsquedaQuery = Couchbase.BúsquedaQuery; var consulta = BúsquedaQuery.nuevo("NOMBRE-ÍNDICE-AQUÍ", BúsquedaQuery.match("BUSCAR-CONSULTAR-AQUÍ")); consulta.campos(["CAMPOS", "A", "VOLVER", "CON", "SENDERO", "DEFINIDO]); consulta.destacar(BúsquedaQuery.ResaltarEstilo.HTML, "CAMPO"); cubo.consulta(consulta, devolución de llamada); |
En el ejemplo anterior, se crea una nueva consulta contra un índice especificado. El término de búsqueda se introduce en la consulta. La consulta puede personalizarse aún más para incluir determinados campos en la respuesta, así como si el resultado de la búsqueda debe recibir marcado HTML para resaltarlo.
Lo mismo puede conseguirse en Java con el siguiente código:
1 2 3 4 |
MatchQuery fts = BúsquedaQuery.match("BUSCAR-CONSULTAR-AQUÍ"); BúsquedaQuery consulta = nuevo BúsquedaQuery("NOMBRE-ÍNDICE-AQUÍ", fts); consulta.campos("CAMPOS", "A", "VOLVER"); consulta.destacar(ResaltarEstilo.HTML, "CAMPO"); |
¿Notas las similitudes entre los dos lenguajes tan diferentes? Las APIs entre los SDKs están pensadas para ser similares y se pueden ampliar fácilmente, por ejemplo, se puede añadir un valor de fuzziness.
Conclusión
Full Text Search (FTS) es una característica increíble en Couchbase Server 5.0 y superiores. Te permite buscar de manera muy eficiente y más natural que añadir un montón de caracteres comodín a una consulta N1QL.
Para más información sobre el FTS, consulte la página Portal para desarrolladores de Couchbase.