# 介绍

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

官方文档 (opens new window)

# 使用

# 安装

yarn add @cool-midway/es

# 配置

config/config.xxx.ts

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

# 启用

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

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

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

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

# 用法

# 新建索引

数据类型可参考文档data types (opens new window)

import { Provide } from "@midwayjs/decorator";
import { CoolEsIndex, ICoolEs, BaseEsIndex } from "@cool-midway/es";

/**
 * 测试索引
 */
@Provide()
@CoolEsIndex("test")
export class TestEsIndex extends BaseEsIndex implements ICoolEs {
	indexInfo() {
		// ik 为分词器
		return {
			name: {
				type: "text",
				analyzer: "ik_max_word",
				search_analyzer: "ik_max_word"
			},
			age: {
				type: "long"
			}
		};
	}
}

# 操作索引

官方API文档 (opens 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;

# 事件

当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';

/**
 * 接收事件
 */
@Provide()
@Scope(ScopeEnum.Singleton)
@CoolEvent()
export class CommonEvent {
  @Inject()
  commonDbService: CommonDbService;

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