You are viewing an old revision of this post, from December 22, 2021 @ 14:41:11. See below for differences between this version and the current revision.
Quando migramos de Lucene para Elasticsearch, Liferay manteve o mesmo processo: ao salvar uma entidade, indexamos seus campos. Só que, agora, no Elasticsearch.
Contudo, Elasticsearch não é uma biblioteca: é um sistema servidor altamente distribuído, rodando em clusters. Isto nos forçou a tomar novas decisões, e nos presenteou com algumas lições valiosas. Para entendê-las, convém revisar como Elasticsearch pode ser usado.
O modelo de programação de Elasticsearch
No Elasticsearch, os dados são salvos como pares de chave-valor, agrupados em documentos. Os documentos representam as instâncias das entidades.
Um índice contem vários documentos. Para efeitos práticos, todos os documentos de um índice são mesmo tipo (ao contrário de SGBDs, que aceitam várias tabelas em um banco de dados). O tipo define que campos são encontrados nos documentos e é usualmente dinâmico, permitindo que campos novos sejam adicionados por mera inserção.
Vários índices para vários portais
É muito comum trabalhar, no Elasticsearch, com vários índices diferentes em um mesmo cluster, para o mesmo formato de dados. Como seriam os índices do Liferay. Para responder isso, é necessário ter em mente que Liferay é multi-tenant.
Sabe quando você entra, digamos, em wordpress.com ou blogspot.com e cria um blog? Seu blog é totalmente independente de qualquer outro no mesmo site. O mesmo se aplica ao Liferay Portal, que permite criar instâncias independentes em uma mesma instalação.
Os engenheiros decidiram então que cada instância teria seu próprio índice no Elasticsearch. Separar os dados desta maneira nos permitiu controlar melhor o acesso de uma instância, assim como nos deu flexibilidade para otimizar Elasticsearch.
Por outro lado, embora houvesse vários índices, todos teriam o mesmo formato. Como seria esse formato?
Tudo junto e misturado
Seguindo as recomendações da Elastic, cada índice teria um só tipo. Neste tipo, indexamos as mais diversas entidades.
Na hora em que uma entidade é salva no banco de dados, os valores de suas colunas são indexados em um só tipo de documento. Assim, o post de blog, o artigo do CMS, o comentário no fórum… todos serão representados pelo mesmo formato. O título do blog, do evento, da wiki etc. se tornarão o campo title de vários documentos. O mesmo se passa com campos como content, summary, description…
Estes campos representam características comuns a várias entidades. Quando todas elas são indexadas em um só índice, com um schema uniforme, a busca se torna mais simples: basca procurar pela string nestes documentos.
Os documentos Elasticsearch também contêm bastante metadados, sendo alguns dos mais importantes o campo entryClassName (o tipo da entidade que o documento representa, geralmente o nome de uma classe Java) e entryClassPK (identificador da entidade na tabela SQL). Desta forma, podemos encontrar o que o usuário procura e, a partir daí, recuperar a entidade correta do bando de dados.
Esta arquitetura é uma herança da busca com Lucene mas, nada surpreendentemente, funcionou perfeitamente com Elasticsearch. Esta foi uma de nossas primeiras lições:
Decidida a arquitetura dos dados, a próxima questão a resolver era: como indexar e buscar as entidades no índice da instância. Este será o tema da parte 3 desta série.
Post Revisions:
- December 22, 2021 @ 14:43:28 [Current Revision] by brandizzi
- December 22, 2021 @ 14:43:28 by brandizzi
- December 22, 2021 @ 14:41:11 by brandizzi
Changes:
December 22, 2021 @ 14:41:11 | Current Revision | ||
---|---|---|---|
Content | |||
Unchanged: <!-- wp:paragraph --> | Unchanged: <!-- wp:paragraph --> | ||
Unchanged: <p>Quando <a href="https:/ /suspensao.blog.br/descrenca/ liferay-elasticsearch- 1-historia/">migramos de Lucene para Elasticsearch</a>, Liferay manteve o mesmo processo: ao salvar uma entidade, indexamos seus campos. Só que, agora, no Elasticsearch.</p> | Unchanged: <p>Quando <a href="https:/ /suspensao.blog.br/descrenca/ liferay-elasticsearch- 1-historia/">migramos de Lucene para Elasticsearch</a>, Liferay manteve o mesmo processo: ao salvar uma entidade, indexamos seus campos. Só que, agora, no Elasticsearch.</p> | ||
Unchanged: <!-- /wp:paragraph --> | Unchanged: <!-- /wp:paragraph --> | ||
Unchanged: <!-- wp:paragraph --> | Unchanged: <!-- wp:paragraph --> | ||
Unchanged: <p>Contudo, Elasticsearch não é uma biblioteca: é um sistema servidor altamente distribuído, rodando em <em>cluster</em>s. Isto nos forçou a tomar novas decisões, e nos presenteou com algumas lições valiosas. Para entendê-las, convém revisar como Elasticsearch pode ser usado.</p> | Unchanged: <p>Contudo, Elasticsearch não é uma biblioteca: é um sistema servidor altamente distribuído, rodando em <em>cluster</em>s. Isto nos forçou a tomar novas decisões, e nos presenteou com algumas lições valiosas. Para entendê-las, convém revisar como Elasticsearch pode ser usado.</p> | ||
Unchanged: <!-- /wp:paragraph --> | Unchanged: <!-- /wp:paragraph --> | ||
Unchanged: <!-- wp:heading --> | Unchanged: <!-- wp:heading --> | ||
Unchanged: <h2>O modelo de programação de Elasticsearch</h2> | Unchanged: <h2>O modelo de programação de Elasticsearch</h2> | ||
Unchanged: <!-- /wp:heading --> | Unchanged: <!-- /wp:heading --> | ||
Unchanged: <!-- wp:paragraph --> | Unchanged: <!-- wp:paragraph --> | ||
Unchanged: <p>No Elasticsearch, os dados são salvos como pares de chave-valor, agrupados em documentos. Os documentos representam as instâncias das entidades.</p> | Unchanged: <p>No Elasticsearch, os dados são salvos como pares de chave-valor, agrupados em documentos. Os documentos representam as instâncias das entidades.</p> | ||
Unchanged: <!-- /wp:paragraph --> | Unchanged: <!-- /wp:paragraph --> | ||
Deleted: <!-- wp:image {"id":461," | Added: <!-- wp:image {"align":"center" ,"id":461,"width" :768,"height" :724,"sizeSlug":"large"," linkDestination":"media"} --> | ||
Deleted: < | Added: <div class="wp-block- image"><figure class="aligncenter size-large is-resized"><a href="https:/ /suspensao.blog.br/descrenca/ wp-content/uploads/2021/12/ documents.indices.png"><img src="https:// suspensao.blog.br/descrenca/ wp-content/uploads/2021/12/ documents.indices- 1024x965.png" alt="" class="wp-image-461" width="768" height="724"/ ></a></figure></div> | ||
Unchanged: <!-- /wp:image --> | Unchanged: <!-- /wp:image --> | ||
Unchanged: <!-- wp:paragraph --> | Unchanged: <!-- wp:paragraph --> | ||
Unchanged: <p>Um índice contem vários documentos. Para efeitos práticos, todos os documentos de um índice são mesmo tipo (ao contrário de SGBDs, que aceitam várias tabelas em um banco de dados). O tipo define que campos são encontrados nos documentos e é usualmente dinâmico, permitindo que campos novos sejam adicionados por mera inserção.</p> | Unchanged: <p>Um índice contem vários documentos. Para efeitos práticos, todos os documentos de um índice são mesmo tipo (ao contrário de SGBDs, que aceitam várias tabelas em um banco de dados). O tipo define que campos são encontrados nos documentos e é usualmente dinâmico, permitindo que campos novos sejam adicionados por mera inserção.</p> | ||
Unchanged: <!-- /wp:paragraph --> | Unchanged: <!-- /wp:paragraph --> | ||
Unchanged: <!-- wp:heading --> | Unchanged: <!-- wp:heading --> | ||
Unchanged: <h2>Vários índices para vários portais</h2> | Unchanged: <h2>Vários índices para vários portais</h2> | ||
Unchanged: <!-- /wp:heading --> | Unchanged: <!-- /wp:heading --> | ||
Unchanged: <!-- wp:paragraph --> | Unchanged: <!-- wp:paragraph --> | ||
Unchanged: <p>É muito comum trabalhar, no Elasticsearch, com vários índices diferentes em um mesmo <em>cluster</em>, para o mesmo formato de dados. Como seriam os índices do Liferay. Para responder isso, é necessário ter em mente que Liferay é <em>multi-tenant</em>.</p> | Unchanged: <p>É muito comum trabalhar, no Elasticsearch, com vários índices diferentes em um mesmo <em>cluster</em>, para o mesmo formato de dados. Como seriam os índices do Liferay. Para responder isso, é necessário ter em mente que Liferay é <em>multi-tenant</em>.</p> | ||
Unchanged: <!-- /wp:paragraph --> | Unchanged: <!-- /wp:paragraph --> | ||
Unchanged: <!-- wp:paragraph --> | Unchanged: <!-- wp:paragraph --> | ||
Unchanged: <p>Sabe quando você entra, digamos, em wordpress.com ou blogspot.com e cria um blog? Seu blog é totalmente independente de qualquer outro no mesmo site. O mesmo se aplica ao Liferay Portal, que permite criar <em>instâncias</em> independentes em uma mesma instalação.</p> | Unchanged: <p>Sabe quando você entra, digamos, em wordpress.com ou blogspot.com e cria um blog? Seu blog é totalmente independente de qualquer outro no mesmo site. O mesmo se aplica ao Liferay Portal, que permite criar <em>instâncias</em> independentes em uma mesma instalação.</p> | ||
Unchanged: <!-- /wp:paragraph --> | Unchanged: <!-- /wp:paragraph --> | ||
Unchanged: <!-- wp:paragraph --> | Unchanged: <!-- wp:paragraph --> | ||
Unchanged: <p>Os engenheiros decidiram então que cada instância teria seu próprio índice no Elasticsearch. Separar os dados desta maneira nos permitiu controlar melhor o acesso de uma instância, assim como nos deu flexibilidade para otimizar Elasticsearch.</p> | Unchanged: <p>Os engenheiros decidiram então que cada instância teria seu próprio índice no Elasticsearch. Separar os dados desta maneira nos permitiu controlar melhor o acesso de uma instância, assim como nos deu flexibilidade para otimizar Elasticsearch.</p> | ||
Unchanged: <!-- /wp:paragraph --> | Unchanged: <!-- /wp:paragraph --> | ||
Unchanged: <!-- wp:paragraph --> | Unchanged: <!-- wp:paragraph --> | ||
Unchanged: <p>Por outro lado, embora houvesse vários índices, todos teriam o mesmo formato. Como seria esse formato?</p> | Unchanged: <p>Por outro lado, embora houvesse vários índices, todos teriam o mesmo formato. Como seria esse formato?</p> | ||
Unchanged: <!-- /wp:paragraph --> | Unchanged: <!-- /wp:paragraph --> | ||
Unchanged: <!-- wp:heading --> | Unchanged: <!-- wp:heading --> | ||
Unchanged: <h2>Tudo junto e misturado</h2> | Unchanged: <h2>Tudo junto e misturado</h2> | ||
Unchanged: <!-- /wp:heading --> | Unchanged: <!-- /wp:heading --> | ||
Unchanged: <!-- wp:paragraph --> | Unchanged: <!-- wp:paragraph --> | ||
Unchanged: <p>Seguindo as recomendações da Elastic, cada índice teria um só tipo. Neste tipo, indexamos as mais diversas entidades.</p> | Unchanged: <p>Seguindo as recomendações da Elastic, cada índice teria um só tipo. Neste tipo, indexamos as mais diversas entidades.</p> | ||
Unchanged: <!-- /wp:paragraph --> | Unchanged: <!-- /wp:paragraph --> | ||
Unchanged: <!-- wp:paragraph --> | Unchanged: <!-- wp:paragraph --> | ||
Unchanged: <p>Na hora em que uma entidade é salva no banco de dados, os valores de suas colunas são indexados em um só tipo de documento. Assim, o post de blog, o artigo do CMS, o comentário no fórum... todos serão representados pelo mesmo formato. O título do blog, do evento, da wiki etc. se tornarão o campo <kbd>title</kbd> de vários documentos. O mesmo se passa com campos como <kbd>content</kbd>, <kbd>summary</kbd>, <kbd>description< /kbd>...</p> | Unchanged: <p>Na hora em que uma entidade é salva no banco de dados, os valores de suas colunas são indexados em um só tipo de documento. Assim, o post de blog, o artigo do CMS, o comentário no fórum... todos serão representados pelo mesmo formato. O título do blog, do evento, da wiki etc. se tornarão o campo <kbd>title</kbd> de vários documentos. O mesmo se passa com campos como <kbd>content</kbd>, <kbd>summary</kbd>, <kbd>description< /kbd>...</p> | ||
Unchanged: <!-- /wp:paragraph --> | Unchanged: <!-- /wp:paragraph --> | ||
Deleted: <!-- wp:image {"id":474," | Added: <!-- wp:image {"align":"center" ,"id":474,"width" :768,"height" :528,"sizeSlug":"large"," linkDestination":"media"} --> | ||
Deleted: < | Added: <div class="wp-block- image"><figure class="aligncenter size-large is-resized"><a href="https:/ /suspensao.blog.br/descrenca/ wp-content/uploads/2021/12/ all-in-one.png"><img src="https:// suspensao.blog.br/descrenca/ wp-content/uploads/2021/12/ all-in-one-1024x704.png" alt="" class="wp-image-474" width="768" height="528"/ ></a></figure></div> | ||
Unchanged: <!-- /wp:image --> | Unchanged: <!-- /wp:image --> | ||
Unchanged: <!-- wp:paragraph --> | Unchanged: <!-- wp:paragraph --> | ||
Unchanged: <p>Estes campos representam características comuns a várias entidades. Quando todas elas são indexadas em um só índice, com um <em>schema</em> uniforme, a busca se torna mais simples: basca procurar pela <em>string</em> nestes documentos.</p> | Unchanged: <p>Estes campos representam características comuns a várias entidades. Quando todas elas são indexadas em um só índice, com um <em>schema</em> uniforme, a busca se torna mais simples: basca procurar pela <em>string</em> nestes documentos.</p> | ||
Unchanged: <!-- /wp:paragraph --> | Unchanged: <!-- /wp:paragraph --> | ||
Unchanged: <!-- wp:paragraph --> | Unchanged: <!-- wp:paragraph --> | ||
Unchanged: <p>Os documentos Elasticsearch também contêm bastante metadados, sendo alguns dos mais importantes o campo <kbd>entryClassName</kbd> (o tipo da entidade que o documento representa, geralmente o nome de uma classe Java) e <kbd>entryClassPK</kbd> (identificador da entidade na tabela SQL). Desta forma, podemos encontrar o que o usuário procura e, a partir daí, recuperar a entidade correta do bando de dados.</p> | Unchanged: <p>Os documentos Elasticsearch também contêm bastante metadados, sendo alguns dos mais importantes o campo <kbd>entryClassName</kbd> (o tipo da entidade que o documento representa, geralmente o nome de uma classe Java) e <kbd>entryClassPK</kbd> (identificador da entidade na tabela SQL). Desta forma, podemos encontrar o que o usuário procura e, a partir daí, recuperar a entidade correta do bando de dados.</p> | ||
Unchanged: <!-- /wp:paragraph --> | Unchanged: <!-- /wp:paragraph --> | ||
Unchanged: <!-- wp:paragraph --> | Unchanged: <!-- wp:paragraph --> | ||
Unchanged: <p>Esta arquitetura é uma herança da busca com Lucene mas, nada surpreendentemente, funcionou perfeitamente com Elasticsearch. Esta foi uma de nossas primeiras lições:</p> | Unchanged: <p>Esta arquitetura é uma herança da busca com Lucene mas, nada surpreendentemente, funcionou perfeitamente com Elasticsearch. Esta foi uma de nossas primeiras lições:</p> | ||
Unchanged: <!-- /wp:paragraph --> | Unchanged: <!-- /wp:paragraph --> | ||
Unchanged: <!-- wp:pullquote --> | Unchanged: <!-- wp:pullquote --> | ||
Unchanged: <figure class="wp-block- pullquote"><blockquote><p>Para implementar busca texutal, junte vários tipos de unidade em um só tipo de documento.</p> </blockquote></figure> | Unchanged: <figure class="wp-block- pullquote"><blockquote><p>Para implementar busca texutal, junte vários tipos de unidade em um só tipo de documento.</p> </blockquote></figure> | ||
Unchanged: <!-- /wp:pullquote --> | Unchanged: <!-- /wp:pullquote --> | ||
Unchanged: <!-- wp:paragraph --> | Unchanged: <!-- wp:paragraph --> | ||
Unchanged: <p>Decidida a arquitetura dos dados, a próxima questão a resolver era: como indexar e buscar as entidades no índice da instância. Este será o tema da parte 3 desta série.</p> | Unchanged: <p>Decidida a arquitetura dos dados, a próxima questão a resolver era: como indexar e buscar as entidades no índice da instância. Este será o tema da parte 3 desta série.</p> | ||
Unchanged: <!-- /wp:paragraph --> | Unchanged: <!-- /wp:paragraph --> |
Note: Spaces may be added to comparison text to allow better line wrapping.