Hace dos semanas McGraw Hill presentó en CouchConf SF y nuestros usuarios expresaron tanto interés que pensé en compartir más detalles en un blog. A principios de este año McGraw Hill y Couchbase se unieron para construir una aplicación de prueba de concepto que muestra el poder de usar Couchbase y ElasticSearch juntos.
El objetivo del proyecto era construir un portal de aprendizaje autoadaptable que ofreciera resultados personalizados. En concreto, eso significaba:
- Permitir a los usuarios navegar y buscar una variedad de contenidos (artículos, imágenes y vídeo)
- Acceso rápido a contenidos y metadatos
- Mejorar los perfiles de los usuarios basándose en sus comportamientos y acciones
- Incorporar el perfil del usuario a las consultas de búsqueda y ofrecer resultados personalizados.
Arquitectura
Se utilizó Couchbase Server para almacenar todos los metadatos de contenido, así como la fuente de texto completo de los artículos de texto. Esto permite a la aplicación acceder al conjunto de datos primarios con una latencia inferior al milisegundo.
Se eligió ElasticSearch para gestionar los requisitos de búsqueda de texto completo de la aplicación. ElasticSearch combina una gran capacidad de consulta con una excelente capacidad de agrupación, lo que lo convierte en un gran complemento para Couchbase. La integración entre Couchbase Server y ElasticSearch se llevó a cabo mediante la aplicación Complemento Couchbase Transport. Este transporte utiliza la función Cross Data Center Replication de Couchbase Server 2.0 para transferir de forma fiable todas las mutaciones de documentos al índice de ElasticSearch (Más información).
En el front-end, se tomó la decisión de construir la aplicación utilizando Ruby on Rails. Nuestro principal objetivo en el código era documentar claramente las mejores prácticas al utilizar Couchbase y ElasticSearch juntos.
Portal de aprendizaje
Esto es lo que ve un usuario cuando se conecta por primera vez a la aplicación.
Acceso rápido a documentos con Couchbase Client SDK
Cuando un usuario selecciona sobre un contenido concreto, los datos se cargan directamente desde Couchbase Server por su clave. Aquí tienes un documento de ejemplo en Couchbase:
"título: "Vince Shields",
"url": "http://en.wikipedia.org/wiki/Vince_Shields",
"tipo": "texto",
"is_text": 1,
"is_video": 0,
"is_image": 0,
"popularidad": 0,
"vistas": 0,
"categorías": [
"1900 nacimientos",
"1952 muertes",
"Gente del béisbol de New Brunswick",
"Colillas de lanzadores de béisbol canadienses",
"Fort Smith Twins jugadores",
"Actores de Independence Producers",
"Lanzadores de las Grandes Ligas de Béisbol",
"Jugadores de las Grandes Ligas de Canadá",
"Gente de Fredericton",
"Jugadores de los St. Louis Cardinals"
],
"timestamp": “2012-01-06T02:27:11Z”,
"contenido": "{{Infobox Jugador MLBn|name=Vince Shields...",
"autores": [
{
"nombre": "Chris el deletreador"
}
],
"colaboradores": [
{
"nombre": "Chris el deletreador",
"timestamp": “2012-01-06T02:27:11Z”
}
]
}
Top Contributors y Top Tags usando Couchbase Map Reduce Views
Los usuarios del sistema pueden navegar por los contenidos explorando los principales colaboradores y las principales etiquetas del sistema.
Veamos con más detalle cómo se determinan las etiquetas principales.
En primer lugar, aquí está la función de mapa que estamos utilizando:
si (doc.tipo){
doc.categorías.paraCada(función(categoría){
emite(categoría, null);
});
}
}
Y estamos utilizando el built-in reducir Cuenta
Cuando accedemos a esta vista con un group_level de 1, vemos cada etiqueta y el número de veces que se ha utilizado para describir un documento.
Las vistas de Couchbase se ordenan por la clave, por lo que no podemos consultar directamente las 8 etiquetas principales. En su lugar, tenemos un trabajo que se ejecuta cada 10 minutos, consulta esta vista, ordena los resultados, y almacena los 8 mejores resultados en otro documento en Couchbase. Este es el aspecto del documento:
"Etiquetas: [
{
"nombre": "Gente viva",
"contar": 27554
},
{
"nombre": "Plantillas Persondata sin parámetro de descripción corta",
"contar": 20971
},
{
"nombre": "Todos los artículos con declaraciones sin fuente",
"contar": 13509
},
{
"nombre": "Lista negra de comentarios sobre artículos",
"contar": 9205
},
{
"nombre": "Artículos con hCards",
"contar": 9028
},
{
"nombre": "Páginas de desambiguación",
"contar": 5912
},
{
"nombre": "Artículos sin fuentes de diciembre de 2009",
"contar": 4158
},
{
"nombre": "Plantilla de categoría Commons sin conjunto de categorías",
"contar": 2904
}
]
}
Ahora, tenemos un acceso muy rápido a los top-tags actualizados cada 10 minutos.
Búsqueda de texto completo
Los usuarios del sistema también pueden realizar consultas de búsqueda complejas.
Mediante esta interfaz, un usuario puede buscar el término "agua". El resultado es una consulta de búsqueda enviada a ElasticSearch:
"consulta": {
"cadena_de_consulta": {
"consulta": "agua"
}
}
}
Esta consulta en particular coincide con 42 documentos, a continuación se muestra un subconjunto de la respuesta que muestra 1 documento:
"tomó": 5,
"timed_out": falso,
"...fragmentos...: {
"total": 5,
"con éxito": 5,
"fallido": 0
},
"éxitos": {
"total": 42,
"max_score": 1.0178552,
"éxitos": [
{
"_index": "portal_de_aprendizaje",
"_tipo": couchbaseDocument,
"_id": 18087337,
"_score": 1.0178552,
"_fuente": {
"meta": {
"id": 18087337,
"rev": 1–0017a16b2b29dc9c0000000000000000,
"banderas": 0,
"caducidad": 0
}
}
},…
Lo importante a tener en cuenta aquí es que el cuerpo completo del documento no se incluye en la respuesta de ElasticSearch. Esto se hizo por diseño, ya que configuramos el índice para no almacenar los documentos fuente completos. La razón es simple, ya tenemos acceso rápido a los documentos en Couchbase. Usando el SDK del cliente de Couchbase, podemos realizar una operación multi-get y extraer eficientemente los cuerpos de los documentos. Esto nos permite renderizar la pantalla de resultados de búsqueda:
Más información
- Echa un vistazo a la presentación de Chris Tse en la CouchConf
- Todo el código fuente del Portal de Aprendizaje está disponible en github
- ¿Quieres saber más sobre la integración de Couchbase con ElasticSearch y que respondamos a tus preguntas? Regístrate en asista al seminario web el 24 de octubre
¡¡Muy bonito!! Impresionante. CouchBase es simplemente increíble. Sin embargo, me duele que no tengamos un SDK estándar Erlang/OTP para CouchBase 2.0. ¿Alguna razón por la que un lenguaje como Erlang se queda fuera? De todas formas, gracias por este POST.
Aún no existe un SDK completo, pero hay una librería cliente de código abierto basada en NIF de algunas personas con ideas afines. El enlace está en http://www.couchbase.com/devel.... Sería estupendo recibir más opiniones y contribuciones al respecto.
Me gustaría crear un proyecto con Couchbase pero no puedo conectarme con PHP 5.
Estoy usando Xampp en Windows Seven 64 bits y CouchBase Server 2.0.
¿Puede alguien ayudarme?
Lo he intentado todo.
Hola Simon,
Publicar comentarios en este foro no es la mejor manera de obtener ayuda. Le recomiendo que envíe su pregunta a uno de los siguientes:
1. Couchbase google group:
https://groups.google.com/foru…
2. Foros de Couchbase
http://www.couchbase.com/forum…