EsQueryController.java 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package com.bowintek.practice.controller;
  2. import co.elastic.clients.elasticsearch.core.search.Hit;
  3. import co.elastic.clients.elasticsearch.core.search.InnerHitsResult;
  4. import co.elastic.clients.json.JsonData;
  5. import com.bowintek.practice.AppConfig;
  6. import com.bowintek.practice.filter.exception.BaseResponse;
  7. import com.bowintek.practice.filter.exception.RespGenerstor;
  8. import com.bowintek.practice.mapper.SrSaerchtempMapper;
  9. import com.bowintek.practice.mapper.SrTempDataMapper;
  10. import com.bowintek.practice.model.SrSaerchtemp;
  11. import com.bowintek.practice.model.SrTempData;
  12. import com.bowintek.practice.services.service.*;
  13. import com.bowintek.practice.util.StringUtils;
  14. import com.bowintek.practice.vo.Analyze.ComparisonResult;
  15. import com.bowintek.practice.vo.Analyze.EsQueryModel;
  16. import com.bowintek.practice.vo.Analyze.EsQueryText;
  17. import com.bowintek.practice.vo.Analyze.FormState;
  18. import com.bowintek.practice.vo.SaerchtempVo;
  19. import com.bowintek.practice.vo.system.RoleModel;
  20. import com.bowintek.practice.vo.temp.GenSqlStringResult;
  21. import com.bowintek.practice.vo.temp.TempObjectModel;
  22. import com.fasterxml.jackson.databind.node.ObjectNode;
  23. import com.github.pagehelper.PageInfo;
  24. import org.springframework.beans.factory.annotation.Autowired;
  25. import org.springframework.web.bind.annotation.*;
  26. import javax.servlet.http.HttpServletResponse;
  27. import java.io.*;
  28. import java.net.URLEncoder;
  29. import java.util.*;
  30. @RestController
  31. @RequestMapping("/api/esquery")
  32. public class EsQueryController {
  33. @Autowired
  34. private EsQueryService esQueryService;
  35. @Autowired
  36. private QueryLogService queryLogService;
  37. @Autowired
  38. private AccountService accountService;
  39. @PostMapping("/Query")
  40. public BaseResponse getQuery(@RequestBody EsQueryModel model) {
  41. //在es查询并返回结果
  42. List<ComparisonResult> limiters = model.getLimiters();
  43. List<EsQueryText> queryList = model.getQueryList();
  44. FormState formState = model.getFormState();
  45. if (formState != null) {
  46. if (!StringUtils.IsNullEmpty(formState.getWell_common_name())) {
  47. limiters.add(new ComparisonResult() {{
  48. setValue(formState.getWell_common_name());
  49. setOpreation("等于");
  50. setFields("well_common_name");
  51. setRelation("AND");
  52. }});
  53. }
  54. if (!StringUtils.IsNullEmpty(formState.getBz_dwmc())) {
  55. limiters.add(new ComparisonResult() {{
  56. setValue(formState.getBz_dwmc());
  57. setOpreation("等于");
  58. setFields("bz_dwmc");
  59. setRelation("AND");
  60. }});
  61. }
  62. if (!StringUtils.IsNullEmpty(formState.getOrg_name_a1())) {
  63. limiters.add(new ComparisonResult() {{
  64. setValue(formState.getOrg_name_a1());
  65. setOpreation("等于");
  66. setFields("org_name_a1");
  67. setRelation("AND");
  68. }});
  69. }
  70. if (!StringUtils.IsNullEmpty(formState.getDefaultKeyString())) {
  71. queryList.add(new EsQueryText() {{
  72. setOperation("等于");
  73. setKeyString(formState.getDefaultKeyString());
  74. setField(formState.getDefaultField());
  75. }});
  76. }
  77. }
  78. Map<String, Object> results = esQueryService.query(queryList,
  79. limiters,
  80. model.getPage(),
  81. model.getLimit());
  82. highlight(results);
  83. //保存查询字符串,查询历史统计
  84. for (EsQueryText queryText : model.getQueryList()) {
  85. if (!StringUtils.IsNullEmpty(queryText.getKeyString()))
  86. queryLogService.save(queryText.getKeyString(), accountService.getLoginUserID());
  87. }
  88. return RespGenerstor.success(results);
  89. }
  90. //高亮解析
  91. private void highlight(Map<String, Object> results) {
  92. List<Map<String, Object>> rows = (List<Map<String, Object>>) results.get("rows");
  93. rows.forEach(it -> {
  94. it.put("key", UUID.randomUUID().toString());
  95. if (it.get("highlight") != null) {
  96. Map<String, ArrayList<String>> highlight = (Map<String, ArrayList<String>>) it.get("highlight");
  97. for (String key : highlight.keySet()) {
  98. //主索引
  99. if (it.keySet().contains(key)) {
  100. it.put(key, highlight.get(key).get(0));
  101. } else {
  102. nestedHighlight(it);
  103. }
  104. }
  105. }
  106. });
  107. }
  108. //嵌套索引
  109. //实现逻辑,查找高亮部分innerHits->highlight的节点内容,替换搜索结果数据里面对应的字段内容
  110. private void nestedHighlight(Map<String, Object> it) {
  111. Map<String, Object> innerHits = (Map<String, Object>) it.get("innerHits");
  112. for (String nestedKey : innerHits.keySet()) {
  113. InnerHitsResult nested = (InnerHitsResult) innerHits.get(nestedKey);
  114. List<Hit<JsonData>> nestedHits = nested.hits().hits();
  115. for (Hit<JsonData> hit : nestedHits) {
  116. int offset = hit.nested().offset();
  117. Map<String, List<String>> nestedHighlight = hit.highlight();
  118. for (String nKey : nestedHighlight.keySet()) {
  119. ArrayList<Map<String, Object>> nestedData = (ArrayList<Map<String, Object>>) it.get(nestedKey);
  120. Map<String, Object> row = (Map<String, Object>) nestedData.get(offset);
  121. String fieldName = nKey.replace(nestedKey + ".", "");
  122. if (row.keySet().contains(fieldName)) {
  123. row.put(fieldName, nestedHighlight.get(nKey).get(0));
  124. }
  125. }
  126. }
  127. }
  128. }
  129. }