Es inevitable: Si estás trabajando con una base de datos de documentos, eventualmente vas a necesitar buscar (y a través de) tus documentos JSON.
En este tutorial, añadirás las capacidades de búsqueda de texto completo de Couchbase a la API REST básica construida con Express que hemos estado construyendo a lo largo de esta serie de Node.js.
La entrada anterior de esta serie utilizó Express para construir una API básica para crear consultas N1QL.
El post de hoy te lleva un paso más allá. Aprenderás a encontrar documentos JSON que contengan el texto que buscas añadiendo una funcionalidad a tu aplicación que utilice el método Couchbase Buscar API. Empecemos.
¿Qué es la búsqueda de texto completo?
Búsqueda de texto completo (FTS) es un nombre extraño, pero es un concepto bien desarrollado en áreas académicas centradas en el análisis de grandes piezas de contenido de texto. En el ámbito de las bases de datos, lo llamamos simplemente "búsqueda" para abreviar, y se centra en encontrar texto dentro de documentos JSON.
Los desarrolladores de aplicaciones utilizan herramientas relacionadas con la búsqueda para encontrar coincidencias sin tener que escribir consultas SQL que normalmente requieren saber cómo/dónde encontrar los datos de interés. En un escenario de búsqueda de texto completo se busca texto con más sofisticación.
Por ejemplo, los sistemas de búsqueda comprenden las palabras raíz mediante un concepto conocido como stemming, por lo que no es necesario buscar manualmente muchas permutaciones de un término. Del mismo modo, los comodines, prefijos y emparejamiento difuso son posibles con sistemas de búsqueda robustos.
Creación de índices de búsqueda
La utilización de un sistema de búsqueda consta de dos pasos: (1) indexar/analizar el texto de cada documento y (2) solicitar una lista de documentos que contengan coincidencias basadas en el texto.
La fase de indexación es similar a la creación de índices secundarios para datos relacionales/tabulares, en la que se describen los campos o elementos que se van a indexar y el sistema los rastrea por ti. También puedes pedirle al sistema que indexe todos los campos de texto del documento, aunque para grandes conjuntos de datos esto puede no ser eficiente en producción.
La fase de consulta (es decir, la búsqueda) envía un texto al servidor para que éste lo busque. El sistema compara ese texto con los índices y devuelve una lista de documentos con coincidencias.
La búsqueda de texto completo es sencilla, pero hay un conjunto infinito de opciones y preguntas a tener en cuenta, como:
-
- Cómo manejar frases y números
- Identificar en qué parte de un documento se encuentra un texto determinado
- Análisis de textos en varios idiomas
En realidad, este es un tema que merece ser tratado en profundidad. Los patrones simples utilizados en este post se pueden ampliar a todos los diferentes escenarios de búsqueda como se describe en esta introducción a la búsqueda de texto completo.
Preparación de su instancia de Couchbase
Si eres nuevo en esta serie de tutoriales de codificación de JavaScript, debes instalar la aplicación viaje-muestra
cubo de datos, como se describe en el Documentación de Couchbase.
El script utilizado en el post anterior de esta serie también se va a utilizar como punto de partida para el post de hoy. El código Node.js está incluido en el final de ese post.
A medida que avanzas en estos tutoriales de Node.js vas construyendo una aplicación REST API más compleja y útil. Vamos a sumergirnos en la creación del índice de búsqueda necesario para apoyar el siguiente paso de tu proyecto.
Crear un índice de búsqueda de texto básico
Para crear un índice de búsqueda, seleccione la opción Buscar en
en la pestaña Consola web de Couchbase y pulse la tecla Añadir índice
botón.
A continuación, introduzca el nombre que desea dar al índice y elija qué Cubo analizar (viaje-muestra
). Finalice pulsando la tecla Crear índice
para enviar sus opciones. Hay muchas opciones diferentes para elegir, pero en el ejemplo de hoy, mantenemos todos los valores predeterminados para simplificar. La siguiente animación muestra cada uno de estos pasos:
Después de completar estos pasos, debería ver sus índices de búsqueda y su estado en la Consola Web. También debería poder ver cuántos documentos se han procesado.
Indexación en el viaje-muestra
data Bucket tarda unos minutos, pero una vez completado, puede realizar una solicitud de búsqueda de muestra a través de la interfaz de usuario web básica, como se muestra a continuación.
Introduzca un término sencillo en el cuadro de búsqueda y aparecerá una lista con los ID de los documentos coincidentes, con las coincidencias más destacadas en la parte superior. La Consola Web permite hacer clic fácilmente en estos ID para ver el texto completo del documento.
Creación de una función de búsqueda de texto simple
Hay muchas opciones adicionales para afinar las búsquedas con operaciones booleanas, coincidencias difusas, etc. La Consola Web sólo realiza una simple cadena de consulta
y este es el mismo tipo que implementarás en tu código.
Para crear la nueva función de búsqueda de texto completo es necesario:
- Proporcione una cadena para buscar (por ejemplo, "grand").
- Especifica el índice de búsqueda a utilizar:
travelsearch
. - Declara el tipo de consulta a utilizar:
queryString
. - Ensamble todas las piezas y envíelas al servidor.
- Recibir los resultados y mostrarlos al usuario/aplicación.
Estas cinco líneas de código JavaScript que aparecen a continuación son un ejemplo de cómo establecer estas variables, agruparlas, pasarlas al clúster e imprimir los resultados en la consola:
1 2 3 4 5 |
const querystr = "grand"; const searchIndex = travelsearch; const stringQuery = couchbase.BúsquedaQuery.queryString(querystr); const resultado de la búsqueda = grupo.searchQuery(searchIndex, stringQuery); consola.registro(resultado de la búsqueda); |
Si desea ajustar el tipo de consulta de búsqueda, cambie queryString
en la tercera línea con otro método. En la sección Documentación de Couchbase Full-Text Search.
Por ejemplo, una consulta de intervalo de fechas tiene el siguiente aspecto:
const dateQuery = couchbase.SearchQuery.dateRange().start(startDate).end(endDate)
A continuación se muestra un ejemplo completo de script independiente que incluye la lógica básica. Lo incorporamos al ejemplo de API REST Express en la siguiente sección.
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 |
var couchbase = requiere("couchbase"); async función principal(){ var grupo = nuevo couchbase.Grupo("couchbase://localhost", { nombre de usuario: "Administrador", contraseña: "Administrador" }); var cubo = grupo.cubo("viaje-muestra"); var colección = cubo.defaultCollection(); const querystr = "grand"; const searchIndex = travelsearch; const stringQuery = couchbase.BúsquedaQuery.queryString(querystr); const resultado de la búsqueda = await grupo.searchQuery(searchIndex, stringQuery); consola.registro(resultado de la búsqueda); si (resultado de la búsqueda.meta.estado.fallido == 0) { resultado de la búsqueda.filas.paraCada((fila)=>{ consola.registro(fila); }); } } principal(); |
Profundizar en el Código
Siguiendo con nuestro ejemplo, ahora puedes añadirlo al código de la API REST que hemos creado en tutorial de la semana pasada.
Añade el código junto con la nueva ruta Express para poder enviar una petición de búsqueda desde una URL en el navegador. En este caso, la ruta será: /buscar/[término de búsqueda]
- Por ejemplo /búsqueda/grande
.
He aquí la definición de la ruta para construir la consulta de búsqueda de texto completo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
aplicación.consiga(/búsqueda/:término de búsqueda, runAsync(async (consulte, res) => { const querystr = consulte.parámetros.searchterm; const searchIndex = travelsearch; const stringQuery = couchbase.BúsquedaQuery.queryString(querystr); const resultado de la búsqueda = await grupo.searchQuery( searchIndex, stringQuery, // añadir opciones en su propio objeto: { tiempo de espera:2000, límite:5} ).captura((e)=>{consola.registro(e); tirar e;}); si (resultado de la búsqueda.meta.estado.fallido == 0) { res.json(resultado de la búsqueda); resultado de la búsqueda.filas.paraCada((fila)=>{ consola.registro(fila); }) } })) |
Haga clic a continuación para ver el código completo de la API REST, incluidas las rutas de obtención de documentos, consulta N1QL y búsqueda:
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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
var aplicación = requiere(exprés)(); var couchbase = requiere("couchbase"); async función principal() { aplicación.consiga('/get/:docid', runAsync(async (consulte, res) => { var docid = consulte.parámetros.docid; var docjson = await getDoc(docid, función(err, resultado){ res.json(resultado.contenido) }); res.json(docjson.contenido); })); aplicación.consiga(/consulta/:nombreciudad, runAsync(async (consulte, res) => { var nombre de la ciudad = consulte.parámetros.nombre de la ciudad; var querystr = `SELECT tipo, nombre, ciudad FROM `viaje-muestra` WHERE ciudad = $CITY;` var parámetros = { parámetros: { CIUDAD: nombre de la ciudad}} await grupo.consulta(querystr, parámetros, función(err, resultado){ res.json(resultado) }) })); aplicación.consiga(/búsqueda/:término de búsqueda, runAsync(async (consulte, res) => { const querystr = consulte.parámetros.searchterm; const searchIndex = travelsearch; const stringQuery = couchbase.BúsquedaQuery.queryString(querystr); const resultado de la búsqueda = await grupo.searchQuery( searchIndex, stringQuery, // añadir opciones en su propio objeto: {tiempo de espera:2000, límite:5} ).captura((e)=>{consola.registro(e); tirar e;}); si (resultado de la búsqueda.meta.estado.fallido == 0) { res.json(resultado de la búsqueda); resultado de la búsqueda.filas.paraCada((fila)=>{ consola.registro(fila); }) } })) aplicación.escuche(3000, () => consola.registro(Escuchando en el puerto 3000)); función runAsync (devolución de llamada) { devolver función (consulte, res, siguiente) { devolución de llamada(consulte, res, siguiente) .captura(siguiente) } } var grupo = nuevo couchbase.Grupo("couchbase://localhost", { nombre de usuario: "Administrador", contraseña: "Administrador" }); var cubo = grupo.cubo("viaje-muestra"); var colección = cubo.defaultCollection(); var getDoc = async (clave) => { var resultado = await colección.consiga(clave); consola.registro(resultado) devolver resultado } } principal(); |
Ejecución de la API REST de consulta de búsqueda
Acceda a la aplicación a través del navegador web en el puerto 3000 y con la ruta de búsqueda: http://localhost:3000/search/grand
.
Los resultados de la búsqueda se muestran aquí e incluyen una lista de ID de documentos coincidentes y la puntuación de clasificación de la coincidencia:
1 2 3 4 5 6 7 8 9 10 |
{"filas":[{"índice":"travelsearch_1bf0c4c01d25b582_4c1c5584","id":"hito_21813","puntuación":1.063667683545401,"clasificar":["_score"]}, {"índice":"travelsearch_1bf0c4c01d25b582_4c1c5584","id":"aeropuerto_7057","puntuación":1.016530994468649,"clasificar":["_score"]}, {"índice":"travelsearch_1bf0c4c01d25b582_4c1c5584","id":"aeropuerto_4063","puntuación":1.0098211451111556,"clasificar":["_score"]}, {"índice":"travelsearch_1bf0c4c01d25b582_4c1c5584","id":"aeropuerto_3442","puntuación":1.0098211451111556,"clasificar":["_score"]}, {"índice":"travelsearch_1bf0c4c01d25b582_4c1c5584","id":"aeropuerto_6448","puntuación":1.0032424768865669,"clasificar":["_score"]}], "meta":{"status":{"total":1,"fallido":0,"con éxito":1},"solicitud":{"consulta":{"consulta":"grand"},"tamaño":5,"de":0,"destacar":null, "campos":null,"facetas":null,"explicar":falso, "clasificar":["-_score"],"incluirLocalizaciones":falso, "buscar_después":null,"search_before":null}, "éxitos":[],"total_hits":169,"max_score":1.063667683545401,"tomó":208427,"facetas":null}} |
Tenga en cuenta que los resultados de la búsqueda también incluyen algunos metadatos útiles que muestran el número total de aciertos/parejas, el tiempo de ejecución y mucho más.
Conclusión
Las posibilidades de uso de Couchbase en aplicaciones basadas en búsquedas son infinitas.
Con todos los diferentes tipos de consultas y otras opciones de búsqueda disponibles, aún queda mucho por aprender. Aquí tienes algunos puntos de partida:
-
- Lea la documentación y sustituya por otro tipo de consulta de búsqueda.
- Complete el Curso de certificación de Node.js y Couchbase.
- Toma el curso gratuito en línea de certificación de arquitecto que cubre la búsqueda de texto completo y más
Con esto terminamos esta serie sobre desarrollo con Node.js y Couchbase. ¡Buena suerte en tu viaje continuo con JavaScript!
Póngase al día con el resto de la serie Node.js + Couchbase how-to:
-
- Cómo empezar con el SDK de Node.js para Couchbase
- Cómo crear llamadas asíncronas Get/Upsert con Node.js y Couchbase
- Construir una aplicación basada en REST con Node.js, Express y Couchbase
- Cómo consultar datos JSON con N1QL para Node.js y Couchbase
- Cómo añadir la función de búsqueda de texto completo a su aplicación JavaScript
Descargue Couchbase 7 hoy mismo