Introdução ao Elastic Search NodeJs Client

Dec 25 2022
ES: Pré-requisitos do Elastic Search Em nossos artigos anteriores sobre o Elastic Search, aprendemos sobre os fundamentos do Elastic Search, como ele funciona e como criar um novo índice. Neste artigo, continuaremos trabalhando com o cliente Elastic Search NodeJS e exploraremos como indexar novos documentos, atualizar documentos indexados existentes e excluir documentos indexados.

ES: Pesquisa elástica

Pré-requisitos

O que é Pesquisa Elástica? Como funciona a pesquisa elástica? Criar um novo índice com mapeamento e configurações no Elastic Search?

Em nossos artigos anteriores sobre o Elastic Search, aprendemos sobre os fundamentos do Elastic Search, como ele funciona e como criar um novo índice. Neste artigo, continuaremos trabalhando com o cliente Elastic Search NodeJS e exploraremos como indexar novos documentos, atualizar documentos indexados existentes e excluir documentos indexados. Compreendendo esses recursos, podemos usar o Elastic Search com mais eficiência para gerenciar e atualizar os dados em nossos projetos. Vamos começar e ver como essas funções funcionam em ação.

Todos os exemplos abaixo são baseados no cliente ES Node .

Instalação

Você pode usar o pacote npm Elastic Search em seu aplicativo nodejs.

npm install @elastic/elasticsearch

Nosso cluster ES está configurado com a segurança explicitamente desativada , por isso podemos nos conectar via HTTP.

import { Client, errors } from '@elastic/elasticsearch';

const client = new Client({
  node: 'http://example.com'
});

Todas as outras referências relacionadas ao ES você pode obter aqui .

Ping

Para verificar se o cliente ES está conectado com o cluster http definido, execute a ação ping.

client
  .ping({
    // ping usually has a 3000ms timeout
    requestTimeout: 1000,
  })
  .then(() => {
    this.logger.info('Elasticsearch connected');
  })
  .catch((err: errors.ConnectionError) => {
    this.logger.error('Elasticsearch unavailable', { error: err });
  });

async createIndex(indexName: string) {
  return this.client.indices.create({
    index: indexName,
    mappings: {},
    settings: {}
  });
};

Verifique se o índice existe ou não.

async indexExists(indexName: string) {
  return this.client.indices.exists({
    index: indexName,
  });
};

Antes de adicionar qualquer documento ao índice, é recomendável atualizar as configurações de índice e adicionar os analisadores necessários com base em sua funcionalidade de pesquisa. Aqui está um exemplo de configuração de índice:

async indexSetting(indexName: string) {
  return this.client.indices.putSettings({
    index: indexName,
    body: {
      settings: {
        max_ngram_diff: 19,
        analysis: {
          filter: {
            autocomplete_filter: {
              type: 'ngram',
              min_gram: '1',
              max_gram: '20',
            },
          },
          analyzer: {
            autocomplete: {
              filter: ['lowercase', 'autocomplete_filter'],
              type: 'custom',
              tokenizer: 'standard',
            },
          },
        },
        number_of_replicas: '1',
      },
    }
  });
};

Adicionar mapeamentos

Antes de adicionar qualquer documento ao índice, é recomendável atualizar as configurações do índice, atualizar os mapeamentos do índice e atribuir as propriedades do analisador aos campos. Aqui está um exemplo de mapeamentos de índice:

Ao atualizar as configurações, adicionamos o autocompleteanalisador que podemos definir nos mapeamentos como propriedade de pesquisa. O mapeamento de índice pode ser diferente para diferentes índices.

const searchProperty = {
  type: 'text',
  analyzer: 'autocomplete',
  search_analyzer: 'standard',
};

async indexMapping(indexName: string) {
  return this.client.indices.putMapping({
    index: indexName,
    body: {
      properties: {
        id: { type: 'keyword' },
        createdAt: { type: 'date' },
        updatedAt: { type: 'date' },
        caseCode: searchProperty,
        policyNo: searchProperty,
        claimRegNo: searchProperty,
        vehicleRegNo: searchProperty,
        vehicleChassisNo: searchProperty,
        claimStatus: { type: 'keyword' },
        lossType: { type: 'keyword' },
        vehicleType: { type: 'keyword' },
        zone: { type: 'keyword' },
        insurer: { type: 'keyword' },
        caseStatus: { type: 'keyword' },
        business: { type: 'keyword' },
      },
    },
  });
};

Adicionar documento

Existem diferentes maneiras de adicionar documentos em um índice:

Documento Único

async addDocument(indexName: string, payload: DataType) {
  return this.client.index({
    index: indexName,
    type: '_doc',
    id: payload.id,
    body: payload
  });
};

async addBulkDocuments(indexName: data = []) {
  const payload = data.map((item) => {
    return [
      {
        index: {
          _index: indexName,
          _type: '_doc',
          _id: item.id,
        },
      },
      item,
    ]
  })
  return this.client.bulk({
    refresh: true,
    body: payload
  });
};

async updateDocument(indexName: string, payload: DataType) {
  return this.client.update({
    index: indexName,
    type: '_doc',
    id: payload.id,
    body: payload
  });
};

Atualizar documento único: atualiza um documento com um script ou documento parcial.

client.update(...)

client.updateByQuery(...)

Excluir um único documento

async deleteDocument(indexName: string, id: string) {
  return this.client.delete({
    index: indexName,
    id,
  });
};

Excluir documento único: atualiza um documento com um script ou documento parcial.

client.delete(...)

client.deleteByQuery(...)

Cliente Elasticsearch JavaScript [8.5] ​​| Elástico

Referência da API | Cliente Elasticsearch JavaScript [8.5] ​​| Elástico

Exemplos | Cliente Elasticsearch JavaScript [8.5] ​​| Elástico

Criar um analisador personalizado | Guia do Elasticsearch [8.5] ​​| Elástico

Referência do analisador integrado | Guia do Elasticsearch [8.5] ​​| Elástico

Tipos de dados de campo | Guia do Elasticsearch [8.5] ​​| Elástico

Espero que você tenha gostado de ler sobre o Elastic Search e como ele pode ser usado para otimizar a pesquisa e a análise em vários aplicativos. Se você achou este artigo útil ou se tiver mais alguma dúvida, não hesite em entrar em contato comigo pelos comentários.

Para mais atualizações e informações sobre as últimas tendências tecnológicas, siga-me no Twitter ou LinkedIn . Obrigado por ler e estou ansioso para me conectar com você nas mídias sociais.

Twitter :https://twitter.com/geekfarmer_

Linkedin :https://www.linkedin.com/in/geekfarmer