From 3ac0affc8ac04898989026f4899db68c852ce12b Mon Sep 17 00:00:00 2001 From: wangzhijiang <1358525938@qq.com> Date: Thu, 15 Jun 2023 15:23:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=8B=E6=9C=BA=E7=AB=AF-=E6=90=9C=E7=B4=A2-?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=96=87=E6=A1=A3=E5=BA=93=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E4=B8=AD=E5=BF=83=E6=95=B0=E6=8D=AE=E6=8E=A5=E5=8F=A3=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SearchCenterController.java | 7 + .../phone/service/ISearchCenterService.java | 2 + .../service/impl/SearchCenterServiceImpl.java | 239 ++++++++++++++++++ 3 files changed, 248 insertions(+) diff --git a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/phone/controller/SearchCenterController.java b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/phone/controller/SearchCenterController.java index 48b4894fe..fa9b5f564 100644 --- a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/phone/controller/SearchCenterController.java +++ b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/phone/controller/SearchCenterController.java @@ -34,4 +34,11 @@ public class SearchCenterController { public Result> getWdkCollectAndSubscribeInfoByUser(@RequestParam Map params) { return this.searchCenterService.getWdkCollectAndSubscribeInfoByUser(params); } + + @AutoLog(value = "手机端-搜索-查询文档库搜索中心数据") + @ApiOperation(value = "手机端-搜索-查询文档库搜索中心数据", notes = "手机端-搜索-查询文档库搜索中心数据") + @GetMapping(value = "/getWdkPage") + public Result getWdkPage(@RequestParam Map params) { + return this.searchCenterService.getWdkPage(params); + } } diff --git a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/phone/service/ISearchCenterService.java b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/phone/service/ISearchCenterService.java index 02c235eac..acb1f50ca 100644 --- a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/phone/service/ISearchCenterService.java +++ b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/phone/service/ISearchCenterService.java @@ -9,4 +9,6 @@ public interface ISearchCenterService { Result> getDataCount(); Result> getWdkCollectAndSubscribeInfoByUser(Map params); + + Result getWdkPage(Map params); } diff --git a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/phone/service/impl/SearchCenterServiceImpl.java b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/phone/service/impl/SearchCenterServiceImpl.java index 3b3fb61b3..08d0a96ca 100644 --- a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/phone/service/impl/SearchCenterServiceImpl.java +++ b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/phone/service/impl/SearchCenterServiceImpl.java @@ -1,13 +1,18 @@ package com.jero.modules.phone.service.impl; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.jero.common.api.vo.Result; import com.jero.common.constant.enums.CutEnum; +import com.jero.common.es.JeroElasticsearchTemplate; import com.jero.common.system.vo.LoginUser; +import com.jero.common.util.DateUtils; import com.jero.modules.collection.entity.OnlCgformCollection; import com.jero.modules.collection.service.IOnlCgformCollectionService; +import com.jero.modules.document.enums.SearchEnum; import com.jero.modules.document.service.IBussDocumentLibraryEOService; import com.jero.modules.phone.service.ISearchCenterService; import com.jero.modules.problemKnowledgeBase.entity.ProblemKnowledgeBaseEO; @@ -18,10 +23,15 @@ import com.jero.modules.report.service.ILawsMonthlyReportManageEOService; import com.jero.modules.subscribe.entity.OnlCgformSubscribe; import com.jero.modules.subscribe.service.IOnlCgformSubscribeService; import com.jero.modules.system.service.ISysUserService; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; +import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -41,6 +51,9 @@ public class SearchCenterServiceImpl implements ISearchCenterService { private IOnlCgformCollectionService onlCgformCollectionService; @Autowired private IOnlCgformSubscribeService onlCgformSubscribeService; + @Autowired + private JeroElasticsearchTemplate jeroElasticsearchTemplate; + public static final String SEARCH_FLAG = "魑";//标识(es数据带此标识的代表全文和段落的数据,不带此标识的代表列表数据) @Override public Result> getDataCount() { @@ -101,4 +114,230 @@ public class SearchCenterServiceImpl implements ISearchCenterService { result.put("collectionList", collectionList); return Result.OK(result); } + + @Override + public Result getWdkPage(Map params) { + boolean indexExistsFlag = true; + String cut = (String) params.get("cut"); + Integer pageNo = Integer.parseInt(params.get("pageNo").toString()); + Integer pageSize = Integer.parseInt(params.get("pageSize").toString()); + if (StringUtils.equals(cut, CutEnum.CN.getValue())) { + indexExistsFlag = jeroElasticsearchTemplate.indexExists(SearchEnum.FULL_TEXT_SEARCH_CN.getValue()); + } else if (StringUtils.equals(cut, CutEnum.EN.getValue())) { + indexExistsFlag = jeroElasticsearchTemplate.indexExists(SearchEnum.FULL_TEXT_SEARCH_EN.getValue()); + } + if (!indexExistsFlag) { + Page page = new Page(pageNo, pageSize); + return Result.OK(page); + } + + // 定义需要查询的字段数组 + List fieldList = new ArrayList<>(); + fieldList.add("serial_number"); + fieldList.add("title"); + fieldList.add("content"); + + JSONArray queryMapJsonAll = new JSONArray(); + + JSONArray queryMapInputJson = new JSONArray(); + Map mapHighlight = new HashMap<>(); + Map mapHighlight1 = new HashMap<>(); + + String selectValue = (String) params.get("selectValue"); + if (StringUtils.isNotBlank(selectValue)) { + for (String field : fieldList) { + this.setQueryMapJson(queryMapInputJson, selectValue, field); + //高亮 + this.wdkHighlight(mapHighlight, field); + } + mapHighlight1.put("fields", mapHighlight); + + if (CollectionUtils.isNotEmpty(queryMapInputJson)) { + JSONObject jsonObject = jeroElasticsearchTemplate.buildBoolQuery(null, null, queryMapInputJson); + queryMapJsonAll.add(jsonObject); + } + } + + //指定module_type_flag= WDK + JSONArray moduleTypeFlagQueryJsonArrMust = new JSONArray(); + Map moduleTypeFlagValueMap = new HashMap<>(); + Map moduleTypeFlagFieldMap = new HashMap<>(); + Map moduleTypeFlagMatchMap = new HashMap<>(); + moduleTypeFlagValueMap.put("query", "WDK"); + moduleTypeFlagFieldMap.put("module_type_flag", moduleTypeFlagValueMap); + moduleTypeFlagMatchMap.put("match", moduleTypeFlagFieldMap); + moduleTypeFlagQueryJsonArrMust.add(moduleTypeFlagMatchMap); + JSONObject moduleTypeFlagQueryJson = jeroElasticsearchTemplate.buildBoolQuery(moduleTypeFlagQueryJsonArrMust, null, null); + queryMapJsonAll.add(moduleTypeFlagQueryJson); + + JSONObject querySort = new JSONObject(); + if (StringUtils.isEmpty(selectValue) || StringUtils.equals(selectValue, SEARCH_FLAG)) { + Map createTime = new HashMap<>(); + Map createTime1 = new HashMap<>(); + createTime.put("order", "desc"); + createTime1.put("create_time", createTime); + querySort.putAll(createTime1); + } else { + Map score = new HashMap<>(); + Map score1 = new HashMap<>(); + score.put("order", "desc"); + score1.put("_score", score); + querySort.putAll(score1); + } + + IPage page = this.getWdkPage( + queryMapJsonAll, + mapHighlight1, + pageNo, + pageSize, + cut, + querySort, + null, + null + ); + return Result.OK(page); + } + + @NotNull + private IPage getWdkPage(JSONArray queryMapJson, + Map highlightMap, + Integer pageNo, + Integer pageSize, + String cut, + JSONObject querySort, + JSONArray queryMustNot, + JSONArray queryShould) { + JSONObject jsonObject = jeroElasticsearchTemplate.buildBoolQuery(queryMapJson, queryMustNot, queryShould); + JSONArray jsonArraySort = new JSONArray(); + jsonArraySort.add(querySort); + + //1. 条件,分页 + JSONObject queryObject = jeroElasticsearchTemplate.buildQuery( + null, + jsonObject, + highlightMap, + jsonArraySort, + pageNo - 1, + pageSize + ); + + //2. 数据查询 + JSONObject search = new JSONObject(); + if (CutEnum.CN.getValue().equals(cut)) { + search = jeroElasticsearchTemplate.search( + SearchEnum.FULL_TEXT_SEARCH_CN.getValue(), + SearchEnum.FULL_TEXT_SEARCH_CN.getValue(), + queryObject + ); + } else { + search = jeroElasticsearchTemplate.search( + SearchEnum.FULL_TEXT_SEARCH_EN.getValue(), + SearchEnum.FULL_TEXT_SEARCH_EN.getValue(), + queryObject + ); + } + + List> list = (List>) (((Map) search.get("hits")).get("hits")); + List> mapList = new ArrayList<>(); + for (Map map : list) { + Map mapSource = (Map) map.get("_source"); + Map mapHighlight = (Map) map.get("highlight"); + if(ObjectUtils.isNotEmpty(mapHighlight)){ + for (Map.Entry entry : mapHighlight.entrySet()) { + String key = entry.getKey(); + List value = (List) entry.getValue(); + String fieldConyent= ""; + for (String s : value) { + fieldConyent += s; + } + mapSource.put(key,fieldConyent); + } + } + String create_time_str = ""; + if(ObjectUtils.isNotEmpty(mapSource.get("create_time"))){ + create_time_str = DateUtils.formatTime((Long) mapSource.get("create_time")); + } + mapSource.put("create_time_str",create_time_str); + mapList.add(mapSource); + } + + //处理分页 + IPage page = new Page(pageNo, pageSize); + page.setTotal(Long.parseLong(String.valueOf(((Map) search.get("hits")).get("total")))); + page.setRecords(mapList); + return page; + } + + /** + * 设置文档库高亮字段 + * @param mapHighlight + * @param key + */ + private void wdkHighlight(Map mapHighlight, String key) { + Map mapTemp = new HashMap<>(); + List list = new ArrayList<>(); + list.add(""); + List list1 = new ArrayList<>(); + list1.add(""); + mapTemp.put("pre_tags", list); + mapTemp.put("post_tags", list1); + mapTemp.put("fragment_size", 320); + mapTemp.put("number_of_fragments", 1); + mapTemp.put("type", "plain"); + mapHighlight.put(key, mapTemp); + } + + private void setQueryMapJson(JSONArray queryMapJson, String selectValue, String field) { + // 前缀匹配 缺点是前缀一定不能断开 + // 情况举例:用户只记得前面那段字 + Map map21 = new HashMap<>(); + Map map31 = new HashMap<>(); + Map map41 = new HashMap<>(); + if ("title".equals(field)) { + map31.put("boost", 10); + } else if ("content".equals(field)) { + map31.put("boost", 0.01); + } + map31.put("value", selectValue); + map21.put(field + ".keyword", map31); + map41.put("prefix", map21); + queryMapJson.add(map41); + + // match_phrase_prefix 词组匹配查询,允许最后词组与文中的任意分词前缀匹配 + Map map22 = new HashMap<>(); + Map map32 = new HashMap<>(); + Map map42 = new HashMap<>(); + if ("title".equals(field)) { + map32.put("boost", 10); + } else if ("content".equals(field)) { + map32.put("boost", 0.01); + } + map32.put("query", selectValue); + map22.put(field, map32); + map42.put("match_phrase_prefix", map22); + queryMapJson.add(map42); + + // match分词匹配查询 + // 情况举例:用户可能他知道开头的前缀几个字,知道中间的几个字 + Map map23 = new HashMap<>(); + Map map33 = new HashMap<>(); + Map map43 = new HashMap<>(); + if ("title".equals(field)) { + map33.put("boost", 10); + } else if ("content".equals(field)) { + map33.put("boost", 0.01); + } + map33.put("query", selectValue); + map23.put(field, map33); + map43.put("match", map23); + queryMapJson.add(map43); + + // wildcard模糊查询 + // 情况举例:用户只记得中间那段字 + Map map24 = new HashMap<>(); + Map map44 = new HashMap<>(); + map24.put(field, "*" + selectValue + "*"); + map44.put("wildcard", map24); + queryMapJson.add(map44); + } }