Hace poco escribí sobre Uso de la búsqueda de texto completo (FTS) en una aplicación Node.js que hace uso de Couchbase Server 4.5 y superior. Como sabrás, FTS está disponible como Developer Preview a partir de Couchbase Server 4.5. Esto es enorme para Couchbase porque abre la puerta en cuanto a posibilidades. En lugar de hacer consultas comodín ineficientes, podemos usar consultas de búsqueda contra índices de texto completo. La necesidad de usar ElasticSearch o Solr se hace menos necesaria también, a menos que por supuesto tu negocio esté construido alrededor de la búsqueda.
Vamos a tomar los ejemplos vistos en el artículo de Node.js y verlos en acción usando el lenguaje de programación Go. Si no te interesa Node.js o no estás familiarizado con el ejemplo utilizado, no te preocupes. En el ejemplo anterior teníamos un escenario imaginario de evaluación de currículums en el que podíamos escanear currículums de solicitantes de empleo en busca de palabras clave y puntuarlos. Seguiremos usando ese ejemplo.
Crear un nuevo proyecto con las dependencias
Para que este ejemplo sea fácil de entender, empezaremos desde cero. Dicho esto, se asume que ya tienes GoLang instalado y configurado en tu máquina y que Servidor Couchbase 4.5 ya está en marcha.
Cree un nuevo proyecto GoLang. Mi proyecto se encuentra en $GOPATH/src/github.com/nraboy/cbfts/main.go. Antes de saltar al código, necesitamos instalar el SDK de Couchbase Go. Desde el símbolo del sistema (Windows) o Terminal (Mac y Linux), ejecuta lo siguiente:
1 2 3 |
ir consiga github.com/couchbase/gocb |
En este punto estamos listos para empezar a desarrollar, pero antes necesitamos configurar los índices necesarios en nuestro bucket de Couchbase.
Crear un índice de búsqueda de texto completo en Couchbase Server
Antes de empezar a utilizar la búsqueda de texto completo, debe crear un índice especial. Esto puede hacerse desde Índices -> Texto completo del panel de control administrativo de Couchbase.
En esta sección deberá elegir Nuevo índice de texto completo y elige el nombre y el cubo sobre el que aplicarlo. Para este ejemplo utilizaremos el por defecto y un índice de búsqueda de currículum. Nuestro índice será muy básico, por lo que les animo a consultar el documentación para que pueda satisfacer mejor sus necesidades.
Una vez creado el índice, haga clic en el botón Actualizar. En este punto puedes probarlo a través del panel de control o de tu propio código.
Conocer el modelo de datos de ejemplo
Con el índice creado echemos un vistazo rápido a nuestro modelo de datos. Sabemos que este va a ser un documento similar a un curriculum vitae, así que con un poco de imaginación, podemos llegar a algo como esto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
{ "nombre": "Nic", "apellido": "Raboy", "habilidades": [ "java", "node.js", "golang", "nosql" ], "resumen": "Soy un tío guay que trabaja en cosas guays", "social": { "github": "https://www.github.com/nraboy", "twitter": "https://www.twitter.com/nraboy" }, "empleo": [ { "empleador": "Couchbase", "título: "Defensor de los desarrolladores", "localización": "San Francisco" } ] } |
El documento anterior contiene información como habilidades, información sobre redes sociales e historial laboral. Sí, una verdadera solicitud de creación de empleo probablemente tendrá muchos más detalles, pero esto es solo un ejemplo.
El ámbito al que vamos a prestar atención es el texto Promotor. Vamos a escribir código GoLang para buscar esa frase.
Desarrollo de la aplicación para la búsqueda de datos
Como este proyecto es un ejemplo sencillo, todo el código que escribamos estará en el único archivo main.go archivo. Empecemos por importar todas las dependencias que se utilizarán en la aplicación:
1 2 3 4 5 6 7 8 9 10 11 |
paquete principal importar ( "encoding/json" "fmt" "github.com/couchbase/gocb" "github.com/couchbase/gocb/cbft" ) |
Como puedes ver arriba, estamos incluyendo una dependencia JSON para marshalling estructuras en JSON. También estamos importando la dependencia Couchbase y Couchbase FTS.
Los datos que queremos recoger serán muy específicos. Por ello, sería una buena idea crear una nueva estructura de datos para acomodar esto. Llamemos a esta estructura FtsHit
y que tenga el siguiente aspecto:
1 2 3 4 5 6 |
tipo FtsHit struct { ID cadena `json:"id,omitempty"` Puntuación float64 `json:"puntuación,omitempty"` } |
Mantendremos el id del documento que se encuentra en la búsqueda así como la puntuación que la búsqueda devuelve en cada acierto. Cada una de estas propiedades de estructura tiene sus propias etiquetas JSON y serán ignoradas si están vacías.
Esto nos lleva al código mágico que se encuentra en nuestro principal
función.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
func principal() { grupo, _ := gocb.Conectar("couchbase://localhost") cubo, _ := grupo.OpenBucket("por defecto", "") consulta := gocb.Nueva búsqueda("currículum-búsqueda", cbft.NewMatchQuery("defensor del desarrollador")) resultado, _ := cubo.EjecutarBúsquedaConsulta(consulta) var ftsHit *FtsHit para _, hit := gama resultado.Hits() { ftsHit = &FtsHit{ID: hit.Id, Puntuación: hit.Puntuación} jsonHit, _ := json.Mariscal(&ftsHit) fmt.Imprimir(cadena(jsonHit)) } } |
Antes de empezar a buscar necesitamos establecer una conexión con nuestro cluster de Couchbase y abrir un bucket. Me conectaré a un nodo local y a la base de datos por defecto cubo. Una vez conectados, podemos crear una nueva consulta de búsqueda de texto completo utilizando la consulta creada anteriormente búsqueda de currículum índice. Esta consulta buscará el texto defensor del promotor en todos los documentos y en cualquier propiedad. Esencialmente, si el texto existe en cualquier parte de un documento, el documento se contará como un acierto.
Con la consulta en la mano, podemos ejecutarla y recorrer los resultados. Cada resultado tendrá ciertos fragmentos colocados en nuestro FtsHit
donde se convertirá en JSON y se imprimirá.
Hasta aquí todo bien, ¿verdad?
¿Qué ocurre cuando queremos ser un poco más específicos en nuestra búsqueda? Si bien es conveniente y genial poder buscar en todo un documento, tal vez sólo queremos buscar dentro del historial de empleo.
Podemos hacer un ajuste en el BúsquedaQuery
con poco esfuerzo:
1 2 3 |
consulta := gocb.Nueva búsqueda("currículum-búsqueda", cbft.NewMatchQuery("defensor del desarrollador").Campo("empleo.titulo")) |
Aunque hemos intentado que este ejemplo sea sencillo, hay un montón de cosas interesantes que se pueden hacer con la búsqueda de texto completo. Quizás quieras expandir las condiciones de búsqueda para ser más específico, o quizás quieras usar un índice que sea más específico. Más información sobre FTS se puede encontrar en el Couchbase documentación para desarrolladores.
Conclusión
Acabamos de ver lo fácil que es hacer uso de la búsqueda de texto completo (FTS) en Couchbase utilizando el lenguaje de programación Go. Usando FTS, podemos buscar dentro de documentos de forma más eficiente que usando consultas que incluyen un montón de comodines.
Para saber más sobre el FTS, visite Portal para desarrolladores de Couchbase.