{"id":5551,"date":"2018-08-03T07:00:44","date_gmt":"2018-08-03T14:00:44","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=5551"},"modified":"2025-06-13T20:14:57","modified_gmt":"2025-06-14T03:14:57","slug":"developing-a-typeahead-with-couchbase-node-js-and-full-text-search","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/","title":{"rendered":"Typeahead: Desarrollar con Couchbase Full-Text Search y Node.js"},"content":{"rendered":"<p>Durante el \u00faltimo a\u00f1o he escrito una serie de tutoriales sobre la <a href=\"https:\/\/www.couchbase.com\/blog\/es\/products\/full-text-search\/\">b\u00fasqueda de texto completo<\/a> (FTS) de Couchbase, la mayor\u00eda de los cuales son ejemplos espec\u00edficos de c\u00f3mo hacer algo con uno de los SDK y nunca realmente nada que ver con la aplicaci\u00f3n que hay detr\u00e1s. Una de las muchas posibles aplicaciones realistas incluye el uso de una funci\u00f3n de typeahead o sugerencia de datos en un formulario de aplicaci\u00f3n web. Bas\u00e1ndose en la entrada del usuario, se buscan y se muestran posibles resultados.<\/p>\n<p>Vamos a ver c\u00f3mo construir un formulario typeahead utilizando el servicio de b\u00fasqueda de texto completo en <a href=\"https:\/\/www.couchbase.com\/blog\/es\/\" target=\"_blank\" rel=\"noopener noreferrer\">Couchbase<\/a>Node.js y jQuery para unirlo todo.<\/p>\n<p><!--more--><\/p>\n<p>Antes de entrar en detalles, se supone que ya tienes Couchbase Server 5.0+ instalado y configurado con la b\u00fasqueda de texto completo activada. Suponemos que tambi\u00e9n tienes instalado Node.js, ya que la API funcionar\u00e1 con Node.js y Express Framework.<\/p>\n<h2>Creaci\u00f3n de un conjunto de datos NoSQL con \u00edndices FTS<\/h2>\n<p>Cuando se trabaja con FTS, se puede utilizar uno de un n\u00famero potencialmente ilimitado de escenarios de b\u00fasqueda. Vamos a ser un poco m\u00e1s espec\u00edficos para el prop\u00f3sito de este ejemplo.<\/p>\n<p>Supongamos que estamos trabajando con datos de m\u00fasica y nuestro objetivo es buscar canciones bas\u00e1ndonos en el artista, el \u00e1lbum o el t\u00edtulo de la canci\u00f3n. Supongamos que cada uno de nuestros documentos NoSQL tiene el siguiente formato:<\/p>\n<pre class=\"lang:default decode:true\">{\r\n  \"title\": \"Love Story\",\r\n  \"artist\": \"Taylor Swift\",\r\n  \"album\": \"Fearless\",\r\n  \"type\": \"song\"\r\n}<\/pre>\n<p>No es el documento JSON m\u00e1s complejo, pero podr\u00eda serlo si quisi\u00e9ramos. Por el bien de este ejemplo, s\u00f3lo vamos a preocuparnos por el <code>t\u00edtulo<\/code> y el <code>artista<\/code>aunque no costar\u00eda mucho m\u00e1s esfuerzo ampliarlo.<\/p>\n<p>Para utilizar FTS, vamos a necesitar crear un \u00edndice especial en Couchbase con el siguiente aspecto:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-5554 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/07\/fts-music-index.png\" alt=\"\" width=\"1500\" height=\"689\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/fts-music-index.png 1500w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/fts-music-index-300x138.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/fts-music-index-1024x470.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/fts-music-index-768x353.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/fts-music-index-20x9.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/fts-music-index-1320x606.png 1320w\" sizes=\"auto, (max-width: 1500px) 100vw, 1500px\" \/><\/p>\n<p>En resumen, tenemos que dar un nombre al \u00edndice, especificar la correspondencia de tipos y definir los campos que se indexar\u00e1n, todo lo cual se almacenar\u00e1 en el propio \u00edndice.<\/p>\n<p>Al crear el \u00edndice, es importante almacenar el campo, de lo contrario, no tendremos nada que mostrar en nuestro typeahead.<\/p>\n<h2>Desarrollo de un punto final de API RESTful de Node.js para b\u00fasquedas<\/h2>\n<p>Ahora que tenemos algunos datos en la base de datos y un \u00edndice creado para la b\u00fasqueda, podemos crear un endpoint API con Node.js. El objetivo de esta API es servir de punto final para nuestro formulario de b\u00fasqueda. Despu\u00e9s de todo, no queremos que nuestro frontend de cara al cliente acceda directamente a la base de datos, ya que no ser\u00eda seguro.<\/p>\n<p>En su ordenador, cree un nuevo proyecto y ejecute lo siguiente desde la l\u00ednea de comandos:<\/p>\n<pre class=\"lang:default decode:true\">npm init -y\r\nnpm install couchbase cors express --save<\/pre>\n<p>Los comandos anteriores crear\u00e1n un nuevo\u00a0<strong>paquete.json<\/strong> e instalaremos las pocas dependencias de nuestro proyecto. Vamos a utilizar el SDK de Couchbase con Express Framework y vamos a instalar un paquete para gestionar la compartici\u00f3n de recursos entre or\u00edgenes (CORS).<\/p>\n<p>Como nuestra aplicaci\u00f3n es peque\u00f1a, vamos a crear un\u00a0<strong>app.js<\/strong> en nuestro proyecto para contener todo nuestro c\u00f3digo. Podemos arrancarlo con lo siguiente:<\/p>\n<pre class=\"lang:default decode:true\">const Couchbase = require(\"couchbase\");\r\nconst Express = require(\"express\");\r\nconst Cors = require(\"cors\");\r\n\r\nvar app = Express();\r\nvar cluster = new Couchbase.Cluster(\"couchbase:\/\/localhost\");\r\ncluster.authenticate(\"example\", \"123456\");\r\nvar bucket = cluster.openBucket(\"example\");\r\n\r\napp.use(Cors());\r\n\r\napp.get(\"\/search\", (request, response) =&gt; { });\r\n\r\napp.listen(3000, () =&gt; {\r\n    console.log(\"Listening at :3000...\");\r\n});<\/pre>\n<p>En el c\u00f3digo anterior, hemos importado nuestras dependencias descargadas, configurado Express y conectado a nuestra instancia de Couchbase. Tendr\u00e1s que cambiar la informaci\u00f3n de conexi\u00f3n por la de tu instancia de base de datos real.<\/p>\n<p>En <code>\/buscar<\/code> es donde va a ocurrir toda la magia. Vamos a profundizar en ello:<\/p>\n<pre class=\"lang:default decode:true\">app.get(\"\/search\", (request, response) =&gt; {\r\n    var SearchQuery = Couchbase.SearchQuery;\r\n    var query = SearchQuery.new(\"idx-music\", SearchQuery.match(request.query.query).fuzziness(1));\r\n    query.fields([\"title\", \"artist\"]);\r\n    bucket.query(query, function(error, result, meta) {\r\n        if(error) {\r\n            return response.status(500).send({ message: error.message });\r\n        }\r\n        result = result.map(item =&gt; {\r\n            return {\r\n                id: item.id,\r\n                score: item.score,\r\n                title: item.fields.title,\r\n                artist: item.fields.artist\r\n            };\r\n        });\r\n        response.send(result);\r\n    });\r\n});<\/pre>\n<p>En primer lugar, definimos nuestra consulta como una consulta de coincidencia con nuestro \u00edndice concreto. La consulta de coincidencia utilizar\u00e1 cualquier texto que se pase a trav\u00e9s de los par\u00e1metros de consulta de la petici\u00f3n. Tambi\u00e9n vamos a utilizar una b\u00fasqueda difusa con un valor de 1 para tener en cuenta los errores ortogr\u00e1ficos de las palabras.<\/p>\n<p>Antes de ejecutar la consulta, definimos que queremos que el <code>t\u00edtulo<\/code> y <code>artista<\/code> en los resultados. Estos son los mismos campos que hemos a\u00f1adido a nuestro \u00edndice.<\/p>\n<p>Cuando la consulta se ejecuta correctamente, analizamos los resultados para obtener s\u00f3lo lo que queremos, en lugar de los metadatos adicionales que se incluyen en la respuesta.<\/p>\n<p>Utilizando una petici\u00f3n cURL, podr\u00eda pulsar https:\/\/localhost:3000\/search?query=swift y ver varios resultados dependiendo de su conjunto de datos.<\/p>\n<h2>Dise\u00f1o de una interfaz con las bibliotecas jQuery y Typeahead<\/h2>\n<p>Buscar con cURL tiene sus valores, pero la mayor\u00eda de las veces no es lo que vamos a querer hacer. En su lugar, deber\u00edamos crear un front-end orientado al cliente utilizando tecnolog\u00edas web f\u00e1cilmente disponibles.<\/p>\n<p>Hay un mont\u00f3n de bibliotecas potenciales por ah\u00ed, pero vamos a utilizar <a href=\"https:\/\/twitter.github.io\/typeahead.js\/\" target=\"_blank\" rel=\"noopener noreferrer\">typeahead.js<\/a> que mantiene Twitter. Tendr\u00e1s que descargarlo, pero ten en cuenta que vamos a utilizar la versi\u00f3n <a href=\"https:\/\/github.com\/twitter\/typeahead.js\/releases\/tag\/v0.10.5\" target=\"_blank\" rel=\"noopener noreferrer\">0.10.5<\/a> de la biblioteca debido a errores en la \u00faltima. Perd\u00ed una buena parte del d\u00eda tratando de solucionar problemas de la biblioteca s\u00f3lo para descubrir esto.<\/p>\n<p>Cree un proyecto que contenga la siguiente estructura:<\/p>\n<pre class=\"lang:default decode:true\">js\r\n  handlebars-v4.0.11.js\r\n  jquery-3.3.1.min.js\r\n  typeahead.bundle.min.js\r\nindex.html<\/pre>\n<p>S\u00ed, necesitar\u00e1 <a href=\"https:\/\/handlebarsjs.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Manillares.js<\/a> y <a href=\"https:\/\/jquery.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">jQuery<\/a> para tener \u00e9xito con este frontend. Hasta donde yo s\u00e9, la versi\u00f3n no importa, s\u00f3lo nos importa la versi\u00f3n de nuestra biblioteca typeahead.<\/p>\n<p>Dentro del proyecto\u00a0<strong>index.html<\/strong> incluya lo siguiente:<\/p>\n<pre class=\"lang:default decode:true\">&lt;html&gt;\r\n    &lt;head&gt;\r\n        &lt;style&gt;\r\n            .tt-input, .tt-hint, .twitter-typeahead {\r\n                width: 100%;\r\n            }\r\n        &lt;\/style&gt;\r\n    &lt;\/head&gt;\r\n    &lt;body&gt;\r\n        &lt;div id=&quot;remote&quot;&gt;\r\n            &lt;input class=&quot;typeahead&quot; type=&quot;text&quot; placeholder=&quot;Songs...&quot;&gt;\r\n        &lt;\/div&gt;\r\n        &lt;script src=&quot;js\/jquery-3.3.1.min.js&quot;&gt;&lt;\/script&gt;\r\n        &lt;script src=&quot;js\/handlebars-v4.0.11.js&quot;&gt;&lt;\/script&gt;\r\n        &lt;script src=&quot;js\/typeahead.0.10.5.bundle.min.js&quot;&gt;&lt;\/script&gt;\r\n        &lt;script&gt;\r\n            $(&#039;#remote .typeahead&#039;).typeahead(\r\n                {\r\n                    hint: true,\r\n                    minLength: 3,\r\n                    highlight: false,\r\n                    limit: 5\r\n                }, {\r\n                    name: &quot;song&quot;,\r\n                    displayKey: &quot;id&quot;,\r\n                    source: function (query, callback) {\r\n                        $.getJSON(&quot;https:\/\/localhost:3000\/search?query=&quot; + query, function (data) {\r\n                            return callback(data);\r\n                        });\r\n                    },\r\n                    templates: {\r\n                        suggestion: Handlebars.compile(&#039;&lt;div&gt;{{title}} &ndash; {{artist}}&lt;\/div&gt;&#039;)\r\n                    }\r\n                }\r\n            );\r\n        &lt;\/script&gt;\r\n    &lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<p>Ignorando como acabamos de hacer el marcado HTML b\u00e1sico para incluir nuestros estilos y scripts, salta a nuestra funci\u00f3n typeahead. Para la configuraci\u00f3n, vamos a mostrar sugerencias emergentes para cualquier registro encontrado, requerir que al menos 3 caracteres est\u00e9n presentes, no resaltar palabras coincidentes, y limitar nuestros resultados a 5 elementos mostrados. Si\u00e9ntase libre de ajustar la configuraci\u00f3n a sus especificaciones.<\/p>\n<p>En la siguiente secci\u00f3n definimos nuestro <code>displayKey<\/code>. Sabemos que estamos recibiendo un array de objetos de vuelta y un <code>id<\/code> es una de las propiedades de esos objetos. Queremos que ese valor se muestre en nuestro formulario despu\u00e9s de la selecci\u00f3n. Para la fuente de datos, estamos haciendo una solicitud GET a nuestro punto final de la API y pasar la respuesta a nuestra biblioteca typeahead. Todo se mostrar\u00e1 en el <code>plantillas<\/code> zona.<\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p>Acabas de ver c\u00f3mo usar un typeahead, a menudo referido como autosugerencias o autocompletar, usando jQuery, Node.js, y b\u00fasqueda de texto completo (FTS) en Couchbase. Hay muchos casos de uso cuando se trata de b\u00fasqueda de texto completo y muchas bibliotecas diferentes disponibles para la funcionalidad typeahead. Este tutorial es m\u00e1s o menos para darte una idea para el futuro.<\/p>\n<p>Para obtener m\u00e1s informaci\u00f3n sobre el uso de Couchbase con Node.js, consulte la p\u00e1gina <a href=\"https:\/\/www.couchbase.com\/blog\/es\/developers\/\" target=\"_blank\" rel=\"noopener noreferrer\">Portal para desarrolladores de Couchbase<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Over the past year or so I&#8217;ve written a variety of tutorials around the full-text search (FTS) service of Couchbase, most of which are specific examples of how to do something with one of the SDKs and never really anything [&hellip;]<\/p>","protected":false},"author":63,"featured_media":5555,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1814,1816,2165,9327,1822],"tags":[1543,2259],"ppma_author":[9032],"class_list":["post-5551","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design","category-couchbase-server","category-full-text-search","category-javascript","category-node-js","tag-javascript","tag-typeahead"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Typeahead: Develop with Couchbase Full-Text Search &amp; Node.js<\/title>\n<meta name=\"description\" content=\"Learn to create a UI typeahead that populates based on data from Couchbase Full-Text Search (FTS) service using Node.js, jQuery, Typeahead.js.\" \/>\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\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Typeahead: Develop with Couchbase Full-Text Search &amp; Node.js\" \/>\n<meta property=\"og:description\" content=\"Learn to create a UI typeahead that populates based on data from Couchbase Full-Text Search (FTS) service using Node.js, jQuery, Typeahead.js.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/thepolyglotdeveloper\" \/>\n<meta property=\"article:published_time\" content=\"2018-08-03T14:00:44+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:14:57+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/labyrinth-2037286_1920.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1003\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nraboy\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/\"},\"author\":{\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1\"},\"headline\":\"Typeahead: Develop with Couchbase Full-Text Search &amp; Node.js\",\"datePublished\":\"2018-08-03T14:00:44+00:00\",\"dateModified\":\"2025-06-14T03:14:57+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/\"},\"wordCount\":1046,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/labyrinth-2037286_1920.jpg\",\"keywords\":[\"javascript\",\"typeahead\"],\"articleSection\":[\"Application Design\",\"Couchbase Server\",\"Full-Text Search\",\"JavaScript\",\"Node.js\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/\",\"name\":\"Typeahead: Develop with Couchbase Full-Text Search &amp; Node.js\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/labyrinth-2037286_1920.jpg\",\"datePublished\":\"2018-08-03T14:00:44+00:00\",\"dateModified\":\"2025-06-14T03:14:57+00:00\",\"description\":\"Learn to create a UI typeahead that populates based on data from Couchbase Full-Text Search (FTS) service using Node.js, jQuery, Typeahead.js.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/labyrinth-2037286_1920.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/labyrinth-2037286_1920.jpg\",\"width\":1920,\"height\":1003},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Typeahead: Develop with Couchbase Full-Text Search &amp; Node.js\"}]},{\"@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\/bb545ebe83bb2d12f91095811d0a72e1\",\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"caption\":\"Nic Raboy, Developer Advocate, Couchbase\"},\"description\":\"Nic Raboy is an advocate of modern web and mobile development technologies. He has experience in Java, JavaScript, Golang and a variety of frameworks such as Angular, NativeScript, and Apache Cordova. Nic writes about his development experiences related to making web and mobile development easier to understand.\",\"sameAs\":[\"https:\/\/www.thepolyglotdeveloper.com\",\"https:\/\/www.facebook.com\/thepolyglotdeveloper\",\"https:\/\/x.com\/nraboy\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/nic-raboy-2\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Typeahead: Desarrollar con Couchbase Full-Text Search y Node.js","description":"Aprende a crear una interfaz de usuario typeahead que se rellena en base a los datos del servicio Couchbase Full-Text Search (FTS) utilizando Node.js, jQuery, Typeahead.js.","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\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/","og_locale":"es_MX","og_type":"article","og_title":"Typeahead: Develop with Couchbase Full-Text Search &amp; Node.js","og_description":"Learn to create a UI typeahead that populates based on data from Couchbase Full-Text Search (FTS) service using Node.js, jQuery, Typeahead.js.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/","og_site_name":"The Couchbase Blog","article_author":"https:\/\/www.facebook.com\/thepolyglotdeveloper","article_published_time":"2018-08-03T14:00:44+00:00","article_modified_time":"2025-06-14T03:14:57+00:00","og_image":[{"width":1920,"height":1003,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/labyrinth-2037286_1920.jpg","type":"image\/jpeg"}],"author":"Nic Raboy, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@nraboy","twitter_misc":{"Written by":"Nic Raboy, Developer Advocate, Couchbase","Est. reading time":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/"},"author":{"name":"Nic Raboy, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1"},"headline":"Typeahead: Develop with Couchbase Full-Text Search &amp; Node.js","datePublished":"2018-08-03T14:00:44+00:00","dateModified":"2025-06-14T03:14:57+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/"},"wordCount":1046,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/labyrinth-2037286_1920.jpg","keywords":["javascript","typeahead"],"articleSection":["Application Design","Couchbase Server","Full-Text Search","JavaScript","Node.js"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/","url":"https:\/\/www.couchbase.com\/blog\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/","name":"Typeahead: Desarrollar con Couchbase Full-Text Search y Node.js","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/labyrinth-2037286_1920.jpg","datePublished":"2018-08-03T14:00:44+00:00","dateModified":"2025-06-14T03:14:57+00:00","description":"Aprende a crear una interfaz de usuario typeahead que se rellena en base a los datos del servicio Couchbase Full-Text Search (FTS) utilizando Node.js, jQuery, Typeahead.js.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/labyrinth-2037286_1920.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/labyrinth-2037286_1920.jpg","width":1920,"height":1003},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/developing-a-typeahead-with-couchbase-node-js-and-full-text-search\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Typeahead: Develop with Couchbase Full-Text Search &amp; Node.js"}]},{"@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\/bb545ebe83bb2d12f91095811d0a72e1","name":"Nic Raboy, Defensor del Desarrollador, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354","url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","caption":"Nic Raboy, Developer Advocate, Couchbase"},"description":"Nic Raboy es un defensor de las tecnolog\u00edas modernas de desarrollo web y m\u00f3vil. Tiene experiencia en Java, JavaScript, Golang y una variedad de frameworks como Angular, NativeScript y Apache Cordova. Nic escribe sobre sus experiencias de desarrollo relacionadas con hacer el desarrollo web y m\u00f3vil m\u00e1s f\u00e1cil de entender.","sameAs":["https:\/\/www.thepolyglotdeveloper.com","https:\/\/www.facebook.com\/thepolyglotdeveloper","https:\/\/x.com\/nraboy"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/nic-raboy-2\/"}]}},"authors":[{"term_id":9032,"user_id":63,"is_guest":0,"slug":"nic-raboy-2","display_name":"Nic Raboy, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","author_category":"","last_name":"Raboy","first_name":"Nic","job_title":"","user_url":"https:\/\/www.thepolyglotdeveloper.com","description":"Nic Raboy es un defensor de las tecnolog\u00edas modernas de desarrollo web y m\u00f3vil. Tiene experiencia en Java, JavaScript, Golang y una variedad de frameworks como Angular, NativeScript y Apache Cordova. Nic escribe sobre sus experiencias de desarrollo relacionadas con hacer el desarrollo web y m\u00f3vil m\u00e1s f\u00e1cil de entender."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/5551","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\/63"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=5551"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/5551\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/5555"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=5551"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=5551"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=5551"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=5551"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}