{"id":407,"date":"2021-11-10T11:35:00","date_gmt":"2021-11-10T14:35:00","guid":{"rendered":"https:\/\/suspensao.blog.br\/descrenca\/?p=407"},"modified":"2021-11-09T19:13:08","modified_gmt":"2021-11-09T22:13:08","slug":"liferay-elasticsearch-1-historia","status":"publish","type":"post","link":"https:\/\/suspensao.blog.br\/descrenca\/liferay-elasticsearch-1-historia\/","title":{"rendered":"Busca textual no Liferay Portal com Elasticsearch &#8211; Parte 1: Hist\u00f3ria"},"content":{"rendered":"\n<div class=\"wp-block-cover has-background-dim\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1368\" height=\"1000\" data-attachment-id=\"455\" data-permalink=\"https:\/\/suspensao.blog.br\/descrenca\/liferay-elasticsearch-1-historia\/portal-cropped\/\" data-orig-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2021\/11\/portal-cropped.jpg?fit=1368%2C1000&amp;ssl=1\" data-orig-size=\"1368,1000\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"portal-cropped\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2021\/11\/portal-cropped.jpg?fit=300%2C219&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2021\/11\/portal-cropped.jpg?fit=1024%2C749&amp;ssl=1\" class=\"wp-block-cover__image-background wp-image-455\" alt=\"\" src=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2021\/11\/portal-cropped.jpg?resize=1368%2C1000&#038;ssl=1\" style=\"object-position:50% 10%\" data-object-fit=\"cover\" data-object-position=\"50% 10%\" srcset=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2021\/11\/portal-cropped.jpg?w=1368&amp;ssl=1 1368w, https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2021\/11\/portal-cropped.jpg?resize=300%2C219&amp;ssl=1 300w, https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2021\/11\/portal-cropped.jpg?resize=1024%2C749&amp;ssl=1 1024w, https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2021\/11\/portal-cropped.jpg?resize=768%2C561&amp;ssl=1 768w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<p class=\"has-text-align-center has-large-font-size\">Qual a aplica\u00e7\u00e3o indispens\u00e1vel de um portal web?<\/p>\n<\/div><\/div>\n\n\n\n<p><a href=\"https:\/\/www.liferay.com\/\">Liferay<\/a> Portal \u00e9 uma plataforma de portais web, refer\u00eancia de mercado, open source e em Java. Um portal web \u00e9 um software que suporta v\u00e1rias aplica\u00e7\u00f5es, chamadas portlets; portlets podem inclusive estar na mesma p\u00e1gina web. O Liferay Portal, por exemplo, inclui CMS, blog, wiki, f\u00f3runs, calend\u00e1rio, formul\u00e1rios, <em>workflow<\/em>, <em>e-commerce<\/em> e muito mais, por padr\u00e3o. Ainda \u00e9 poss\u00edvel criar suas pr\u00f3prias aplica\u00e7\u00f5es e acrescent\u00e1-las ao portal.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Por que \u00e9 dif\u00edcil fazer buscas em um portal<\/h2>\n\n\n\n<p>Uma aplica\u00e7\u00e3o obrigat\u00f3ria em todo portal \u00e9 a pesquisa global. Usu\u00e1rios querem uma barra de busca simples, que procure por dados de todas as diferentes aplica\u00e7\u00f5es.<\/p>\n\n\n\n<p>Isto \u00e9 desafiador em um portal baseado em SQL como Liferay. Cada aplica\u00e7\u00e3o salva seus dados em tabelas pr\u00f3prias. SQL &#8220;tradicional&#8221;  n\u00e3o \u00e9 uma solu\u00e7\u00e3o razo\u00e1vel para estes casos: as <em>queries<\/em> seriam imensas e dif\u00edceis de construir. <\/p>\n\n\n\n<p>Al\u00e9m disso, faltam a SQL funcionalidades b\u00e1sicas de busca textual. Alguns dialetos de SQL possuem capacidades extras, mas Liferay Portal pode rodar em mais de quarenta SGBDs diferentes. N\u00e3o poder\u00edamos utilizar extens\u00f5es de <em>vendors<\/em>.<\/p>\n\n\n\n<p>Outra solu\u00e7\u00e3o era necess\u00e1ria.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Bibliotecas como solu\u00e7\u00e3o<\/h2>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2021\/11\/lucene2.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"447\" data-permalink=\"https:\/\/suspensao.blog.br\/descrenca\/liferay-elasticsearch-1-historia\/lucene2\/\" data-orig-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2021\/11\/lucene2.png?fit=318%2C159&amp;ssl=1\" data-orig-size=\"318,159\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"lucene2\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2021\/11\/lucene2.png?fit=300%2C150&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2021\/11\/lucene2.png?fit=318%2C159&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2021\/11\/lucene2.png?resize=300%2C159&#038;ssl=1\" alt=\"Logotipo da Lucene, em que a palavra &quot;lucene&quot; aparece escrita em letras min\u00fasculas cursivas, e o &quot;l&quot; do come\u00e7o possui algumas &quot;franjas&quot; apontando para tr\u00e1s, dando a sensa\u00e7\u00e3o de velocidade, movimento para frente.\" class=\"wp-image-447\" width=\"300\" height=\"159\"\/><\/a><figcaption>Logotipo de Lucene<\/figcaption><\/figure><\/div>\n\n\n\n<p>Essa outra solu\u00e7\u00e3o era <a href=\"https:\/\/lucene.apache.org\/\">Apache Lucene<\/a>, a biblioteca Java de indexa\u00e7\u00e3o e busca. Lucene tornou-se praticamente a escolha natural quando se trabalha com pesquisa textual. Mesmo solu\u00e7\u00f5es mais robustas como Solr e Elasticsearch s\u00e3o constru\u00eddos ao redor dele.<\/p>\n\n\n\n<p>Como utiliz\u00e1vamos a biblioteca? Quando o Liferay salvava uma entidade busc\u00e1vel no banco SQL, passava seus campos para o Lucene. Lucene indexava o conte\u00fado (em um formato eficiente para busca) e o salvava no disco.<\/p>\n\n\n\n<p>Havia por\u00e9m um desafio. Em produ\u00e7\u00e3o, portais Liferay sempre rodam em <em>clusters<\/em>. Como o Lucene salvava os dados no disco local, o conte\u00fado era indexado apenas no n\u00f3 do <em>cluster<\/em> Liferay que recebeu a requisi\u00e7\u00e3o.  Para superar esta limita\u00e7\u00e3o, sincroniz\u00e1vamos os  \u00edndices de Lucene com <a href=\"http:\/\/www.jgroups.org\/\">JGroups<\/a>, uma biblioteca de mensageria que enviava mensagens entre os v\u00e1rios n\u00f3s. <\/p>\n\n\n\n<p>Utilizamos esta solu\u00e7\u00e3o por v\u00e1rios anos&#8230; at\u00e9 adotarmos Elasticsearch.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">O que \u00e9 Elasticsearch?<\/h2>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2021\/11\/elasticsearch-transparent.png?ssl=1\"><img data-recalc-dims=\"1\" decoding=\"async\" data-attachment-id=\"442\" data-permalink=\"https:\/\/suspensao.blog.br\/descrenca\/liferay-elasticsearch-1-historia\/elasticsearch-transparent\/\" data-orig-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2021\/11\/elasticsearch-transparent.png?fit=454%2C111&amp;ssl=1\" data-orig-size=\"454,111\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"elasticsearch-transparent\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2021\/11\/elasticsearch-transparent.png?fit=300%2C73&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2021\/11\/elasticsearch-transparent.png?fit=454%2C111&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2021\/11\/elasticsearch-transparent.png?w=350&#038;ssl=1\" alt=\"Logotipo atual do Elasticsearch, em que tr\u00eas figuras geom\u00e9tricas formam um &quot;E&quot; meio arredondado.\" class=\"wp-image-442\"  srcset=\"https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2021\/11\/elasticsearch-transparent.png?w=454&amp;ssl=1 454w, https:\/\/i0.wp.com\/suspensao.blog.br\/descrenca\/wp-content\/uploads\/2021\/11\/elasticsearch-transparent.png?resize=300%2C73&amp;ssl=1 300w\" sizes=\"(max-width: 454px) 100vw, 454px\" \/><\/a><figcaption>Logotipo atual do Elasticsearch. (Confesso que achava o antigo mais fofinho.)<\/figcaption><\/figure><\/div>\n\n\n\n<p>Resumidamente, <a href=\"https:\/\/www.elastic.co\/pt\/elasticsearch\/\">Elasticsearch<\/a> \u00e9 banco de dados NoSQL criado com \u00eanfase em para busca textual.<\/p>\n\n\n\n<p>Baseado em Lucene, Elasticsearch \u00e9 extremamente escal\u00e1vel, distribu\u00eddo e simples. Hoje, al\u00e9m de ser quase um padr\u00e3o <em>de facto<\/em> para busca textual, Elasticsearch \u00e9 popular para an\u00e1lise de dados, monitoramento e seguran\u00e7a, especialmente em combina\u00e7\u00e3o com o resto da <a href=\"https:\/\/www.elastic.co\/pt\/elastic-stack\">Elastic Stack<\/a>. Atualmente utilizamos para muitas destas outras fun\u00e7\u00f5es na Liferay, mas hoje focaremos aqui na busca textual.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">As raz\u00f5es da migra\u00e7\u00e3o<\/h2>\n\n\n\n<p>Por que abandonamos nossa solu\u00e7\u00e3o e adotamos Elasticsearch? Por v\u00e1rias raz\u00f5es. <\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Lucene \u00e9 uma biblioteca de baixo n\u00edvel, o que tornava a manuten\u00e7\u00e3o do c\u00f3digo mais trabalhosa e cara. Elasticsearch \u00e9 mais poderoso, simples e flex\u00edvel.<\/li><li>Elasticsearch roda e suas pr\u00f3prias VMs e <em>cluster<\/em>, enquanto Lucene rodava na JVM de Liferay. Mover a busca para fora das VMs do Liferay reduziu os recursos necess\u00e1rios nos servidores Liferay.<\/li><li>As JVMs separadas do Elasticsearch tamb\u00e9m permite otimiz\u00e1-las para busca sem conflitos com as configura\u00e7\u00f5es ideais para portal das VMs do Liferay.<\/li><li>Clusteriza\u00e7\u00e3o e sincroniza\u00e7\u00e3o j\u00e1 eram partes de Elasticsearch. Pudemos deletar <em>milhares<\/em> de linhas de c\u00f3digo! <\/li><\/ol>\n\n\n\n<p>Al\u00e9m de tudo, Elasticsearch se tornava padr\u00e3o de mercado. Foi uma escolha natural.<\/p>\n\n\n\n<p>Neste processo, aprendemos muito sobre Elasticsearch. Veremos um pouco do que descobrimos na pr\u00f3xima parte.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Implementar busca textual em um portal web \u00e9 um desafio e tanto! Como resolvemos no Liferay? Vamos ver a hist\u00f3ria<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[128,127,126,125,129,124,1],"tags":[132,130,131,134,133],"class_list":["post-407","post","type-post","status-publish","format-standard","hentry","category-bibliotecas","category-busca-textual","category-elasticsearch","category-liferay","category-lucene","category-servidor","category-uncategorized","tag-busca-textual","tag-elasticsearch","tag-lucene","tag-portais-web","tag-sql"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p23QLV-6z","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/posts\/407","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/comments?post=407"}],"version-history":[{"count":9,"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/posts\/407\/revisions"}],"predecessor-version":[{"id":457,"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/posts\/407\/revisions\/457"}],"wp:attachment":[{"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/media?parent=407"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/categories?post=407"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/suspensao.blog.br\/descrenca\/wp-json\/wp\/v2\/tags?post=407"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}