async searchNewsSemi(dto: SearchDto) { dto.page = dto.page ? dto.page * 1 : 1; dto.limit = dto.limit ? dto.limit * 1 : 10; const queryParam = { query: { bool: { must: [], filter: [], }, }, aggs: {}, size: dto.limit, from: (dto.page - 1) * dto.limit, track_total_hits: true, }; if (dto.keyword) { const k = dto.keyword.split('_'); queryParam.query.bool.must.push({ match: { [k[0]]: k[1], }, }); } else { queryParam.query.bool.must.push({ match_all: {}, }); } if (dto.category) { if (Array.isArray(dto.category)) { dto.category.forEach((c) => { queryParam.aggs[`${c}Terms`] = { terms: { field: `${c}`, }, }; }); } else { // @ts-ignore queryParam.aggs[`${dto.category}Terms`] = { terms: { field: `${dto.category}`, }, }; } } if (dto.endTime) { let startTime = dto.startTime; if (!startTime) { const endTimeNew = new Date(dto.endTime); const startTimeStamp = endTimeNew.setDate(endTimeNew.getDate() - 7); startTime = dateUtil.pattern( new Date(startTimeStamp), 'yyyy-MM-ddTHH:mm:ssZ', ); } // 时间范围 queryParam.query.bool.filter.push({ range: { insert_time: { gte: startTime, lte: dto.endTime, }, }, }); // 时间范围分组 queryParam.aggs['insertTimeTerms'] = { date_histogram: { field: 'insert_time', interval: 'day', format: 'yyyy-MM-dd hh:MM:ss', }, }; } console.log('param:' + JSON.stringify(queryParam)); const result = await this.elasticSearchService.search({ index: 'news_semi', body: queryParam, }); const resultBody = result['body']; const resultData = resultBody['hits']['hits']; const aggregations = resultBody['aggregations']; const rest = { total: resultBody['hits']['total']['value'], data: resultData.map((item) => { const obj = { ...item }; if (obj.highlight) { obj['_source']['content'] = obj['highlight']['content'][0]; // 删除高亮字段 delete obj.highlight; } return obj; }), category: {}, }; if (aggregations) { for (const agg in aggregations) { rest.category[agg] = aggregations[agg]['buckets']; } } return aggregations; }
时间: 2024-02-14 20:22:22 浏览: 20
这是一段使用 ElasticSearch 进行半结构化数据搜索的代码,输入一个 SearchDto 对象,根据其中的条件构造一个 ElasticSearch 查询,从 ElasticSearch 中查询数据并返回结果。其中包括查询结果及聚合结果。查询条件包括:关键词、类别、起始时间和结束时间。如果有关键词,则根据关键词构造 match 查询,如果没有,则构造 match_all 查询。如果有类别,则根据类别构造聚合查询。如果有起始时间和结束时间,则根据时间范围构造时间过滤查询和时间范围分组聚合查询。最后返回查询结果和聚合结果。
相关问题
nestjs 用户注册 登录认证模块 代码
好的,下面是一个简单的nestjs用户注册、登录和认证的代码示例:
```typescript
import { Injectable } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { compareSync } from 'bcrypt';
import { CreateUserDto } from './dto/create-user.dto';
import { UsersService } from './users.service';
@Injectable()
export class AuthService {
constructor(
private readonly usersService: UsersService,
private readonly jwtService: JwtService,
) {}
async validateUser(email: string, password: string): Promise<any> {
const user = await this.usersService.findByEmail(email);
if (user && compareSync(password, user.password)) {
const { password, ...result } = user;
return result;
}
return null;
}
async register(createUserDto: CreateUserDto) {
const user = await this.usersService.create(createUserDto);
const payload = { email: user.email, sub: user.id };
return {
access_token: this.jwtService.sign(payload),
};
}
async login(user: any) {
const payload = { email: user.email, sub: user.id };
return {
access_token: this.jwtService.sign(payload),
};
}
async verifyToken(token: string) {
try {
const decoded = this.jwtService.verify(token);
const user = await this.usersService.findById(decoded.sub);
if (!user) {
throw new Error('User not found');
}
return user;
} catch (error) {
throw new Error('Invalid token');
}
}
}
```
这个代码示例中包含了一个`AuthService`类,它包含了用户注册、登录和认证的相关方法。其中:
- `validateUser`方法用于验证用户的登录信息是否正确;
- `register`方法用于注册新用户,创建用户成功后会返回一个包含JWT Token的对象;
- `login`方法用于用户登录,成功登录后也会返回一个包含JWT Token的对象;
- `verifyToken`方法用于验证JWT Token是否有效,如果有效会返回对应的用户信息。
另外,这个代码示例中还包含了一个`UsersService`类,用于用户相关的数据操作。这里就不再赘述了。
希望这个代码示例能够对您有所帮助!
nestjs完整接口实例
在 NestJS 中,创建一个完整的接口实例需要经过以下几个步骤:
1. 创建一个控制器(Controller):控制器是处理请求并返回响应的地方。可以使用 Nest CLI 命令 `nest generate controller` 快速生成一个控制器文件。例如,创建一个名为 `cats` 的控制器:
```bash
$ nest generate controller cats
```
2. 在控制器中定义路由和请求处理方法:在 `cats.controller.ts` 文件中,可以使用装饰器 `@Get`、`@Post`、`@Put`、`@Delete` 等来定义不同的 HTTP 请求方法,并指定对应的路由路径。例如:
```typescript
import { Controller, Get, Post, Body } from '@nestjs/common';
@Controller('cats')
export class CatsController {
@Get()
findAll(): string {
return 'This action returns all cats';
}
@Post()
create(@Body() createCatDto: CreateCatDto): string {
return `This action creates a new cat with name ${createCatDto.name}`;
}
}
```
3. 创建一个数据传输对象(DTO):DTO 是用于在请求和响应中传递数据的对象。可以使用 Nest CLI 命令 `nest generate dto` 快速生成一个 DTO 文件。例如,创建一个名为 `create-cat.dto.ts` 的 DTO:
```bash
$ nest generate dto create-cat
```
在 `create-cat.dto.ts` 文件中定义需要传递的属性:
```typescript
export class CreateCatDto {
readonly name: string;
readonly age: number;
readonly breed: string;
}
```
4. 在模块中引入控制器和 DTO:在相应的模块文件中,使用 `@Module` 装饰器引入控制器和 DTO。例如,在 `app.module.ts` 文件中引入 `CatsController` 和 `CreateCatDto`:
```typescript
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
@Module({
controllers: [CatsController],
})
export class AppModule {}
```
5. 启动 NestJS 应用程序:在入口文件(通常是 `main.ts`)中使用 `NestFactory` 创建应用实例,并指定要监听的端口。例如:
```typescript
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();
```
这样,你就创建了一个完整的接口实例,并且可以通过访问对应的路由路径来触发相应的请求处理方法。例如,通过访问 `GET /cats` 可以调用 `findAll` 方法返回所有猫咪的信息。
注意:以上仅为一个简单示例,实际应用中可能需要更复杂的业务逻辑和数据持久化操作。你可以根据自己的需求进行进一步的开发和定制。