Elasticsearch

ElasticSearch 一般可以用来做附近的人日志商品搜索统计分析等需求,亿级数据都能快速查询

cool-admin要求的es>=8.x

官方文档open in new window

使用

安装

yarn add @cool-midway/es

配置

config/config.xxx.ts

config.cool = {
	es: {
		// 集群模式下可以配置多个地址
		nodes: ["http://localhost:9200"]
	}
};

启用

import * as es from "@cool-midway/es";

@Configuration({
	// 注意组件顺序 cool 有依赖orm组件, 所以必须放在,orm组件之后 cool的其他组件必须放在cool 核心组件之后
	imports: [es]
})
export class ContainerLifeCycle  {
	@App()
	app: Application;

	@Inject("cool:coolEventManager")
	coolEventManager: CoolEventManager;

	// 应用启动完成
	async onReady(container?: IMidwayContainer) {
		this.coolEventManager.emit("appReady");
	}
	// 应用停止
	async onStop() {}
}

用法

新建索引

数据类型可参考文档data typesopen in new window

import { CoolEsIndex, ICoolEs, BaseEsIndex } from '@cool-midway/es';

/**
 * 测试索引
 */
@CoolEsIndex({ name: 'test', replicas: 0 })
export class TestEsIndex extends BaseEsIndex implements ICoolEs {
  indexInfo() {
    return {
      // 需要安装ik分词器 https://github.com/medcl/elasticsearch-analysis-ik
      name: {
        type: 'text',
        analyzer: 'ik_max_word',
        search_analyzer: 'ik_max_word',
        fields: {
          raw: {
            type: 'keyword',
          },
        },
      },
      age: {
        type: 'long',
      },
    };
  }
}

操作索引

官方API文档open in new window

// 新增与修改
await this.testEsIndex.upsert({ name: "啊平", age: 20 });
// 带ID的为修改
await this.testEsIndex.upsert({ id: "6y_W_nwBPH70UTxunOPD", name: "啊平", age: 22 });
// 根据ID修改
await this.testEsIndex.updateById({ id: "6y_W_nwBPH70UTxunOPD", name: "啊平", age: 22 });
// 根据条件更新
await this.testEsIndex.updateByQuery({
	script: {
		lang: "painless",
		source: 'ctx._source["name"] = "啊平2"'
	},
	query: {
		term: {
			age: 20
		}
	}
});
// 批量操作 第二个参数type: index、create、delete、update
await this.testEsIndex.batchIndex([{ id: "6y_W_nwBPH70UTxunOPD", name: "啊平2", age: 26 }]);
// 删除单个ID
await this.testEsIndex.deleteById("6y_W_nwBPH70UTxunOPD");
// 删除多个ID
await this.testEsIndex.deleteByIds(["6y_W_nwBPH70UTxunOPD", "cjLn_nwBPH70UTxubZEz"]);
// 根据条件删除
await this.testEsIndex.deleteByQuery({});
// 查询所有数据 默认最大返回10000条
await this.testEsIndex.find();
// 查询数量
await this.testEsIndex.findCount({});
// 分页查询
await this.testEsIndex.findPage();
// 查询单个ID
await this.testEsIndex.findById('cjLn_nwBPH70UTxubZEz');
// 查询多个ID
await this.testEsIndex.findByIds(["6y_W_nwBPH70UTxunOPD", "cjLn_nwBPH70UTxubZEz"]);
// 直接操作es客户端
await this.testEsIndex.client.xxx;

客户端实例

import { CoolElasticSearch } from "@cool-midway/es";

@Inject()
es: CoolElasticSearch;

// es 客户端实例
this.es.client;

事件

当Elasticsearch客户端初始化完成,会向框架发送一个esReady事件,我们可以在此处理客户端初始化完成之后的操作。

import { Inject, Logger, Provide, Scope, ScopeEnum } from '@midwayjs/decorator';
import { ILogger } from '@midwayjs/logger';
import { CoolEvent, Event } from '@cool-midway/core';
import { CommonDbService } from '../service/db';

/**
 * 接收事件
 */
@CoolEvent()
export class CommonEvent {
  @Inject()
  commonDbService: CommonDbService;

  @Logger()
  logger: ILogger;
  /**
   * es准备成功
   */
  @Event('esReady')
  async esReady() {
    this.logger.info('初始化云数据库');
    this.commonDbService.initDB();
  }
}

Last Updated: