package com.bowintek.practice.controller; import co.elastic.clients.elasticsearch.core.search.Hit; import co.elastic.clients.elasticsearch.core.search.InnerHitsResult; import co.elastic.clients.json.JsonData; import com.bowintek.practice.AppConfig; import com.bowintek.practice.filter.exception.BaseResponse; import com.bowintek.practice.filter.exception.RespGenerstor; import com.bowintek.practice.mapper.SrSaerchtempMapper; import com.bowintek.practice.mapper.SrTempDataMapper; import com.bowintek.practice.model.SrSaerchtemp; import com.bowintek.practice.model.SrTempData; import com.bowintek.practice.services.service.*; import com.bowintek.practice.util.StringUtils; import com.bowintek.practice.vo.Analyze.ComparisonResult; import com.bowintek.practice.vo.Analyze.EsQueryModel; import com.bowintek.practice.vo.Analyze.EsQueryText; import com.bowintek.practice.vo.Analyze.FormState; import com.bowintek.practice.vo.SaerchtempVo; import com.bowintek.practice.vo.system.RoleModel; import com.bowintek.practice.vo.temp.GenSqlStringResult; import com.bowintek.practice.vo.temp.TempObjectModel; import com.fasterxml.jackson.databind.node.ObjectNode; import com.github.pagehelper.PageInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; import java.util.*; @RestController @RequestMapping("/api/esquery") public class EsQueryController { @Autowired private EsQueryService esQueryService; @Autowired private QueryLogService queryLogService; @Autowired private AccountService accountService; @PostMapping("/Query") public BaseResponse getQuery(@RequestBody EsQueryModel model) { //在es查询并返回结果 List limiters = model.getLimiters(); List queryList = model.getQueryList(); FormState formState = model.getFormState(); if (formState != null) { if (!StringUtils.IsNullEmpty(formState.getWell_common_name())) { limiters.add(new ComparisonResult() {{ setValue(formState.getWell_common_name()); setOpreation("等于"); setFields("well_common_name"); setRelation("AND"); }}); } if (!StringUtils.IsNullEmpty(formState.getBz_dwmc())) { limiters.add(new ComparisonResult() {{ setValue(formState.getBz_dwmc()); setOpreation("等于"); setFields("bz_dwmc"); setRelation("AND"); }}); } if (!StringUtils.IsNullEmpty(formState.getOrg_name_a1())) { limiters.add(new ComparisonResult() {{ setValue(formState.getOrg_name_a1()); setOpreation("等于"); setFields("org_name_a1"); setRelation("AND"); }}); } if (!StringUtils.IsNullEmpty(formState.getDefaultKeyString())) { queryList.add(new EsQueryText() {{ setOperation("等于"); setKeyString(formState.getDefaultKeyString()); setField(formState.getDefaultField()); }}); } } Map results = esQueryService.query(queryList, limiters, model.getPage(), model.getLimit()); highlight(results); //保存查询字符串,查询历史统计 for (EsQueryText queryText : model.getQueryList()) { if (!StringUtils.IsNullEmpty(queryText.getKeyString())) queryLogService.save(queryText.getKeyString(), accountService.getLoginUserID()); } return RespGenerstor.success(results); } //高亮解析 private void highlight(Map results) { List> rows = (List>) results.get("rows"); rows.forEach(it -> { it.put("key", UUID.randomUUID().toString()); if (it.get("highlight") != null) { Map> highlight = (Map>) it.get("highlight"); for (String key : highlight.keySet()) { //主索引 if (it.keySet().contains(key)) { it.put(key, highlight.get(key).get(0)); } else { nestedHighlight(it); } } } }); } //嵌套索引 //实现逻辑,查找高亮部分innerHits->highlight的节点内容,替换搜索结果数据里面对应的字段内容 private void nestedHighlight(Map it) { Map innerHits = (Map) it.get("innerHits"); for (String nestedKey : innerHits.keySet()) { InnerHitsResult nested = (InnerHitsResult) innerHits.get(nestedKey); List> nestedHits = nested.hits().hits(); for (Hit hit : nestedHits) { int offset = hit.nested().offset(); Map> nestedHighlight = hit.highlight(); for (String nKey : nestedHighlight.keySet()) { ArrayList> nestedData = (ArrayList>) it.get(nestedKey); Map row = (Map) nestedData.get(offset); String fieldName = nKey.replace(nestedKey + ".", ""); if (row.keySet().contains(fieldName)) { row.put(fieldName, nestedHighlight.get(nKey).get(0)); } } } } } }