Начните работу с Elastic Search NodeJs Client

Dec 25 2022
ES: Предварительные требования к эластичному поиску В наших предыдущих статьях об эластичном поиске мы узнали об основах эластичного поиска, о том, как он работает, и о том, как создать новый индекс. В этой статье мы продолжим работу с клиентом Elastic Search NodeJS и рассмотрим, как индексировать новые документы, обновлять существующие проиндексированные документы и удалять проиндексированные документы.

ES: эластичный поиск

Предпосылки

Что такое эластичный поиск? Как работает эластичный поиск? Создать новый индекс с отображением и настройками в Elastic Search?

В наших предыдущих статьях об Elastic Search мы узнали об основах Elastic Search, о том, как он работает и как создать новый индекс. В этой статье мы продолжим работу с клиентом Elastic Search NodeJS и рассмотрим, как индексировать новые документы, обновлять существующие проиндексированные документы и удалять проиндексированные документы. Понимая эти функции, мы можем более эффективно использовать Elastic Search для управления и обновления данных в наших проектах. Давайте начнем и посмотрим, как эти функции работают в действии.

Все приведенные ниже примеры основаны на клиенте ES Node .

Установка

Вы можете использовать пакет npm Elastic Search в своем приложении nodejs.

npm install @elastic/elasticsearch

Наш кластер ES настроен с явным отключением безопасности , поэтому мы можем подключаться через HTTP.

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

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

Все другие ссылки, связанные с ES, вы можете получить здесь .

пинг

Чтобы проверить, подключен ли клиент ES к определенному http-кластеру, выполните действие 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: {}
  });
};

Проверьте, существует ли индекс или нет.

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

Прежде чем добавлять какой-либо документ в индекс, рекомендуется обновить настройки индекса и добавить необходимые анализаторы в соответствии с вашими функциями поиска. Вот пример настройки индекса:

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

Добавить сопоставления

Перед добавлением любого документа в индекс рекомендуется обновить настройки индекса, а затем обновить отображения индекса и назначить свойства анализатора с полями. Вот пример сопоставления индексов:

Как и при обновлении настроек, мы добавили autocompleteанализатор, который мы можем определить в сопоставлениях как свойство поиска. Отображение индекса может быть разным для разных индексов.

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

Добавить документ

Существуют различные способы добавления документов в индекс:

Один документ

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

Обновить отдельный документ: обновляет документ сценарием или частью документа.

client.update(...)

client.updateByQuery(...)

Удалить один документ

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

Удалить отдельный документ: обновляет документ сценарием или частью документа.

client.delete(...)

client.deleteByQuery(...)

JavaScript-клиент Elasticsearch [8.5] ​​| Эластичный

Справочник по API | JavaScript-клиент Elasticsearch [8.5] ​​| Эластичный

Примеры | JavaScript-клиент Elasticsearch [8.5] ​​| Эластичный

Создать собственный анализатор | Руководство по Elasticsearch [8.5] ​​| Эластичный

Справочник по встроенному анализатору | Руководство по Elasticsearch [8.5] ​​| Эластичный

Типы данных поля | Руководство по Elasticsearch [8.5] ​​| Эластичный

Надеюсь, вам понравилось читать об Elastic Search и о том, как его можно использовать для оптимизации поиска и анализа в различных приложениях. Если вы нашли эту статью полезной или у вас есть дополнительные вопросы, пожалуйста, не стесняйтесь обращаться ко мне через комментарии.

Для получения дополнительных обновлений и информации о последних технологических тенденциях обязательно подписывайтесь на меня в Twitter или LinkedIn . Спасибо за чтение, и я с нетерпением жду связи с вами в социальных сетях.

Твиттер :https://twitter.com/geekfarmer_

Ссылка :https://www.linkedin.com/in/geekfarmer