123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- 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<ComparisonResult> limiters = model.getLimiters();
- List<EsQueryText> 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<String, Object> 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<String, Object> results) {
- List<Map<String, Object>> rows = (List<Map<String, Object>>) results.get("rows");
- rows.forEach(it -> {
- it.put("key", UUID.randomUUID().toString());
- if (it.get("highlight") != null) {
- Map<String, ArrayList<String>> highlight = (Map<String, ArrayList<String>>) 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<String, Object> it) {
- Map<String, Object> innerHits = (Map<String, Object>) it.get("innerHits");
- for (String nestedKey : innerHits.keySet()) {
- InnerHitsResult nested = (InnerHitsResult) innerHits.get(nestedKey);
- List<Hit<JsonData>> nestedHits = nested.hits().hits();
- for (Hit<JsonData> hit : nestedHits) {
- int offset = hit.nested().offset();
- Map<String, List<String>> nestedHighlight = hit.highlight();
- for (String nKey : nestedHighlight.keySet()) {
- ArrayList<Map<String, Object>> nestedData = (ArrayList<Map<String, Object>>) it.get(nestedKey);
- Map<String, Object> row = (Map<String, Object>) nestedData.get(offset);
- String fieldName = nKey.replace(nestedKey + ".", "");
- if (row.keySet().contains(fieldName)) {
- row.put(fieldName, nestedHighlight.get(nKey).get(0));
- }
- }
- }
- }
- }
- }
|