Búsqueda de texto completo (o FTS) es una nueva característica que está siendo lanzada como vista previa para desarrolladores en Couchbase 4.5. No está pensada para producción, y aún no está soportada, pero es un vistazo a lo que está por venir.
Al ofrecer la posibilidad de buscar, un simple LIKE '%foo%'
con N1QL no es suficiente. Sus usuarios esperan una experiencia de búsqueda más rica: que tenga en cuenta el idioma y ordene los resultados por su relevancia.
En esta entrada del blog, te lo voy a mostrar:
- Cómo crear un índice de búsqueda de texto completo
- Cómo ejecutar una consulta de búsqueda de texto completo en la aplicación Consola Couchbase
- Cómo ejecutar una consulta de búsqueda de texto completo con resaltado en ASP.NET
Crear un índice de búsqueda de texto completo
En primer lugar, debe asegurarse de que está utilizando Couchbase 4.5 (beta, al menos)Asegúrate de que tienes acceso a la consola de Couchbase y de que tu clúster está ejecutando un servicio Full Text. Puedes comprobar si tienes un servicio Full Text en ejecución haciendo clic en "Nodos de Servidor" en la Consola de Couchbase. Los servicios (como Full Text) tienen que ser activados/desactivados cuando se añade un nodo al cluster. Si necesitas un repaso, echa un vistazo a mi entrada de blog sobre cómo instalar y configurar Couchbase en Windows.
Voy a configurar un índice de búsqueda de texto completo en el
cubo de datos de muestra. Puede instalarlo yendo a Ajustes -> Cubos de muestra, seleccionando 'travel-sample' y haciendo clic en "Crear".viaje-muestra
En estos datos de ejemplo, hay documentos de tipo "landmark". Entre otras cosas, estos documentos contienen campos de "contenido". He aquí un fragmento de uno de los documentos landmark. (ID 'landmark_16079' si nos está siguiendo):
1 2 3 4 5 6 7 |
{ "título: "Londres/Ciudad de Londres", "nombre": "20 Fenchurch Street", "contenido": "Lo insólito"walkie talkie"El perfil de este rascacielos en construcción, obra de Rafael Vinoly, ha acaparado los titulares"., "tipo": "hito" } |
Con esa estructura en mente, vamos a crear el índice. Ve a Índices->Texto completo, y haz clic en "Nuevo índice de texto completo".
Voy a nombrar el índice viaje-muestra-idx
y ponerlo en el viaje-muestra
cubo. Hay un montón de opciones aquí, pero sólo voy a cubrir las asignaciones de tipo. Expanda "Type Mappings", y haga clic en "Add Type Mapping". Esto le permite restringir la búsqueda de texto completo a documentos de un determinado tipo (en este caso, "landmark", que coincide con el campo "type"). Marque también la casilla "indexar sólo los campos especificados"; de lo contrario, se indexarán todos los campos de los documentos para la búsqueda. Pulsa "Aceptar".
A continuación, pase el ratón por encima de la asignación de tipo "punto de referencia" y haga clic en el icono +
y haga clic en "insertar campo secundario". Si quieres indexar datos de búsqueda que están más abajo en la jerarquía de tu documento, entonces necesitarías 'insertar campo hijo' (tantos niveles como haga falta) hasta llegar a él. En nuestro caso, el campo de contenido está en el nivel raíz, así que no necesito hacer eso.
Para el campo hijo, introduzca el nombre del campo ("contenido") en el campo, deje todo lo demás como está, y marque la casilla "almacenar" (más sobre esto más adelante), y pulse "ok".
Por último, edite la asignación de tipos "por defecto" y desmarque la opción "activado". Esta asignación permitiría la búsqueda en todos los documentos, pero en este ejemplo queremos limitarla sólo a landmark. Pulsa "Aceptar" y "Crear índice".
Después de pulsar "Crear índice", se te mostrará una vista general del índice que acabas de crear. Comenzará inmediatamente a indexar documentos. Si pulsa el botón Actualizar
se le mostrará el recuento de los documentos indexados hasta el momento.
Será 100% cuando esté completo.
Ejecutar una consulta de búsqueda de texto completo en la consola de Couchbase
Antes de entrar en C#/.NET, puedes probar la búsqueda de texto completo directamente desde la consola. Vaya a Índices->Texto completo, y seleccione el índice de texto completo que acaba de crear. Introduce un término de búsqueda (si estás utilizando la muestra de viajes, "posada", "rascacielos" o "bed and breakfast" son buenos términos para probar.
Cuando haga clic en buscar, obtendrá una página de resultados de búsqueda (ID del documento y un fragmento de contenido) ordenados según su puntuación de relevancia. Observe que los términos de búsqueda aparecen resaltados en el fragmento de contenido. Habilitar "almacenar" en el campo hijo hace que esto funcione. Si no lo hace, seguirá obteniendo los resultados de los documentos en el orden correspondiente, pero no obtendrá el fragmento de contenido resaltado.
Tenga en cuenta que la búsqueda de texto completo utiliza Blevey permite realizar búsquedas más complejas (frases exactas, consultas booleanas, etc.). Pruebe a buscar "cama y desayuno"
o cama-desayuno
por ejemplo, a ver qué pasa.
Consulta de búsqueda de texto completo con resaltado en ASP.NET
Una vez que estés satisfecho con el índice de búsqueda de texto completo que has creado, es hora de sacarlo de la consola de Couchbase y llevarlo a una aplicación real. He creado un ejemplo en ASP.NET que demuestra cómo usar el SDK .NET de Couchbase para realizar una búsqueda de texto completo. Para este ejemplo, asumo que te sientes cómodo con ASP.NET MVC y con los fundamentos de la integración de ASP.NET con Couchbase. Si ese no es el caso, te recomiendo que revises la sección Ejemplo de "Hola Mundo" de ASP.NET sobre el que escribí anteriormente en el blog.
He creado dos acciones: Índice y Búsqueda. La acción Index muestra una vista que permite al usuario escribir una cadena de búsqueda. Aquí está el controlador y la acción:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
público clase InicioControlador : Controlador { privado sólo lectura IBucket _bucket; público InicioControlador(IBucket cubo) { _bucket = cubo; } público VerResultado Índice() { devolver Ver(); } } |
Y aquí está la vista en Index.cshtml:
1 2 3 4 5 6 7 8 |
<h1>Buscar en</h1> @utilizando (Html.BeginForm("Buscar", "Inicio")) { @Html.Cuadro de texto("q","") } |
No es bonito, pero es funcional. A continuación, he creado una acción de búsqueda. Esta acción tomará la consulta de búsqueda y mostrará los resultados de Couchbase. Los resultados serán muy similares a los que vimos en la consola de Couchbase: ID del documento, puntuación de relevancia y fragmentos resaltados.
Hay tres pasos para ejecutar una búsqueda de texto completo:
- Instanciar algún objeto que implemente
ISearchQuery
. Hay muchas opciones; yo utilizoMatchQuery
para este ejemplo. - Instanciar un objeto SearchParams para especificar las opciones de búsqueda.
- Utilice un
IBucket
para ejecutar la consulta+parámetros y obtener resultados.
En este ejemplo, he realizado los tres pasos directamente en la acción Buscar:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
público AcciónResultado Buscar en(cadena q) { si (cadena.IsNullOrEmpty(q)) devolver Ver("Índice"); var consulta = nuevo MatchQuery(q); var searchParams = nuevo Parámetros de búsqueda() .Límite(10) .Tiempo de espera(TimeSpan.DesdeMilisegundos(10000)) .Destacando(HighLightStyle.Html); var resultados = _bucket.Consulta("muestra-viaje-idx", consulta, searchParams); var searchResultsModel = nuevo SearchResultsModel(q, resultados); devolver Ver(searchResultsModel); } |
Algunas notas sobre los SearchParams:
- Lo limito a los 10 primeros. También hay un método Skip() que puedes usar para paginar.
- Estoy estableciendo un tiempo de espera de 10000ms. Si creo el índice correctamente, los resultados serán devueltos muy rápidamente, pero si jugueteo con el índice y algo va mal, quiero que la búsqueda falle rápidamente.
- Estoy configurando el estilo de resaltado como HTML. Esto pondrá el
alrededor de los términos de búsqueda resaltados en los resultados de los fragmentos.
También he creado un SearchResultsModel
modelo de vista. Esto hace el mapeo que necesito para obtener el ID del documento, puntuación, fragmentos de los resultados de búsqueda (así como las palabras clave que el usuario escribió).
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 |
público clase SearchResultsModel { público Lista Resultados { consiga; privado configure; } público cadena Palabras clave { consiga; privado configure; } público SearchResultsModel(cadena palabras clave, ISearchQueryResult resultados = null) { Palabras clave = palabras clave; Resultados = resultados == null ? nuevo Lista() : resultados.Hits.Seleccione(r => nuevo SearchResultModel(r)).ToList(); } } público clase SearchResultModel { público cadena DocumentId { consiga; privado configure; } público doble Puntuación { consiga; privado configure; } público Lista Fragmentos { consiga; configure; } público SearchResultModel(ISearchQueryRow searchQueryRow) { DocumentId = searchQueryRow.Id; Puntuación = searchQueryRow.Puntuación; Fragmentos = searchQueryRow.Fragmentos.SelectMany(f => f.Valor).ToList(); } } |
Por último, aquí está la vista Search.cshtml:
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 |
@modelo FullTextSearchExample.Modelos.SearchResultsModel <h1>Buscar en</h1> @utilizando (Html.BeginForm("Buscar", "Inicio")) { @Html.Cuadro de texto("q", Modelo.Palabras clave) } @si (!Modelo.Resultados.Cualquier()) { No resultados encontrado } si no { foreach (var resultado en Modelo.Resultados) { <h2>Documento: @resultado.DocumentId</h2> <h3>Puntuación: @resultado.Puntuación</h3> foreach (var fragmento en resultado.Fragmentos) { @Html.En bruto(fragmento) } } } |
No es una página HTML muy bonita, pero es funcional. Esto es lo que parece en acción:
Conclusión
Recuerda que esta característica es sólo una vista previa para desarrolladores: aún no está soportada y aún no se recomienda para producción. Pero la búsqueda de texto completo está llegando a Couchbase. De hecho, puedes opinar sobre cómo se implementará esta función. Echa un vistazo a la Búsqueda de texto completo RFC en GitHuby no dude en hacer preguntas o dejar comentarios.
¿Aún tiene preguntas? ¿Necesitas ayuda? Déjanos un comentario, ping me on Twittero envíeme un correo electrónico (matthew.groves AT couchbase DOT com).