Rozpocznij pracę z klientem Elastic Search NodeJs

Dec 25 2022
ES: Wymagania wstępne dotyczące wyszukiwania elastycznego W naszych poprzednich artykułach dotyczących wyszukiwania elastycznego dowiedzieliśmy się o podstawach wyszukiwania elastycznego, sposobie jego działania i tworzeniu nowego indeksu. W tym artykule będziemy kontynuować pracę z klientem Elastic Search NodeJS i zbadać, jak indeksować nowe dokumenty, aktualizować istniejące indeksowane dokumenty i usuwać zindeksowane dokumenty.

ES: Wyszukiwanie elastyczne

Wymagania wstępne

Co to jest elastyczne wyszukiwanie? Jak działa elastyczne wyszukiwanie? Utworzyć nowy indeks z mapowaniem i ustawieniami w Elastic Search?

W naszych poprzednich artykułach na temat Elastic Search dowiedzieliśmy się o podstawach Elastic Search, o tym, jak działa i jak utworzyć nowy indeks. W tym artykule będziemy kontynuować pracę z klientem Elastic Search NodeJS i zbadać, jak indeksować nowe dokumenty, aktualizować istniejące indeksowane dokumenty i usuwać zindeksowane dokumenty. Dzięki zrozumieniu tych funkcji możemy efektywniej wykorzystywać Elastic Search do zarządzania i aktualizowania danych w naszych projektach. Zacznijmy i zobaczmy, jak te funkcje działają w akcji.

Wszystkie poniższe przykłady są oparte na kliencie ES Node .

Instalacja

Możesz użyć pakietu npm Elastic Search w swojej aplikacji nodejs.

npm install @elastic/elasticsearch

Nasz klaster ES jest skonfigurowany z jawnie wyłączonymi zabezpieczeniami , dlatego możemy łączyć się przez HTTP.

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

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

Wszystkie inne odniesienia związane z ES można znaleźć tutaj .

Świst

Aby sprawdzić, czy klient ES jest połączony ze zdefiniowanym klastrem http, wykonaj akcję 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: {}
  });
};

Sprawdź, czy indeks istnieje, czy nie.

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

Przed dodaniem jakiegokolwiek dokumentu do indeksu zaleca się zaktualizowanie ustawień indeksu i dodanie wymaganych analizatorów na podstawie funkcji wyszukiwania. Oto przykład ustawienia indeksu:

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',
      },
    }
  });
};

Dodaj mapowania

Przed dodaniem jakiegokolwiek dokumentu do indeksu zaleca się aktualizację ustawień indeksu, a następnie zaktualizowanie mapowań indeksów i przypisanie właściwości analizatora do pól. Oto przykład mapowania indeksu:

Podobnie jak podczas aktualizacji ustawień, dodaliśmy autocompleteanalizator, który możemy zdefiniować w mapowaniach jako właściwość wyszukiwania. Mapowanie indeksu może być różne dla różnych indeksów.

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' },
      },
    },
  });
};

Dodaj dokument

Istnieją różne sposoby dodawania dokumentów do indeksu:

Pojedynczy dokument

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
  });
};

Aktualizuj pojedynczy dokument: Aktualizuje dokument za pomocą skryptu lub dokumentu częściowego.

client.update(...)

client.updateByQuery(...)

Usuń pojedynczy dokument

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

Usuń pojedynczy dokument: Aktualizuje dokument za pomocą skryptu lub dokumentu częściowego.

client.delete(...)

client.deleteByQuery(...)

Klient JavaScript Elasticsearch [8.5] ​​| Elastyczny

Odniesienie do interfejsu API | Klient JavaScript Elasticsearch [8.5] ​​| Elastyczny

Przykłady | Klient JavaScript Elasticsearch [8.5] ​​| Elastyczny

Utwórz niestandardowy analizator | Przewodnik Elasticsearch [8.5] ​​| Elastyczny

Wbudowany analizator referencyjny | Przewodnik Elasticsearch [8.5] ​​| Elastyczny

Typy danych pola | Przewodnik Elasticsearch [8.5] ​​| Elastyczny

Mam nadzieję, że podobało Ci się czytanie o Elastic Search i o tym, jak można go wykorzystać do optymalizacji wyszukiwania i analizy w różnych aplikacjach. Jeśli ten artykuł okazał się pomocny lub masz dodatkowe pytania, nie wahaj się skontaktować ze mną za pośrednictwem komentarzy.

Aby uzyskać więcej aktualizacji i spostrzeżeń na temat najnowszych trendów technologicznych, śledź mnie na Twitterze lub LinkedIn . Dziękuję za przeczytanie i czekam na kontakt w mediach społecznościowych.

Twitter :https://twitter.com/geekfarmer_

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