import { Injectable } from '@nestjs/common'; import { ElasticsearchService } from '@nestjs/elasticsearch'; import { EsSearchDto } from './es-search.dto'; import { EsNameMapDto } from './es-name-map.dto'; @Injectable() export class EsLibService { constructor(private readonly elasticSearchService: ElasticsearchService) {} async search(esIndex:string,param:EsSearchDto,nameMap:EsNameMapDto=null) { // const bodyParam = { // "query": { // "bool": { // "filter": [ // { // "range": { // "@timestamp": { // "gte": "2023-03-09T00:00:00", // "lte": "2023-05-10T00:00:00" // } // } // } // ], // "must": [ // { // "multi_match": { // "query": "集团", // "fields": ["title","cont"] // } // }, // { // "multi_match": { // "query": "像素", // "fields": ["title","cont"] // } // } // ], // "must_not": [ // { // "multi_match": { // "query": "王挣亮 印度", // "fields": ["title","cont"] // } // } // ] // } // }, // "highlight": { // "fields" : { // "title" : {}, // "cont" : {} // } // }, // "sort": [ // { // "@timestamp": { // "order": "desc" // } // }], // "from": 0, // "size": "10", // "track_total_hits": true // } const bodyParam = { "query": { "bool": { "filter": [], "must": [], "must_not": [] } }, "sort": [], "from": param.page?(param.page-1) * 10:0, "size": param.pageSize ? param.pageSize :10, "track_total_hits": true } let isHighlight = false; if(param.regionTimeStart || param.regionTimeEnd){ const filterItem = { "range": {} } filterItem.range[nameMap.rangeTime]={}; if(param.regionTimeStart){ filterItem.range[nameMap.rangeTime]['gte']=param.regionTimeStart } if(param.regionTimeEnd){ filterItem.range[nameMap.rangeTime]['lte']=param.regionTimeEnd } console.log(filterItem); bodyParam.query.bool.filter.push(filterItem); } if(param.keyword){ const mustParm = { "multi_match": { "query": param.keyword, "fields": [nameMap.title,nameMap.content] } } bodyParam.query.bool.must.push(mustParm); isHighlight = true; } if(param.advanceKeyword1){ const mustParm = { "multi_match": { "query": param.advanceKeyword1, "fields": [nameMap.title,nameMap.content] } } bodyParam.query.bool.must.push(mustParm); isHighlight = true; } if(param.advanceKeyword2){ const mustParm = { "multi_match": { "query": param.advanceKeyword2, "fields": [nameMap.title,nameMap.content] } } bodyParam.query.bool.must.push(mustParm); isHighlight = true; } if(param.advanceKeyword3){ const mustParm = { "multi_match": { "query": param.advanceKeyword3, "fields": [nameMap.title,nameMap.content] } } bodyParam.query.bool.must.push(mustParm); isHighlight = true; } if(param.notKeyword){ const mustNotParm = { "multi_match": { "query": param.notKeyword, "fields": [nameMap.title,nameMap.content] } } bodyParam.query.bool.must_not.push(mustNotParm); isHighlight = true; } if(isHighlight){ const hParm = { "fields" : {} } hParm.fields[nameMap.title]={}; hParm.fields[nameMap.content]={}; bodyParam['highlight']=hParm; } const sortParam = {}; sortParam[nameMap.rangeTime] = { "order": "desc" }; bodyParam.sort.push(sortParam); const p1:any = { index: esIndex, body: bodyParam, } const result:any = await this.elasticSearchService.search(p1); const total = result.body.hits.total.value const data = []; result.body.hits.hits.forEach(it => { data.push(it['_source']); }); return {total:total,data:data}; } }