Fala Radizeiro e Radizeira, tudo bem com vocês?
Passamos essa nossa série mostrando tudo sobre o Elasticsearch.
Agora que você já conhece bem sobre o Elastic, agora iremos conhecer como utilizá-lo no Delphi.
Isso mesmo, é possível integrar o elastic com o Delphi, e você verá o quanto é fácil essa integração.
E eu estive criando uma biblioteca para trabalhar com o elastic, pois não encontrei nenhuma biblioteca que possa fazer esse trabalho para nós.
E por que não tinha?
Porque ele é REST, e trabalhar com REST no Delphi é algo muito simples.
Mas eu achei muito interessante fazer algo que facilitasse, e pudesse olhar a documentação do elastic, onde diz quais a chamada e traduzir para dentro do Delphi.
Eu criei esse framework, e está no meu github(colocar link).
E observe o código de como é simples sua implementação.
Primeira coisa que você tem que entender, é que esse framework trabalha como interface.
Onde você terá que criar uma variável que tenha como tipo a interface iTBGElasticSearch.
private FElastic : iTBGElasticSearch;
E dentro do create do seu formulário, você simplesmente irá inserir a classe concreta dessa interface.
procedure TForm1.FormCreate(Sender: TObject); begin FElastic := TTBGElasticSearch.New .Host('http://localhost') .Port(9200) .Index('passaporte') ._Type('notas') .DataSet(FDMenTable1); end;
Observe que ao instanciar eu passei o host, porta, a index, que seria o banco de dados, type(tabela), e seu retorno irá alimentar um Dataset, que nesse caso foi o FDMemTable.
Nesse caso o nosso FDMemtable já encontra-se ligado via livebinding com o stringgrid.
E seu uso é muito simples, na hora que for implementar suas querys dentro dele.
Observe como é realizada a busca, e vamos traduzir aquela busca que fizemos anteriormente.
Essa busca que fizemos no postman, é possível realizar diretamente no componente.
Isso mesmo, essa busca por dois campos.
procedure TForm1.Button5Click(Sender: TObject); begin FElastic ._search .Query .Bool .Must .Match .AddField('ITENS.DESCRICAO_PRODUTO', 'FILTRO') .AddField('ITENS.DESCRICAO_PRODUTO','ANEL') .&End .&End .&End .&End .Execute; end;
Simplesmente fizemos a mesma coisa que foi feita na imagem da pesquisa no postman, mas convertendo para a linguagem Delphi.
Peguei o JSON, e traduzi para interface no Delphi para que ele já monta-se a estrutura para nós mais fácil.
O que nós vimos na documentação do elastic, conseguimos traduzir para o Delphi.
Vamos compilar, e observar que o Delphi terá que nos trazer tudo que esteja na condição que acabamos de passar.
Observe que ele trouxe tudo dentro daquela condição.
Só o que acontece aqui, o elastic por padrão, em todas as buscas que você faz com ele, ele traz os 10 primeiros registros.
Nesse caso você pode aumentar e paginar, fazer scroll, tem várias opções para isso.
Se eu quero aumentar minha quantidade de registro na minha busca, dentro da propriedade query eu tenho o Size, onde eu posso definir a quantidade de registro de retorno.
procedure TForm1.Button5Click(Sender: TObject); begin FElastic ._search .Query .Bool .Must .Match .AddField('ITENS.DESCRICAO_PRODUTO', 'FILTRO') .AddField('ITENS.DESCRICAO_PRODUTO','ANEL') .&End .&End .&End .&End .Size(1000) .Execute; end;
Com isso observe que temos um retorno com mais registros.
Ele trouxe os 1000 registros que contêm as condições da pesquisa.
Tudo isso diretamente do Delphi.
E como você deve lembrar, o elastic traz para nós um json cheio de informações, e eu fiz uma tradução melhor para se comportar dentro do dataset.
Dessa forma, ele vem com todos os dados que nós precisamos.
E ainda possuímos outras opções, que é possível ver nos exemplos disponíveis no github.
Como por exemplo o Range, que traz para nós todas as notas, por exemplo, entre 100 e 101 reais.
procedure TForm1.Button4Click(Sender: TObject); begin Memo1.Lines.Add( FElastic ._search .Query .Range .Field('TOTAL') .gte(100) .lte(101) .&End .&End .Execute .asJsonObject.ToString ); end;
Todas as opções que você tiver numa query do elastic você tem dentro desse framework, e melhorado.
Observe que retornamos todas as notas dentro do período determinado.
E ainda podemos aumentar a paginação como fizemos anteriormente.
Muito legal, não é pessoal?
Isso é muito simples, e o elastic é muito mais rápido e performático do que um banco relacional.
Observe o código abaixo, eu estou utilizando o Should, é como se fosse o and.
Onde possui o nome do comprador “SYSTEMA”, descrição “FILTRO” e a observação da nota tem a “RETIRADA”.
E realizamos um filtro como um termo, porque ele trata como termos exatos.
procedure TForm1.Button2Click(Sender: TObject); begin Memo1.Lines.Add( FElastic ._search .Query .Bool .Should .Match .AddField('NOME_COMPRADOR','SYSTEMA') .AddField('ITENS.DESCRICAO','FILTRO') .AddField('OBS_NF','RETIRADA') .&End .&End .Filter .Term .AddField('CFOP','5102') .&End .Range .Field('TOTAL') .gte(100) .lte(500) .&End .&End .&End .&End .From(0) .Size(50) .Execute .asJsonObject.ToJSON ); end;
Ele realiza essa busca, que acabamos de criar.
Viu como fica fácil implementar no Delphi, e o legal é que estamos trabalhando com Fluent Interface, onde dá maior legibilidade no seu código.
Esse framework foi feito para facilitar a vida de vocês, mas nada impede de você acessar a documentação e fazer as requisições da chamada rest.
Ele simplesmente trouxe para nós somente notas com CFOP 5102, entre 100 e 500 reais, e a descrição do produto tenha filtro, e dentro do campo comprador tenha systema.
Muito legal, não é pessoal?
É fantástico trabalhar com elástic, e tenho certeza que depois que começar a utilizar, e você não irá querer outra coisa.
E caso você tem interesse de conhecer mais sobre Elasticsearch no Delphi acesse o nosso portal do CLUBE DE PROGRAMADORES EM DELPHI.
Você não terá só conteúdos relacionados ao Elasticsearch, mas uma quantidade enorme de conteúdos que poderá lhe ajudar muito no seu dia a dia, é uma verdadeira NETFLIX para os programadores Delphi.
CLIQUE AQUI E SAIBA MAIS SOBRE O CLUBE DOS PROGRAMADORES DELPHI