diff --git a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/searchcenter/service/impl/DocumentSearchServiceImpl.java b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/searchcenter/service/impl/DocumentSearchServiceImpl.java index 9e6ae15f1..079061e34 100644 --- a/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/searchcenter/service/impl/DocumentSearchServiceImpl.java +++ b/jero-boot/jero-boot-modules/src/main/java/com/jero/modules/searchcenter/service/impl/DocumentSearchServiceImpl.java @@ -4,12 +4,14 @@ package com.jero.modules.searchcenter.service.impl; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +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.constant.enums.CutEnum; import com.jero.common.constant.enums.ModuleEnum; import com.jero.common.constant.enums.YesOrNoEnum; import com.jero.common.es.JeroElasticsearchTemplate; +import com.jero.common.system.vo.LoginUser; import com.jero.generater.modules.online.cgform.entity.OnlCgformField; import com.jero.generater.modules.online.cgform.service.impl.OnlCgformFieldServiceImpl; import com.jero.modules.collection.entity.OnlCgformCollection; @@ -20,6 +22,9 @@ import com.jero.modules.document.service.IBussDocumentLibraryEOService; import com.jero.modules.document.service.impl.BussDocumentLibraryEOServiceImpl; import com.jero.modules.oss.entity.OSSFile; import com.jero.modules.oss.service.IOSSFileService; +import com.jero.modules.problemKnowledgeBase.entity.ProblemKnowledgeBaseUserEO; +import com.jero.modules.problemKnowledgeBase.enums.ShowPermissionsEnum; +import com.jero.modules.problemKnowledgeBase.service.IProblemKnowledgeBaseUserEOService; import com.jero.modules.searchcenter.vo.SearchVO; import com.jero.modules.subscribe.entity.OnlCgformSubscribe; import com.jero.modules.subscribe.service.IOnlCgformSubscribeService; @@ -30,6 +35,7 @@ import com.jero.modules.system.service.impl.SysDictItemServiceImpl; 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.Component; @@ -65,6 +71,8 @@ public class DocumentSearchServiceImpl implements IDocumentSearchService { private IOnlCgformCollectionService iOnlCgformCollectionService; @Autowired private IOnlCgformSubscribeService iOnlCgformSubscribeService; + @Autowired + private IProblemKnowledgeBaseUserEOService problemKnowledgeBaseUserEOService; public static final String SEARCH_FLAG = "魑";//标识(es数据带此标识的代表全文和段落的数据,不带此标识的代表列表数据) @@ -1093,6 +1101,8 @@ public class DocumentSearchServiceImpl implements IDocumentSearchService { } JSONArray queryJsonMustNot = new JSONArray(); + JSONArray queryShould = new JSONArray(); + String selectValue = (String) map.get("selectValue"); String selectValueTwo = (String) map.get("selectValueTwo"); String problem_type = (String) map.get("problem_type"); @@ -1101,19 +1111,26 @@ public class DocumentSearchServiceImpl implements IDocumentSearchService { List fieldList = new ArrayList<>(); fieldList.add("title");//权重5 fieldList.add("content");//权重4 -// fieldList.add("problem_type");//权重3 -// fieldList.add("target_market"); //权重2 - fieldList.add("module_type"); - fieldList.add("id"); - fieldList.add("flag"); + //fieldList.add("module_type"); + //fieldList.add("id"); + //fieldList.add("flag"); JSONArray queryMapJson = new JSONArray(); + JSONArray queryMapInputJson = new JSONArray(); JSONArray queryMapJsonTwo = new JSONArray(); JSONArray queryMapJsonThree = new JSONArray(); - JSONArray queryMapJsonProblemType = new JSONArray(); - JSONArray queryMapJsonTargetMarket = new JSONArray(); JSONArray queryMapJsonAll = new JSONArray(); + //基础查询权限,展示权限为公开的,所有人都能查看,展示权限为私密的,只有配置了权限的用户可以查看。 + if("base".equals("base")){ + JSONArray queryMapJsonBase = new JSONArray(); + + this.createQueryWhere(ShowPermissionsEnum.OPEN.getValue(),"show_permissions",queryMapJsonBase); + + JSONObject jsonObject = jeroElasticsearchTemplate.buildBoolQuery(null, null, queryMapJsonBase); + queryMapJsonAll.add(jsonObject); + } + Map mapHighlight = new HashMap<>(); Map mapHighlight1 = new HashMap<>(); //封装首次的条件 @@ -1128,14 +1145,19 @@ public class DocumentSearchServiceImpl implements IDocumentSearchService { map3.put("boost",0.01); }else if("content".equals(field)){ map3.put("boost",0.01); - }else if("file_name".equals(field)){ - map3.put("boost",1); } - - map3.put("query",selectValue); - map2.put(field, map3); - map4.put("match",map2); - queryMapJson.add(map4); + //特殊处理标题字段 + if (field.equals("title")){ + // map2放最内层 + map2.put(field, "*" + selectValue + "*"); + // map4放query + map4.put("wildcard",map2); + } else { + map3.put("query",selectValue); + map2.put(field, map3); + map4.put("match",map2); + } + queryMapInputJson.add(map4); //高亮 if(!"flag".equals(field)){ @@ -1147,41 +1169,23 @@ public class DocumentSearchServiceImpl implements IDocumentSearchService { //封装问题类型选择框查询条件。 if (StringUtils.isNotBlank(problem_type)) { - Map map2 = new HashMap<>(); - Map map3 = new HashMap<>(); - Map map4 = new HashMap<>(); - - map3.put("query",problem_type); - map2.put("problem_type", map3); - map4.put("match",map2); - queryMapJson.add(map4); - //高亮 - highlight(mapHighlight, problem_type); - - mapHighlight1.put("fields",mapHighlight); + this.createQueryWhere(problem_type,"problem_type",queryMapJson); } //封装市场选择框查询条件。 if (StringUtils.isNotBlank(target_market)) { - Map map2 = new HashMap<>(); - Map map3 = new HashMap<>(); - Map map4 = new HashMap<>(); - - map3.put("query",target_market); - map2.put("target_market", map3); - map4.put("match",map2); - queryMapJson.add(map4); - //高亮 - highlight(mapHighlight, target_market); - - mapHighlight1.put("fields",mapHighlight); + this.createQueryWhere(target_market,"target_market",queryMapJson); } - if(CollectionUtils.isNotEmpty(queryMapJson)){ - JSONObject jsonObject = jeroElasticsearchTemplate.buildBoolQuery(null, null, queryMapJson); + JSONObject jsonObject = jeroElasticsearchTemplate.buildBoolQuery(queryMapJson, null, null); queryMapJsonAll.add(jsonObject); } + if(CollectionUtils.isNotEmpty(queryMapInputJson)){ + JSONObject jsonObject = jeroElasticsearchTemplate.buildBoolQuery(null, null, queryMapInputJson); + queryMapJsonAll.add(jsonObject); + } + //封装二次的条件 if (StringUtils.isNotBlank(selectValueTwo)) { for (String field : fieldList) { @@ -1194,13 +1198,10 @@ public class DocumentSearchServiceImpl implements IDocumentSearchService { map3.put("boost",0.01); }else if("content".equals(field)){ map3.put("boost",0.01); - }else if("file_name".equals(field)){ - map3.put("boost",1); } //特殊处理编号字段 map3.put("query",selectValueTwo); -// map3.put("minimum_should_match",2); map2.put(field, map3); queryMap.put("match", map2); @@ -1241,20 +1242,20 @@ public class DocumentSearchServiceImpl implements IDocumentSearchService { Integer pageNo = Integer.parseInt(map.get("pageNo").toString()); Integer pageSize = Integer.parseInt(map.get("pageSize").toString()); IPage page = this.getProblemKnowledgeBasePage(selectValue, selectValueTwo, queryMapJsonAll, mapHighlight1,null, - pageNo, pageSize, null,(String) map.get("cut"),sort,queryJsonMustNot); + pageNo, pageSize, null,(String) map.get("cut"),sort,queryJsonMustNot,queryShould); return page; } @NotNull private IPage getProblemKnowledgeBasePage(String selectValue, String selectValueTwo, JSONArray queryMapJson,Map highlightMap, JSONArray should, Integer pageNo, Integer pageSize, String paragraphFlag, - String cut,JSONObject querySort,JSONArray queryMustNot) { + String cut,JSONObject querySort,JSONArray queryMustNot,JSONArray queryShould) { JSONObject jsonObject = new JSONObject(); //基础添加封装 if ("paragraphFlag".equals(paragraphFlag)) { - jsonObject = jeroElasticsearchTemplate.buildBoolQuery(queryMapJson, queryMustNot, null); + jsonObject = jeroElasticsearchTemplate.buildBoolQuery(queryMapJson, queryMustNot, queryShould); } else { - jsonObject = jeroElasticsearchTemplate.buildBoolQuery(queryMapJson, queryMustNot, null); + jsonObject = jeroElasticsearchTemplate.buildBoolQuery(queryMapJson, queryMustNot, queryShould); } JSONArray jsonArraySort = new JSONArray(); jsonArraySort.add(querySort); @@ -1295,10 +1296,10 @@ public class DocumentSearchServiceImpl implements IDocumentSearchService { mapSource.put(key,fieldConyent); } //如果这一条数据中有高亮字段值,但是file_text中没有高亮值, 则赋控制,否则列表中会展示所有的文件内容, 赋空后,则展示基础数据 - String fileText = (String) mapSource.get("content"); + /*String fileText = (String) mapSource.get("content"); if(StringUtils.isNotBlank(fileText) && !fileText.contains("")){ mapSource.put("content",""); - } + }*/ } mapList.add(mapSource); } @@ -1317,6 +1318,58 @@ public class DocumentSearchServiceImpl implements IDocumentSearchService { return page; } + /** + * 创建查询条件 + * @param queryValue 查询的值 + * @param fieldKey 查询的字段 + * @param jsonArray + */ + public void createQueryWhere (String queryValue,String fieldKey,JSONArray jsonArray){ + /** + * fieldKeyMap:字段keyMap,用于存 需要查询的字段 以及字段中的条件 "queryMap" + * queryMap:存放查询条件map + * matchMap:匹配Map + */ + Map fieldKeyMap = new HashMap<>(); + Map queryMap = new HashMap<>(); + Map matchMap = new HashMap<>(); + + queryMap.put("query", queryValue); + fieldKeyMap.put(fieldKey, queryMap); + matchMap.put("match",fieldKeyMap); + + // 如果是私密,并且查询字段key是展示权限 的话,查询当前用户拥有权限的问题知识库数据 + if(StringUtils.equals(fieldKey,"show_permissions")){ + //查询出当前登录人所拥有的问题知识库私密数据权限。 + LoginUser currentOperatorUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + QueryWrapper userPermissionQueryWrapper = new QueryWrapper<>(); + userPermissionQueryWrapper.lambda().eq(ProblemKnowledgeBaseUserEO::getUserId,currentOperatorUser.getId()); + List problemKnowledgeBaseUserEOList = this.problemKnowledgeBaseUserEOService.list(userPermissionQueryWrapper); + + if(CollectionUtils.isNotEmpty(problemKnowledgeBaseUserEOList)){ + List problemKnowledgeBaseIdList = problemKnowledgeBaseUserEOList.stream().map(ProblemKnowledgeBaseUserEO::getProblemKnowledgeBaseId).distinct().collect(Collectors.toList()); + + //in查询该用户拥有权限的问题知识库id。 + Map fieldKeyMap2 = new HashMap<>(); + Map matchMap2 = new HashMap<>(); + fieldKeyMap2.put("id", problemKnowledgeBaseIdList); + matchMap2.put("terms",fieldKeyMap2); + jsonArray.add(matchMap2); + }else { + Map fieldKeyMap2 = new HashMap<>(); + Map queryMap2 = new HashMap<>(); + Map matchMap2 = new HashMap<>(); + + queryMap2.put("query", "null"); + fieldKeyMap2.put("id", queryMap2); + matchMap2.put("match",fieldKeyMap2); + jsonArray.add(matchMap2); + } + } + + jsonArray.add(matchMap); + } + }