{"id":1587,"date":"2014-12-16T19:26:47","date_gmt":"2014-12-16T19:26:47","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1587"},"modified":"2023-06-28T00:25:56","modified_gmt":"2023-06-28T07:25:56","slug":"creating-content-store-couchbase-learning-portal","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/creating-content-store-couchbase-learning-portal\/","title":{"rendered":"Creaci\u00f3n de un almac\u00e9n de contenidos con Couchbase - El portal de aprendizaje"},"content":{"rendered":"<p>Hace dos semanas McGraw Hill present\u00f3 en CouchConf SF y nuestros usuarios expresaron tanto inter\u00e9s que pens\u00e9 en compartir m\u00e1s detalles en un blog. A principios de este a\u00f1o McGraw Hill y Couchbase se unieron para construir una aplicaci\u00f3n de prueba de concepto que muestra el poder de usar Couchbase y ElasticSearch juntos.<\/p>\n<p>El objetivo del proyecto era construir un portal de aprendizaje autoadaptable que ofreciera resultados personalizados. En concreto, eso significaba:<\/p>\n<ul>\n<li>Permitir a los usuarios navegar y buscar una variedad de contenidos (art\u00edculos, im\u00e1genes y v\u00eddeo)<\/li>\n<li>Acceso r\u00e1pido a contenidos y metadatos<\/li>\n<li>Mejorar los perfiles de los usuarios bas\u00e1ndose en sus comportamientos y acciones<\/li>\n<li>Incorporar el perfil del usuario a las consultas de b\u00fasqueda y ofrecer resultados personalizados.<\/li>\n<\/ul>\n<h3>Arquitectura<\/h3>\n<p>Se utiliz\u00f3 Couchbase Server para almacenar todos los metadatos de contenido, as\u00ed como la fuente de texto completo de los art\u00edculos de texto. Esto permite a la aplicaci\u00f3n acceder al conjunto de datos primarios con una latencia inferior al milisegundo.<\/p>\n<p>Se eligi\u00f3 ElasticSearch para gestionar los requisitos de b\u00fasqueda de texto completo de la aplicaci\u00f3n. ElasticSearch combina una gran capacidad de consulta con una excelente capacidad de agrupaci\u00f3n, lo que lo convierte en un gran complemento para Couchbase. La integraci\u00f3n entre Couchbase Server y ElasticSearch se llev\u00f3 a cabo mediante la aplicaci\u00f3n\u00a0<a href=\"https:\/\/github.com\/couchbaselabs\/elasticsearch-transport-couchbase\" rel=\"nofollow\">Complemento Couchbase Transport<\/a>. Este transporte utiliza la funci\u00f3n Cross Data Center Replication de Couchbase Server 2.0 para transferir de forma fiable todas las mutaciones de documentos al \u00edndice de ElasticSearch (<a href=\"https:\/\/www.couchbase.com\/blog\/es\/couchbase-and-full-text-search-couchbase-transport-elasticsearch\/\" rel=\"nofollow\">M\u00e1s informaci\u00f3n<\/a>).<\/p>\n<p>En el front-end, se tom\u00f3 la decisi\u00f3n de construir la aplicaci\u00f3n utilizando Ruby on Rails. Nuestro principal objetivo en el c\u00f3digo era documentar claramente las mejores pr\u00e1cticas al utilizar Couchbase y ElasticSearch juntos.<\/p>\n<h3>Portal de aprendizaje<\/h3>\n<p>Esto es lo que ve un usuario cuando se conecta por primera vez a la aplicaci\u00f3n.<\/p>\n<h5>Acceso r\u00e1pido a documentos con Couchbase Client SDK<\/h5>\n<p>Cuando un usuario selecciona sobre un contenido concreto, los datos se cargan directamente desde Couchbase Server por su clave. Aqu\u00ed tienes un documento de ejemplo en Couchbase:<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\"><span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #3366cc\">\"t\u00edtulo<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">\"Vince Shields\"<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"url\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">\"https:\/\/en.wikipedia.org\/wiki\/Vince_Shields\"<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"tipo\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">\"texto\"<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"is_text\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #cc0000\">1<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"is_video\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #cc0000\">0<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"is_image\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #cc0000\">0<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"popularidad\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #cc0000\">0<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"vistas\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #cc0000\">0<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"categor\u00edas\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #009900\">[<\/span><br \/>\n<span style=\"color: #3366cc\">\"1900 nacimientos\"<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"1952 muertes\"<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"Gente del b\u00e9isbol de New Brunswick\"<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"Colillas de lanzadores de b\u00e9isbol canadienses\"<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"Fort Smith Twins jugadores\"<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"Actores de Independence Producers\"<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"Lanzadores de las Grandes Ligas de B\u00e9isbol\"<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"Jugadores de las Grandes Ligas de Canad\u00e1\"<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"Gente de Fredericton\"<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"Jugadores de los St. Louis Cardinals\"<\/span><br \/>\n<span style=\"color: #009900\">]<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"timestamp\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">\u201c2012-01-06T02:27:11Z\u201d<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"contenido\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">\"{{Infobox Jugador MLB<span style=\"color: #000099;font-weight: bold\">n<\/span>|name=Vince Shields...\"<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"autores\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #009900\">[<\/span><br \/>\n<span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #3366cc\">\"nombre\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">\"Chris el deletreador\"<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><br \/>\n<span style=\"color: #009900\">]<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"colaboradores\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #009900\">[<\/span><br \/>\n<span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #3366cc\">\"nombre\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">\"Chris el deletreador\"<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"timestamp\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">\u201c2012-01-06T02:27:11Z\u201d<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><br \/>\n<span style=\"color: #009900\">]<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><\/div>\n<\/div>\n<p>&nbsp;<\/p>\n<h5>Top Contributors y Top Tags usando Couchbase Map Reduce Views<\/h5>\n<p>Los usuarios del sistema pueden navegar por los contenidos explorando los principales colaboradores y las principales etiquetas del sistema.<\/p>\n<p>&nbsp;<\/p>\n<p>Veamos con m\u00e1s detalle c\u00f3mo se determinan las etiquetas principales.<\/p>\n<p>En primer lugar, aqu\u00ed est\u00e1 la funci\u00f3n de mapa que estamos utilizando:<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\"><span style=\"color: #003366;font-weight: bold\">funci\u00f3n<\/span><span style=\"color: #009900\">(<\/span>doc<span style=\"color: #009900\">)<\/span><span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">si<\/span> <span style=\"color: #009900\">(<\/span>doc.<span style=\"color: #660066\">tipo<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #009900\">{<\/span><br \/>\ndoc.<span style=\"color: #660066\">categor\u00edas<\/span>.<span style=\"color: #660066\">paraCada<\/span><span style=\"color: #009900\">(<\/span><span style=\"color: #003366;font-weight: bold\">funci\u00f3n<\/span><span style=\"color: #009900\">(<\/span>categor\u00eda<span style=\"color: #009900\">)<\/span><span style=\"color: #009900\">{<\/span><br \/>\nemite<span style=\"color: #009900\">(<\/span>categor\u00eda<span style=\"color: #339933\">,<\/span> <span style=\"color: #003366;font-weight: bold\">null<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><\/div>\n<\/div>\n<p>Y estamos utilizando el built-in reducir\u00a0<strong>Cuenta<\/strong><\/p>\n<p>Cuando accedemos a esta vista con un group_level de 1, vemos cada etiqueta y el n\u00famero de veces que se ha utilizado para describir un documento.<\/p>\n<p>&nbsp;<\/p>\n<p>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:<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\"><span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #3366cc\">\"Etiquetas<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #009900\">[<\/span><br \/>\n<span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #3366cc\">\"nombre\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">\"Gente viva\"<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"contar\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #cc0000\">27554<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #3366cc\">\"nombre\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">\"Plantillas Persondata sin par\u00e1metro de descripci\u00f3n corta\"<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"contar\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #cc0000\">20971<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #3366cc\">\"nombre\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">\"Todos los art\u00edculos con declaraciones sin fuente\"<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"contar\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #cc0000\">13509<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #3366cc\">\"nombre\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">\"Lista negra de comentarios sobre art\u00edculos\"<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"contar\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #cc0000\">9205<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #3366cc\">\"nombre\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">\"Art\u00edculos con hCards\"<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"contar\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #cc0000\">9028<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #3366cc\">\"nombre\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">\"P\u00e1ginas de desambiguaci\u00f3n\"<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"contar\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #cc0000\">5912<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #3366cc\">\"nombre\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">\"Art\u00edculos sin fuentes de diciembre de 2009\"<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"contar\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #cc0000\">4158<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #3366cc\">\"nombre\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">\"Plantilla de categor\u00eda Commons sin conjunto de categor\u00edas\"<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"contar\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #cc0000\">2904<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><br \/>\n<span style=\"color: #009900\">]<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><\/div>\n<\/div>\n<p>Ahora, tenemos un acceso muy r\u00e1pido a los top-tags actualizados cada 10 minutos.<\/p>\n<h5><\/h5>\n<h5>B\u00fasqueda de texto completo<\/h5>\n<p>Los usuarios del sistema tambi\u00e9n pueden realizar consultas de b\u00fasqueda complejas.<\/p>\n<p>&nbsp;<\/p>\n<p>Mediante esta interfaz, un usuario puede buscar el t\u00e9rmino \"agua\". El resultado es una consulta de b\u00fasqueda enviada a ElasticSearch:<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\"><span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #3366cc\">\"consulta\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #3366cc\">\"cadena_de_consulta\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #3366cc\">\"consulta\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">\"agua\"<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><\/div>\n<\/div>\n<p>Esta consulta en particular coincide con 42 documentos, a continuaci\u00f3n se muestra un subconjunto de la respuesta que muestra 1 documento:<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\"><span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #3366cc\">\"tom\u00f3\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #cc0000\">5<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"timed_out\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #003366;font-weight: bold\">falso<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"...fragmentos...<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #3366cc\">\"total\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #cc0000\">5<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"con \u00e9xito\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #cc0000\">5<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"fallido\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #cc0000\">0<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"\u00e9xitos\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #3366cc\">\"total\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #cc0000\">42<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"max_score\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #cc0000\">1.0178552<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"\u00e9xitos\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #009900\">[<\/span><br \/>\n<span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #3366cc\">\"_index\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #3366cc\">\"portal_de_aprendizaje\"<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"_tipo\"<\/span><span style=\"color: #339933\">:<\/span> couchbaseDocument<span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"_id\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #cc0000\">18087337<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"_score\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #cc0000\">1.0178552<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"_fuente\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #3366cc\">\"meta\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #3366cc\">\"id\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #cc0000\">18087337<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"rev\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #cc0000\">1<\/span><span style=\"color: #339933\">&#8211;<\/span>0017a16b2b29dc9c0000000000000000<span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"banderas\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #cc0000\">0<\/span><span style=\"color: #339933\">,<\/span><br \/>\n<span style=\"color: #3366cc\">\"caducidad\"<\/span><span style=\"color: #339933\">:<\/span> <span style=\"color: #cc0000\">0<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><span style=\"color: #339933\">,<\/span>&#8230;<\/div>\n<\/div>\n<p>Lo importante a tener en cuenta aqu\u00ed es que el cuerpo completo del documento no se incluye en la respuesta de ElasticSearch. Esto se hizo por dise\u00f1o, ya que configuramos el \u00edndice para no almacenar los documentos fuente completos. La raz\u00f3n es simple, ya tenemos acceso r\u00e1pido a los documentos en Couchbase. Usando el SDK del cliente de Couchbase, podemos realizar una operaci\u00f3n multi-get y extraer eficientemente los cuerpos de los documentos. Esto nos permite renderizar la pantalla de resultados de b\u00fasqueda:<\/p>\n<p>&nbsp;<\/p>\n<h3>M\u00e1s informaci\u00f3n<\/h3>\n<ul>\n<li>Echa un vistazo a la presentaci\u00f3n de Chris Tse en la CouchConf<\/li>\n<li>Todo el c\u00f3digo fuente del Portal de Aprendizaje est\u00e1 disponible en\u00a0<a href=\"https:\/\/github.com\/couchbaselabs\/learningportal\/\" rel=\"nofollow\">github<\/a><\/li>\n<li>\u00bfQuieres saber m\u00e1s sobre la integraci\u00f3n de Couchbase con ElasticSearch y que respondamos a tus preguntas? Reg\u00edstrate en\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/es\/webinars\/\" rel=\"nofollow\">asista al seminario web el 24 de octubre<\/a><\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>Two weeks ago McGraw Hill presented at CouchConf SF and our users expressed so much interest that I thought I&#8217;d share more details in a blog. Earlier this year McGraw Hill and Couchbase teamed up to build a proof-of-concept application [&hellip;]<\/p>","protected":false},"author":16,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"ppma_author":[9014],"class_list":["post-1587","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.5 (Yoast SEO v26.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Creating a content store with Couchbase - The Learning Portal - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/creating-content-store-couchbase-learning-portal\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Creating a content store with Couchbase - The Learning Portal\" \/>\n<meta property=\"og:description\" content=\"Two weeks ago McGraw Hill presented at CouchConf SF and our users expressed so much interest that I thought I&#8217;d share more details in a blog. Earlier this year McGraw Hill and Couchbase teamed up to build a proof-of-concept application [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/creating-content-store-couchbase-learning-portal\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-12-16T19:26:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-06-28T07:25:56+00:00\" \/>\n<meta name=\"author\" content=\"Marty Schoch, Senior Software Engineer, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Marty Schoch, Senior Software Engineer, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/creating-content-store-couchbase-learning-portal\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/creating-content-store-couchbase-learning-portal\/\"},\"author\":{\"name\":\"Marty Schoch, Senior Software Engineer, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/8391bac860956a77004a3267314699b5\"},\"headline\":\"Creating a content store with Couchbase &#8211; The Learning Portal\",\"datePublished\":\"2014-12-16T19:26:47+00:00\",\"dateModified\":\"2023-06-28T07:25:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/creating-content-store-couchbase-learning-portal\/\"},\"wordCount\":812,\"commentCount\":4,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/creating-content-store-couchbase-learning-portal\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Uncategorized\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/creating-content-store-couchbase-learning-portal\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/creating-content-store-couchbase-learning-portal\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/creating-content-store-couchbase-learning-portal\/\",\"name\":\"Creating a content store with Couchbase - The Learning Portal - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/creating-content-store-couchbase-learning-portal\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/creating-content-store-couchbase-learning-portal\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2014-12-16T19:26:47+00:00\",\"dateModified\":\"2023-06-28T07:25:56+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/creating-content-store-couchbase-learning-portal\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/creating-content-store-couchbase-learning-portal\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/creating-content-store-couchbase-learning-portal\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/creating-content-store-couchbase-learning-portal\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Creating a content store with Couchbase &#8211; The Learning Portal\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/8391bac860956a77004a3267314699b5\",\"name\":\"Marty Schoch, Senior Software Engineer, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/a82953547a154c93c3be4a865f6a0425\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/2986697e6cd5f3ee6681e1e2af2f1097f0a0025e42b0327c9f09db42c2fc55b8?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/2986697e6cd5f3ee6681e1e2af2f1097f0a0025e42b0327c9f09db42c2fc55b8?s=96&d=mm&r=g\",\"caption\":\"Marty Schoch, Senior Software Engineer, Couchbase\"},\"description\":\"Marty Schoch is a Senior Software Engineer at Couchbase. Marty is the author of the Couchbase Plugin for Elasticsearch and early versions of N1QL. Marty is also a core contributor to the Couchbase Go SDK and has worked on many experimental Couchbase Labs projects using Go. Currently, Marty is researching new index technology for future versions of Couchbase. He holds a bachelor's degree in computer science from the University of Maryland, College Park.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/marty-schoch\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Crear un almac\u00e9n de contenidos con Couchbase - El Portal de Aprendizaje - El Blog de Couchbase","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/creating-content-store-couchbase-learning-portal\/","og_locale":"es_MX","og_type":"article","og_title":"Creating a content store with Couchbase - The Learning Portal","og_description":"Two weeks ago McGraw Hill presented at CouchConf SF and our users expressed so much interest that I thought I&#8217;d share more details in a blog. Earlier this year McGraw Hill and Couchbase teamed up to build a proof-of-concept application [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/es\/creating-content-store-couchbase-learning-portal\/","og_site_name":"The Couchbase Blog","article_published_time":"2014-12-16T19:26:47+00:00","article_modified_time":"2023-06-28T07:25:56+00:00","author":"Marty Schoch, Senior Software Engineer, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Marty Schoch, Senior Software Engineer, Couchbase","Est. reading time":"4 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/creating-content-store-couchbase-learning-portal\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/creating-content-store-couchbase-learning-portal\/"},"author":{"name":"Marty Schoch, Senior Software Engineer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/8391bac860956a77004a3267314699b5"},"headline":"Creating a content store with Couchbase &#8211; The Learning Portal","datePublished":"2014-12-16T19:26:47+00:00","dateModified":"2023-06-28T07:25:56+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/creating-content-store-couchbase-learning-portal\/"},"wordCount":812,"commentCount":4,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/creating-content-store-couchbase-learning-portal\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Uncategorized"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/creating-content-store-couchbase-learning-portal\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/creating-content-store-couchbase-learning-portal\/","url":"https:\/\/www.couchbase.com\/blog\/creating-content-store-couchbase-learning-portal\/","name":"Crear un almac\u00e9n de contenidos con Couchbase - El Portal de Aprendizaje - El Blog de Couchbase","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/creating-content-store-couchbase-learning-portal\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/creating-content-store-couchbase-learning-portal\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2014-12-16T19:26:47+00:00","dateModified":"2023-06-28T07:25:56+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/creating-content-store-couchbase-learning-portal\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/creating-content-store-couchbase-learning-portal\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/creating-content-store-couchbase-learning-portal\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/creating-content-store-couchbase-learning-portal\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Creating a content store with Couchbase &#8211; The Learning Portal"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/8391bac860956a77004a3267314699b5","name":"Marty Schoch, Ingeniero Superior de Software, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/a82953547a154c93c3be4a865f6a0425","url":"https:\/\/secure.gravatar.com\/avatar\/2986697e6cd5f3ee6681e1e2af2f1097f0a0025e42b0327c9f09db42c2fc55b8?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2986697e6cd5f3ee6681e1e2af2f1097f0a0025e42b0327c9f09db42c2fc55b8?s=96&d=mm&r=g","caption":"Marty Schoch, Senior Software Engineer, Couchbase"},"description":"Marty Schoch es Ingeniero de Software Senior en Couchbase. Marty es el autor del plugin de Couchbase para Elasticsearch y de las primeras versiones de N1QL. Marty es tambi\u00e9n uno de los principales colaboradores del SDK de Couchbase Go y ha trabajado en muchos proyectos experimentales de Couchbase Labs utilizando Go. Actualmente, Marty est\u00e1 investigando una nueva tecnolog\u00eda de \u00edndices para futuras versiones de Couchbase. Es licenciado en Inform\u00e1tica por la Universidad de Maryland, College Park.","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/marty-schoch\/"}]}},"authors":[{"term_id":9014,"user_id":16,"is_guest":0,"slug":"marty-schoch","display_name":"Marty Schoch, Senior Software Engineer, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/2986697e6cd5f3ee6681e1e2af2f1097f0a0025e42b0327c9f09db42c2fc55b8?s=96&d=mm&r=g","author_category":"","last_name":"Schoch","first_name":"Marty","job_title":"","user_url":"","description":"Marty Schoch es Ingeniero de Software Senior en Couchbase. Marty es el autor del plugin de Couchbase para Elasticsearch y de las primeras versiones de N1QL. Marty es tambi\u00e9n uno de los principales colaboradores del SDK de Couchbase Go y ha trabajado en muchos proyectos experimentales de Couchbase Labs utilizando Go. Actualmente, Marty est\u00e1 investigando una nueva tecnolog\u00eda de \u00edndices para futuras versiones de Couchbase. Es licenciado en Inform\u00e1tica por la Universidad de Maryland, College Park."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/1587","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/16"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=1587"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/1587\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=1587"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=1587"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=1587"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=1587"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}