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
