{"id":10314,"date":"2019-03-01T15:29:14","date_gmt":"2019-03-01T13:29:14","guid":{"rendered":"https:\/\/www.hiberus.com\/crecemos-contigo\/?p=10314"},"modified":"2025-08-06T11:32:26","modified_gmt":"2025-08-06T09:32:26","slug":"construir-tu-motor-de-indexacion-y-busqueda-con-elasticsearch","status":"publish","type":"post","link":"https:\/\/www.hiberus.com\/crecemos-contigo\/construir-tu-motor-de-indexacion-y-busqueda-con-elasticsearch\/","title":{"rendered":"Construir tu motor de indexaci\u00f3n y b\u00fasqueda con Elasticsearch"},"content":{"rendered":"<p>El ritmo imparable en la evoluci\u00f3n de las nuevas tecnolog\u00edas que se lleva produciendo desde hace ya unos cuantos a\u00f1os lleva asociado un nivel de exigencia cada vez mayor por parte de los usuarios. Centr\u00e1ndonos en el mundo web, cada vez son menos los negocios u organizaciones que no disponen ya de su portal de contenidos o su e-commerce. Por lo tanto, si queremos que nuestra web de contenidos o comercio electr\u00f3nico sea aceptado por los usuarios debemos considerar una serie de factores, que de no ser tenidos en cuenta har\u00e1n que los usuarios, insatisfechos con el uso de nuestra web, se vayan a las de la competencia. Si no los tenemos en cuenta, los usuarios, insatisfechos con el uso de nuestra web, se ir\u00e1n a la competencia y es aqu\u00ed donde entra la importancia de la creaci\u00f3n de un motor de indexaci\u00f3n y b\u00fasqueda con Elasticsearch.<\/p>\n<h2>Por qu\u00e9 es importante la indexaci\u00f3n<\/h2>\n<p>Uno de los factores m\u00e1s importantes es la <strong>facilidad con la que cada usuario encuentra lo que est\u00e1 buscando en nuestro portal<\/strong>. Para ello, adem\u00e1s de una adecuada estructuraci\u00f3n y clasificaci\u00f3n de nuestros contenidos o productos, es fundamental disponer del <strong>mejor motor de b\u00fasqueda<\/strong> \u201cinteligente\u201d, que sea capaz de anticiparse a lo que el usuario est\u00e1 buscando (sugerencias), que sea tolerante a errores de escritura, que sea r\u00e1pido\u2026 En definitiva, que permita al usuario encontrar lo que busca de forma r\u00e1pida y sencilla.<\/p>\n<p>En un e-commerce, las b\u00fasquedas se realizan sobre el cat\u00e1logo de productos, mientras que en una web de contenidos esta b\u00fasqueda se realiza sobre noticias, eventos, informaci\u00f3n corporativa, etc. En ambos casos, por lo que al motor de b\u00fasqueda se refiere, se est\u00e1n incluyendo (indexando) en los \u00edndices de b\u00fasqueda documentos compuestos por un conjunto de campos (nombre, t\u00edtulo, descripci\u00f3n, etc.).<\/p>\n<p>El grado de fiabilidad de las b\u00fasquedas realizadas por los usuarios, y su grado de satisfacci\u00f3n con los resultados obtenidos van a ser determinantes en el \u00e9xito de nuestro e-commerce o de nuestra web. Por lo tanto, es fundamental<strong> elegir el motor de b\u00fasqueda e indexaci\u00f3n<\/strong> de forma adecuada. Dependiendo del motor de b\u00fasqueda elegido, hay una serie de aspectos a tener en cuenta y decisiones a tomar.<\/p>\n<p>En el art\u00edculo <strong><a href=\"https:\/\/www.hiberus.com\/crecemos-contigo\/nosql-y-los-motores-de-busqueda-apache-solr-vs-elasticsearch\/\">Apache Solr vs ElasticSearch<\/a><\/strong>\u00a0se habl\u00f3 de los dos motores de b\u00fasqueda open source m\u00e1s utilizados, y de las diferencias entre ellos.<\/p>\n<p>En este art\u00edculo nos centraremos en <strong>Elasticsearch<\/strong> y en los factores determinantes en el dise\u00f1o y contrucci\u00f3n de nuestro buscador basado en el motor de Elastic.<\/p>\n<p><strong>\u00a0<\/strong><\/p>\n<h2>Mapping o estructura de los datos en el \u00edndice<\/h2>\n<p>Una de las primeras decisiones a tomar es c\u00f3mo vamos a almacenar y estructurar la informaci\u00f3n en el \u00edndice, es decir, qu\u00e9 campos contendr\u00e1n los documentos a almacenar en el \u00edndice, de qu\u00e9 tipo (texto, num\u00e9rico, booleano, etc.) y si los campos se analizar\u00e1n al indexarse o no. Esta definici\u00f3n es lo que se denomina <strong>mapping en Elasticsearch.<\/strong><\/p>\n<p>En primer lugar, debemos <strong>decidir si el mapping ser\u00e1 din\u00e1mico<\/strong>, es decir, no existir\u00e1 una estructura fija para los documentos en el \u00edndice (se ir\u00e1n a\u00f1adiendo nuevos campos al mapping autom\u00e1ticamente seg\u00fan lleguen documentos que incluyan nuevos campos), <strong>o si por el contrario ser\u00e1 estricto<\/strong>, es decir, la estructura de los documentos ser\u00e1 fija y cualquier documento deber\u00e1 ce\u00f1irse a esta estructura para poder ser insertado en el \u00edndice. Cada una de las dos opciones es m\u00e1s adecuada para un tipo de situaciones y la decisi\u00f3n no debe tomarse a la ligera, si bien a nivel general podemos decir que <strong>el mapping estricto suele ser m\u00e1s adecuado<\/strong> salvo en los casos en los que la estructura de la informaci\u00f3n a indexar no es conocida a priori.<\/p>\n<p>&nbsp;<\/p>\n<h2>An\u00e1lisis de los campos en tiempo de indexaci\u00f3n<\/h2>\n<p>Otro punto fundamental en un motor de b\u00fasqueda, relacionado con el anterior, es tener claro qu\u00e9 campos se usar\u00e1n en b\u00fasquedas full-text y cu\u00e1les se usar\u00e1n en facetas (para agrupar los resultados y permitir navegaci\u00f3n guiada). Esto determinar\u00e1 la forma en la que debe indexarse cada campo.<\/p>\n<p><strong>Los campos que vayan a utilizarse para b\u00fasquedas de texto deben ser analizados en indexaci\u00f3n<\/strong>, de forma que se transformen y se almacenen en el \u00edndice de la forma m\u00e1s adecuada. Las transformaciones (separar palabras, eliminar sufijos y plurales, pasara a min\u00fasculas, etc.) realizadas depender\u00e1n del analizador que utilicemos, y son las que permiten que un texto pueda ser encontrado independientemente de si lo buscamos en may\u00fasculas o min\u00fasculas, en singular o plural, etc.<\/p>\n<p>Elasticsearch viene con un gran n\u00famero de analizadores disponibles, cada uno de los cuales realiza ciertas transformaciones. Cada analizador est\u00e1 compuesto por una cadena de filtros, que se ejecutan en secuencia sobre los textos a indexar, de forma que las transformaciones que realiza cada analizador dependen de los filtros que utiliza. Adem\u00e1s, podemos crear nuevos analizadores combinando los filtros ya existentes en Elasticsearch o creando nuevos filtros.<\/p>\n<p>Ejemplos de campos de un documento (producto o contenido) que suelen indexarse de esta manera suelen ser el nombre, el t\u00edtulo o la descripci\u00f3n.<\/p>\n<p>A continuaci\u00f3n, se presenta un ejemplo de la <strong>definici\u00f3n de un analizador<\/strong>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"json\">\"analysis\": {\r\n      \"filter\": {\r\n        \"spanish_stop\": {\r\n          \"type\":       \"stop\",\r\n          \"stopwords\":  \"_spanish_\" \r\n        },\r\n        \"spanish_keywords\": {\r\n          \"type\":       \"keyword_marker\",\r\n          \"keywords\":   [\"ejemplo\"] \r\n        },\r\n        \"spanish_stemmer\": {\r\n          \"type\":       \"stemmer\",\r\n          \"language\":   \"light_spanish\"\r\n        }\r\n      },\r\n      \"analyzer\": {\r\n        \"spanish\": {\r\n          \"tokenizer\":  \"standard\",\r\n          \"filter\": [\r\n            \"lowercase\",\r\n            \"spanish_stop\",\r\n            \"spanish_keywords\",\r\n            \"spanish_stemmer\"\r\n          ]\r\n        }\r\n      }\r\n    }\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>\u00a0<\/strong><\/p>\n<p><strong>Los campos que vayamos a utilizar como facetas<\/strong> para agrupar los resultados (por ejemplo, agrupar los resultados por color, por rangos de edad, por g\u00e9nero\u2026 y permitir ir refinando la b\u00fasqueda en base a estos grupos) <strong>deber\u00e1n indexarse sin ser analizados<\/strong>, es decir, sin ninguna transformaci\u00f3n. Campos t\u00edpicos que suelen indexarse de esta forma son campos con un n\u00famero limitado de valores posibles (color, g\u00e9nero, origen, \u2026) o campos num\u00e9ricos o de tipo fecha, para poder agrupar por rangos de precios, de edad, de fechas, etc.<\/p>\n<p>En Elasticsearch los campos que queremos indexar de esta forma los indexaremos como tipo <em>keyword<\/em>, o con el tipo num\u00e9rico adecuado en el caso de que vayan a utilizarse para agrupar por rangos.<\/p>\n<p>En algunos casos, un mismo campo necesitamos utilizarlo para b\u00fasquedas de texto pero tambi\u00e9n vamos a utilizarlo para agrupar los resultados. Por ejemplo, la marca la utilizaremos para agrupar resultados, pero tambi\u00e9n queremos utilizarla en las b\u00fasquedas de texto, para que si el usuario teclea la marca los productos de esa marca aparezcan entre los primeros resultados de b\u00fasqueda. Para estos casos, Elasticsearch nos permite indexar un mismo campo de las 2 maneras, de forma que seg\u00fan vayamos a utilizarlo en b\u00fasqueda de texto o como faceta lo referenciaremos de una forma u otra. Por ejemplo, en el caso de la marca el mapping ser\u00eda<\/p>\n<p>&nbsp;<\/p>\n<blockquote>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"json\">\"brand\": {\r\n\r\n\"type\": \"text\",\r\n\r\n\"analyzer\": \"simple\",\r\n\r\n\"fields\": {\r\n\r\n\"raw\": {\r\n\r\n\"type\": \"keyword\"\r\n\r\n}\r\n\r\n}\r\n\r\n}<\/pre>\n<p>&nbsp;<\/p><\/blockquote>\n<p>&nbsp;<\/p>\n<p>En b\u00fasquedas full-text usar\u00edamos el campo <em>brand<\/em>, y agrupar\u00edamos los resultados por por <em>brand.raw<\/em><\/p>\n<p>&nbsp;<\/p>\n<h2>N\u00famero de \u00edndices<\/h2>\n<p>El n\u00famero de \u00edndices que utilicemos para indexar la informaci\u00f3n es tambi\u00e9n importante. Versiones anteriores a la 6.x de Elasticsearch permit\u00edan crear diferentes tipos de documento dentro de un mismo \u00edndice, pero a partir de esta versi\u00f3n desaparece el concepto de tipos de documento, por lo que todos los documentos almacenados dentro de un mismo \u00edndice deben tener un mismo mapping. Por lo tanto, si tenemos varios tipos de documento con una estructura totalmente diferente, deber\u00edamos utilizar \u00edndices diferentes para almacenarlos.<\/p>\n<p>Sin embargo, a mayor n\u00famero de \u00edndices mayor consumo de memoria, por lo que hay que buscar un equilibrio entre el n\u00famero de \u00edndices y el tama\u00f1o del mapping (n\u00famero de campos diferentes) de cada \u00edndice, ya que un mapping demasiado grande puede derivar en problemas de rendimiento.<\/p>\n<p>&nbsp;<\/p>\n<h2>Soporte para multiidioma<\/h2>\n<p>Si la informaci\u00f3n a indexar va a estar disponible en varios idiomas, deberemos decidir entre dos alternativas:<\/p>\n<ul>\n<li>Utilizamos un solo \u00edndice para todos los idiomas, en el que cada campo traducible del documento tiene un campo diferente por cada idioma en el \u00edndice.<\/li>\n<li>Creamos un \u00edndice por idioma, y en cada uno de ellos tenemos la misma informaci\u00f3n, pero traducida al idioma correspondiente.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>A la hora de optar por una u otra soluci\u00f3n debemos tener en cuenta factores como el n\u00famero de idiomas, el porcentaje de campos traducibles frente a campos no traducibles, si se van a lanzar b\u00fasquedas contra varios idiomas a la vez y el n\u00famero total de campos a indexar.<\/p>\n<p>Es importante destacar que <strong>Elasticsearch ofrece analizadores para multitud de idiomas<\/strong>, que analizan los textos teniendo en cuenta las reglas propias de ese idioma, y por tanto es recomendable utilizar para cada campo el analizador correspondiente al idioma de ese campo o \u00edndice, para conseguir unos resultados de b\u00fasqueda m\u00e1s refinados.<\/p>\n<p>&nbsp;<\/p>\n<h2>Configuraci\u00f3n del cluster<\/h2>\n<p>Elasticsearch est\u00e1 especialmente preparado para la <strong>configuraci\u00f3n en cluster<\/strong>. En base a unas propiedades b\u00e1sicas, cuando los diferentes nodos arrancan el cluster se configura autom\u00e1ticamente, y cuando alguno de los nodos queda inaccesible si el cluster est\u00e1 correctamente dimensionado el resto de nodos asumen las funciones del nodo inaccesible, de manera que el cluster contin\u00faa 100% operativo.<\/p>\n<p>Dependiendo del n\u00famero de documentos a indexar y del tama\u00f1o de estos, del n\u00famero de \u00edndices y del volumen y tipo de queries esperadas deber\u00e1 dimensionarse adecuadamente el cluster, tanto en n\u00famero de nodos como en la configuraci\u00f3n de cada uno de ellos (shards, r\u00e9plicas, memoria dedicada, cu\u00e1ntos de ellos son elegibles como master, si son nodos de datos, etc.).<\/p>\n<p>&nbsp;<\/p>\n<p><strong><a href=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2019\/03\/cluster.png\" data-rel=\"lightbox-image-0\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-10420 aligncenter\" src=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2019\/03\/cluster-300x90.png\" alt=\"\" width=\"750\" height=\"225\" srcset=\"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2019\/03\/cluster-300x90.png 300w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2019\/03\/cluster-360x108.png 360w, https:\/\/www.hiberus.com\/crecemos-contigo\/wp-content\/uploads\/2019\/03\/cluster.png 750w\" sizes=\"auto, (max-width: 750px) 100vw, 750px\" \/><\/a>\u00a0<\/strong><\/p>\n<h2>Tipos de b\u00fasquedas<\/h2>\n<p>Finalmente, tenemos que tener claro qu\u00e9 tipos de b\u00fasquedas se van a realizar, y los m\u00faltiples mecanismos que nos ofrece Elasticsearch para refinarlas hasta obtener el comportamiento deseado. Para tener una mejor idea de las b\u00fasquedas que pueden realizar los usuarios, ser\u00e1n muy \u00fatiles algunas <a href=\"https:\/\/www.hiberus.com\/crecemos-contigo\/herramientas-analitica-de-usuarios-en-paginas-web\/\">herramientas de anal\u00edtica digital<\/a>.<\/p>\n<p>En primer lugar, es importante entender el concepto de <strong>scoring<\/strong>. Elasticsearch cuando realiza una b\u00fasqueda otorga (utilizando diferentes criterios) una puntuaci\u00f3n a cada uno de los documentos encontrados. Esta puntuaci\u00f3n es lo que se denomina <em>scoring<\/em>, y los resultados de b\u00fasqueda son devueltos <strong>ordenados de mayor a menor scoring<\/strong> (salvo que indiquemos alg\u00fan criterio de ordenaci\u00f3n diferente al lanzar la b\u00fasqueda). El algoritmo utilizado por Elasticsearch para calcular el scoring de los diferentes documentos puede ser personalizado para ajustarlo a nuestras necesidades.<\/p>\n<p>En la mayor\u00eda de los casos, las b\u00fasquedas de texto deben lanzarse sobre varios campos del documento (nombre, descripci\u00f3n, etc.). Para esto, Elasticsearch ofrece la b\u00fasqueda <strong>multi_match<\/strong>, que permite especificar un listado de campos sobre los que buscar el texto. Adem\u00e1s, existen diferentes tipos de b\u00fasqueda multi_match, dependiendo de c\u00f3mo queramos que Elasticsearch calcule el scoring: se suma el scoring de todos los campos en los que se encuentre el texto, para cada documento solamente cuenta el scoring del campo que hace mejor matching, etc.<\/p>\n<p>Tambi\u00e9n podemos indicar, en una b\u00fasqueda multi_match, la <strong>relevancia<\/strong> de cada uno de los campos de b\u00fasqueda, es decir, qu\u00e9 campo de los indicados es m\u00e1s importante. Por ejemplo, podemos especificar que el campo <em>nombre<\/em> sea el doble de importante que el campo <em>descripcion<\/em>, de forma que si un texto aparece en el nombre de un documento y en la descripci\u00f3n de otro, el primer documento tendr\u00e1 el doble de scoring que el segundo.<\/p>\n<p>Otras funcionalidades que podemos utilizar para refinar las b\u00fasquedas son:<\/p>\n<ul>\n<li><strong>Mimimum_should_match<\/strong>, para especificar el % de las palabras del texto de b\u00fasqueda que deben aparecer en un documento para que sea incluido en los resultados de b\u00fasqueda<\/li>\n<li><strong>Tolerancia a errores de escritura (fuzziness)<\/strong>, pudiendo indicar el n\u00famero de letras no coincidentes que permitimos para que un texto sea considerado un match.<\/li>\n<li>Combinaci\u00f3n de varias sub-queries mediante operadores l\u00f3gicos (must, must_not, should, etc.)<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Adem\u00e1s, en tiempo de b\u00fasqueda podemos indicar a Elasticsearch c\u00f3mo queremos que nos agrupe los resultados: <strong>es lo que se denominan facetas o, en el caso de Elasticsearch, aggregations<\/strong>. El \u00fanico requisito es que los campos que indiquemos como aggregations sean num\u00e9ricos o fechas (para aggregations de rango) o hayan sido indexados como keywords.<\/p>\n<p>Finalmente, si deseamos que el buscador ofrezca <strong>sugerencias<\/strong> mientras estamos tecleando, o queremos funcionalidad <strong>search-as-you-type<\/strong>, como es una de las tendencias del ecommerce actualmente, debemos tenerlo en cuenta a la hora de definir el mapping del \u00edndice, pues Elasticsearch ofrece filtros y tipos de datos especialmente preparados para analizar e indexar la informaci\u00f3n de forma optimizada para este tipo de b\u00fasquedas.<\/p>\n<p>&nbsp;<\/p>\n<p>Hemos visto los factores m\u00e1s importantes a tener en cuenta a la hora de <strong>dise\u00f1ar nuestro motor de indexaci\u00f3n<\/strong> y b\u00fasqueda con Elasticsearch. Las posibilidades que nos ofrece este motor de b\u00fasqueda son innumerables, tanto en indexaci\u00f3n como en b\u00fasqueda, y elegir unas u otras depender\u00e1 del proyecto concreto en el que lo vayamos a utilizar. Adem\u00e1s, hay que tener en cuenta qque <strong>la implantaci\u00f3n de un motor de b\u00fasqueda es un proceso de mejora continua<\/strong>, en el que se parte de una configuraci\u00f3n inicial, y con el paso del tiempo y mediante el an\u00e1lisis de las b\u00fasquedas realizadas por los usuarios, su grado de satisfacci\u00f3n y otros factores esta configuraci\u00f3n de partida se va refinando hasta conseguir los resultados deseados.<\/p>\n<p>&nbsp;<\/p>\n<p>En <a href=\"https:\/\/www.hiberus.com\/agencia-digital\">Hiberus Digital<\/a> disponemos de un equipo de <strong>expertos en Elasticsearch<\/strong>. Si est\u00e1s pensando en implantar esta soluci\u00f3n en tu empresa no dudes en contactar con nosotros.<\/p>\n        <div class=\"row\">\n            <div class=\"block-cta-form\" style=\"background-color: #003664;\">\n                <div class=\"content-cta-form\">\n                    <div class=\"text-cta-form\">\n                        <p class=\"title-cta-form\">\u00bfQuieres m\u00e1s informaci\u00f3n sobre nuestros servicios de agencia digital y tecnolog\u00eda para ecommerce?<\/p>\n                        <p>Contacta con nuestro equipo de hiberus digital<\/p>\n                    <\/div>\n                    <div class=\"form-fields\">\n                        \n<div class=\"wpcf7 no-js\" id=\"wpcf7-f33973-o1\" lang=\"es-ES\" dir=\"ltr\" data-wpcf7-id=\"33973\">\n<div class=\"screen-reader-response\"><p role=\"status\" aria-live=\"polite\" aria-atomic=\"true\"><\/p> <ul><\/ul><\/div>\n<form action=\"\/crecemos-contigo\/wp-json\/wp\/v2\/posts\/10314#wpcf7-f33973-o1\" method=\"post\" class=\"wpcf7-form init\" aria-label=\"Formulario de contacto\" novalidate=\"novalidate\" data-status=\"init\">\n<fieldset class=\"hidden-fields-container\"><input type=\"hidden\" name=\"_wpcf7\" value=\"33973\" \/><input type=\"hidden\" name=\"_wpcf7_version\" value=\"6.1.5\" \/><input type=\"hidden\" name=\"_wpcf7_locale\" value=\"es_ES\" \/><input type=\"hidden\" name=\"_wpcf7_unit_tag\" value=\"wpcf7-f33973-o1\" \/><input type=\"hidden\" name=\"_wpcf7_container_post\" value=\"0\" \/><input type=\"hidden\" name=\"_wpcf7_posted_data_hash\" value=\"\" \/><input type=\"hidden\" name=\"_wpcf7_recaptcha_response\" value=\"\" \/>\n<\/fieldset>\n<div id=\"responsive-form\" class=\"clearfix\">\n\t<div class=\"form-row\">\n\t\t<div class=\"column-half\">\n\t\t\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"nombre\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text wpcf7-validates-as-required\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Nombre *\" value=\"\" type=\"text\" name=\"nombre\" \/><\/span>\n\t\t\t<\/p>\n\t\t<\/div>\n\t\t<div class=\"column-half\">\n\t\t\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"apellido\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text wpcf7-validates-as-required\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Apellido *\" value=\"\" type=\"text\" name=\"apellido\" \/><\/span>\n\t\t\t<\/p>\n\t\t<\/div>\n\t<\/div>\n\t<div class=\"form-row\">\n\t\t<div class=\"column-half\">\n\t\t\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"correo\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-email wpcf7-validates-as-required wpcf7-text wpcf7-validates-as-email\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Correo corporativo *\" value=\"\" type=\"email\" name=\"correo\" \/><\/span>\n\t\t\t<\/p>\n\t\t<\/div>\n\t\t<div class=\"column-half\">\n\t\t\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"telf-contacto\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-tel wpcf7-validates-as-required wpcf7-text wpcf7-validates-as-tel\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Tel\u00e9fono *\" value=\"\" type=\"tel\" name=\"telf-contacto\" \/><\/span>\n\t\t\t<\/p>\n\t\t<\/div>\n\t<\/div>\n\t<div class=\"form-row\">\n\t\t<div class=\"column-half\">\n\t\t\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"compania\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text wpcf7-validates-as-required\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Compa\u00f1ia *\" value=\"\" type=\"text\" name=\"compania\" \/><\/span>\n\t\t\t<\/p>\n\t\t<\/div>\n\t<\/div>\n\t<div class=\"form-row\">\n\t\t<div class=\"column-full\">\n\t\t\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"mensaje\"><textarea cols=\"40\" rows=\"10\" maxlength=\"2000\" class=\"wpcf7-form-control wpcf7-textarea wpcf7-validates-as-required\" aria-required=\"true\" aria-invalid=\"false\" placeholder=\"Mensaje *\" name=\"mensaje\"><\/textarea><\/span>\n\t\t\t<\/p>\n\t\t<\/div>\n\t<\/div>\n\t<div class=\"form-row\">\n\t\t<div class=\"column-full color-acceptance\">\n\t\t\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"politica\"><span class=\"wpcf7-form-control wpcf7-acceptance\"><span class=\"wpcf7-list-item\"><label><input type=\"checkbox\" name=\"politica\" value=\"1\" aria-invalid=\"false\" \/><span class=\"wpcf7-list-item-label\">He le\u00eddo y acepto la <a href=\"https:\/\/www.hiberus.com\/politica\" target=\"_blank\"><u>Pol\u00edtica de privacidad<\/u><\/a><\/span><\/label><\/span><\/span><\/span>\n\t\t\t<\/p>\n\t\t<\/div>\n\t<\/div>\n\t<div class=\"form-row\">\n\t\t<div class=\"column-full color-acceptance\">\n\t\t\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"marketing\"><span class=\"wpcf7-form-control wpcf7-acceptance optional\"><span class=\"wpcf7-list-item\"><label><input type=\"checkbox\" name=\"marketing\" value=\"1\" aria-invalid=\"false\" \/><span class=\"wpcf7-list-item-label\">Me gustar\u00eda recibir comunicaciones de marketing de Hiberus y sobre sus productos, servicios y eventos.<\/span><\/label><\/span><\/span><\/span>\n\t\t\t<\/p>\n\t\t<\/div>\n\t<\/div>\n\t<div class=\"form-row\">\n\t\t<div class=\"column-half\">\n\t\t\t<p><input class=\"wpcf7-form-control wpcf7-submit has-spinner\" type=\"submit\" value=\"Contacta con nosotros\" \/>\n\t\t\t<\/p>\n\t\t<\/div>\n\t<\/div>\n\t<div class=\"form-row\">\n\t\t<div id=\"campos_ocultos\" class=\"hidden\">\n\t\t\t<p><span class=\"wpcf7-form-control-wrap\" data-name=\"oculto_analitica_new1\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text\" id=\"oculto_analitica_new1\" aria-invalid=\"false\" value=\"\" type=\"text\" name=\"oculto_analitica_new1\" \/><\/span><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"oculto_analitica_new2\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text\" id=\"oculto_analitica_new2\" aria-invalid=\"false\" value=\"\" type=\"text\" name=\"oculto_analitica_new2\" \/><\/span><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"oculto_analitica_new3\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text\" id=\"oculto_analitica_new3\" aria-invalid=\"false\" value=\"\" type=\"text\" name=\"oculto_analitica_new3\" \/><\/span><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"oculto_analitica_new4\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text\" id=\"oculto_analitica_new4\" aria-invalid=\"false\" value=\"\" type=\"text\" name=\"oculto_analitica_new4\" \/><\/span><br \/>\n<span class=\"wpcf7-form-control-wrap\" data-name=\"oculto_analitica_new_p\"><input size=\"40\" maxlength=\"400\" class=\"wpcf7-form-control wpcf7-text\" id=\"oculto_analitica_new_p\" aria-invalid=\"false\" value=\"\" type=\"text\" name=\"oculto_analitica_new_p\" \/><\/span>\n\t\t\t<\/p>\n\t\t<\/div>\n\t<\/div>\n<\/div>\n\n<!--end responsive-form--><div class=\"wpcf7-response-output\" aria-hidden=\"true\"><\/div>\n<\/form>\n<\/div>\n                    <\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n        \n","protected":false},"excerpt":{"rendered":"<p>El ritmo imparable en la evoluci\u00f3n de las nuevas tecnolog\u00edas que se lleva produciendo desde hace ya unos cuantos a\u00f1os lleva asociado&#8230;<\/p>\n","protected":false},"author":75,"featured_media":10315,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_ayudawp_aiss_exclude":false,"footnotes":""},"categories":[3,232],"tags":[50,61],"class_list":{"0":"post-10314","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-negocio-electronico","8":"category-portales-dxp","9":"tag-liferay","10":"tag-portal-corporativo"},"acf":[],"_links":{"self":[{"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/posts\/10314","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/users\/75"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/comments?post=10314"}],"version-history":[{"count":5,"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/posts\/10314\/revisions"}],"predecessor-version":[{"id":58609,"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/posts\/10314\/revisions\/58609"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/media\/10315"}],"wp:attachment":[{"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/media?parent=10314"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/categories?post=10314"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hiberus.com\/crecemos-contigo\/wp-json\/wp\/v2\/tags?post=10314"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}