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 07:22:22 浏览: 129
这是一段使用 ElasticSearch 进行半结构化数据搜索的代码,输入一个 SearchDto 对象,根据其中的条件构造一个 ElasticSearch 查询,从 ElasticSearch 中查询数据并返回结果。其中包括查询结果及聚合结果。查询条件包括:关键词、类别、起始时间和结束时间。如果有关键词,则根据关键词构造 match 查询,如果没有,则构造 match_all 查询。如果有类别,则根据类别构造聚合查询。如果有起始时间和结束时间,则根据时间范围构造时间过滤查询和时间范围分组聚合查询。最后返回查询结果和聚合结果。
相关问题
ASP.NET CORE WEB API 更新按照自己定义的DTO完成更新功能
ASP.NET Core Web API 中,如果你想要按照自定义 DTO(Data Transfer Object)完成数据更新功能,你需要遵循以下步骤:
1. 定义 DTO 类:首先创建一个 DTO 类,这个类通常包含你希望从客户端更新的数据属性。例如,假设你有一个用户相关的 DTO 类 `UserUpdateDto`。
```csharp
public class UserUpdateDto
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
// 其他需要更新的字段...
}
```
2. 创建控制器操作:在你的 Web API 控制器中,找到对应于更新操作的方法,通常是 `PUT` 请求。例如:
```csharp
[Route("api/[controller]")]
[ApiController]
public class UsersController : ControllerBase
{
private readonly YourDbContext _context;
public UsersController(YourDbContext context)
{
_context = context;
}
[HttpPut("{id}")]
[ProducesResponseType(typeof(User), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<IActionResult> UpdateUser(int id, UserUpdateDto userUpdateDto)
{
var user = await _context.Users.FindAsync(id);
if (user == null)
return NotFound();
// 更新实体中的属性
user.FirstName = userUpdateDto.FirstName;
user.LastName = userUpdateDto.LastName;
// ...其他更新
await _context.SaveChangesAsync();
return Ok(user);
}
}
```
在这个例子中,`UserUpdateDto` 参数包含了客户端发送的新值,然后将这些值映射到数据库中的 `Users` 表格对应的实体。
3. 测试更新:通过发送一个 `PUT` 请求到 `/api/users/{id}` 的 URL,并传递填充好的 `UserUpdateDto`,API 将会处理并更新数据库中的记录。
阅读全文