0.1.6 • Published 5 years ago

@mobizerg/nest-elasticsearch v0.1.6

Weekly downloads
-
License
MIT
Repository
github
Last release
5 years ago

Installation

Yarn

yarn add @mobizerg/nest-elasticsearch @elastic/elasticsearch@7

NPM

npm install @mobizerg/nest-elasticsearch @elastic/elasticsearch@7 --save

Description

Elasticsearch integration module for Nest.js based on the Elasticsearch package.

Usage

Import the ElasticsearchModule in app.module.ts

import { Module } from '@nestjs/common';
import { ElasticsearchModule } from '@mobizerg/nest-elasticsearch';

@Module({
    imports: [
        ElasticsearchModule.register(options)
    ],
})
export class AppModule {}

With Async

import { Module } from '@nestjs/common';
import { ElasticsearchModule } from '@mobizerg/nest-elasticsearch';

@Module({
    imports: [
        ElasticsearchModule.registerAsync({
            imports: [ConfigModule],
            useExisting: ElasticsearchConfigService,
        }),
    ],
})
export class AppModule {}

Example config file (async)

import { Injectable } from '@nestjs/common';
import { ConfigService } from './config.service';
import { ElasticsearchModuleOptions, ElasticsearchOptionsFactory } from '@mobizerg/nest-elasticsearch';

@Injectable()
export class ElasticsearchConfigService implements ElasticsearchOptionsFactory {

  constructor(private readonly config: ConfigService) {}

  createElasticsearchOptions(name?: string): ElasticsearchModuleOptions {
      
    return {
      name,
      node: 'http://localhost:9200',
      maxRetries: 3,
      requestTimeout: 60000,
    };
  }
}

Importing inside services

import { Injectable } from '@nestjs/common';
import { ElasticsearchService, InjectClient } from '@mobizerg/nest-elasticsearch';
import { Client } from '@elastic/elasticsearch';

@Injectable()
export class SearchService extends ElasticsearchService<T> {

  constructor(@InjectClient()
              readonly client: Client) {
    
    super(client, {
      index: 'tag',
      settings: {
        number_of_shards: 1,
        number_of_replicas: 0,
        refresh_interval: '2s',
        analysis: {
          analyzer: {
            autocomplete: {
              tokenizer: 'autocomplete',
              filter: ['trim', 'lowercase'],
            },
            autocomplete_search: {
              tokenizer: 'lowercase',
              filter: ['trim'],
            },
          },
          tokenizer: {
            autocomplete: {
              type: 'edge_ngram',
              min_gram: 2,
              max_gram: 12,
              token_chars: ['letter', 'digit'],
            },
          },
        },
      },
      properties: {
        id: { type: 'integer' },
        tag: { type: 'text', analyzer: 'autocomplete', search_analyzer: 'autocomplete_search' },
        status: { type: 'byte' },
      },
    });
  }

  async find(query: string): Promise<any> {
    try {
      const { body } = await this.client.search({
        index: this.config.index,
        body: {
          _source: ['id'],
          from: 1,
          size: 15,
          query: {
            bool: {
              must: {
                match: {
                  tag: {
                    query,
                    minimum_should_match: '80%',
                  },
                },
              },
            },
          },
        },
      });
      return body;
    } catch (error) {
      return false;
    }
  }
}

License

MIT