Elasticsearch 的Java API使用匹配空或者是null字段

article/2025/9/20 22:24:54

全文检索数据权限控制,需要根据业务权限配置;

本组成员包括查看自己【有些模块本来就没有分组】,此时需要查询groupId为null,但是creator为自己的数据!
在这里插入图片描述
参考案例

.must(QueryBuilders.existsQuery("message")) //查message为非空的数据
.mustNot(QueryBuilders.existsQuery("message"))) //查message为空的数据
 //本组权限【 包括分组是为null, 但能查看自己的数据】  acsBoolQuery.mustNot(QueryBuilders.existsQuery("groupId")).should(QueryBuilders.termsQuery("creator", businessAuthorityVO.getUserId()));

在这里插入图片描述
效果:
在这里插入图片描述

附上整个search代码

package com.sw.fam.service.ais.impl;import com.sw.fam.enums.acs.BusinessCodeEnum;
import com.sw.fam.enums.ais.EsIndexEnum;
import com.sw.fam.service.acs.impl.AcsBusinessAuthorityServiceImpl;
import com.sw.fam.service.ais.AisService;
import com.sw.fam.utils.FileComponent;
import com.sw.fam.vo.acs.BusinessAuthorityVO;
import com.sw.fam.vo.ais.IndexEntityVO;
import com.sw.fam.vo.ais.ReturnBean;
import com.sw.fam.vo.ais.SearchBean;
import com.sw.seeker.basic.constant.SeekerConstant;
import com.sw.seeker.common.util.CurrentUser;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.QueryStringQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilder;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.ParsedStringTerms;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.regex.Pattern;/*** @author ganquanzhong* @version v1.0* @description 检索服务接口实现类* @since 2020-09-21 v1.0**/
@Service
public class AisServiceImpl implements AisService {@Autowiredprivate RestHighLevelClient restHighLevelClient;@Autowiredprivate FileComponent fileComponent;@Autowiredprivate AcsBusinessAuthorityServiceImpl businessAuthorityService;/*** @param param {@link com.sw.fam.vo.ais.SearchBean} 请求参数* @return ReturnBean {@link com.sw.fam.vo.ais.ReturnBean} 返回结果* @throws IOException 检索异常* @description 全部 全文检索* @create ganquanzhong 2020/09/21*/@Overridepublic ReturnBean search(SearchBean param) throws IOException {//最终的请求体SearchRequest searchRequest = null;String indexName = param.getClusterName();String searchValue = param.getSearchValue();String projectId = "";if (param.getSearchMap().get("projectId") != null) {//项目内检索projectId = param.getSearchMap().get("projectId").toString();}HashMap<String, List<BusinessAuthorityVO>> businessAuthorityVOMap = new HashMap<>();// 1.构建SearchRequest检索请求if (indexName == null || "".equals(indexName)) {searchRequest = new SearchRequest();HashMap<String, List<BusinessAuthorityVO>> relicsAcsMap = businessAuthorityService.queryAisAuthorityByBusinessCode(projectId, BusinessCodeEnum.ASS_RELICS, BusinessCodeEnum.ADS_RELICS, BusinessCodeEnum.AES_RELICS_RELICS, BusinessCodeEnum.AES_RELICS_TILES);HashMap<String, List<BusinessAuthorityVO>> ruinsAcsMap = businessAuthorityService.queryAisAuthorityByBusinessCode(projectId, BusinessCodeEnum.ASS_RUINS, BusinessCodeEnum.ADS_RUINS, BusinessCodeEnum.AES_RUINS);HashMap<String, List<BusinessAuthorityVO>> sampleAcsMap = businessAuthorityService.queryAisAuthorityByBusinessCode(projectId, BusinessCodeEnum.ADS_SOIL, BusinessCodeEnum.AES_RELICS_SAMPLE);HashMap<String, List<BusinessAuthorityVO>> diaryAcsMap = businessAuthorityService.queryAisAuthorityByBusinessCode(projectId, BusinessCodeEnum.ASS_DIARY, BusinessCodeEnum.ADS_DRILL_DIARY, BusinessCodeEnum.AES_DIARY_EXPLORATION, BusinessCodeEnum.AES_DIARY_TEAM);HashMap<String, List<BusinessAuthorityVO>> siteAcsMap = businessAuthorityService.queryAisAuthorityByBusinessCode(projectId, BusinessCodeEnum.ASS_SITE_RECORD, BusinessCodeEnum.ADS_SITE_RECORD);HashMap<String, List<BusinessAuthorityVO>> layerAcsMap = businessAuthorityService.queryAisAuthorityByBusinessCode(projectId, BusinessCodeEnum.AES_LAYER);HashMap<String, List<BusinessAuthorityVO>> clueAcsMap = businessAuthorityService.queryAisAuthorityByBusinessCode(projectId, BusinessCodeEnum.ASS_CLUE);HashMap<String, List<BusinessAuthorityVO>> adsAcsMap = businessAuthorityService.queryAisAuthorityByBusinessCode(projectId, BusinessCodeEnum.ADS_DRILL);HashMap<String, List<BusinessAuthorityVO>> explorationAcsMap = businessAuthorityService.queryAisAuthorityByBusinessCode(projectId, BusinessCodeEnum.AES_EXPLORATION);if (relicsAcsMap != null) businessAuthorityVOMap.putAll(relicsAcsMap);if (ruinsAcsMap != null) businessAuthorityVOMap.putAll(ruinsAcsMap);if (sampleAcsMap != null) businessAuthorityVOMap.putAll(sampleAcsMap);if (diaryAcsMap != null) businessAuthorityVOMap.putAll(diaryAcsMap);if (siteAcsMap != null) businessAuthorityVOMap.putAll(siteAcsMap);if (layerAcsMap != null) businessAuthorityVOMap.putAll(layerAcsMap);if (clueAcsMap != null) businessAuthorityVOMap.putAll(clueAcsMap);if (adsAcsMap != null) businessAuthorityVOMap.putAll(adsAcsMap);if (explorationAcsMap != null) businessAuthorityVOMap.putAll(explorationAcsMap);}else {searchRequest = new SearchRequest(indexName);if (indexName.equals(EsIndexEnum.ASS_RELICS_IDX.getIndexName())) { //文物businessAuthorityVOMap = businessAuthorityService.queryAisAuthorityByBusinessCode(projectId, BusinessCodeEnum.ASS_RELICS, BusinessCodeEnum.ADS_RELICS, BusinessCodeEnum.AES_RELICS_RELICS, BusinessCodeEnum.AES_RELICS_TILES);}if (indexName.equals(EsIndexEnum.ASS_RUINS_IDX.getIndexName())) { //遗迹businessAuthorityVOMap = businessAuthorityService.queryAisAuthorityByBusinessCode(projectId, BusinessCodeEnum.ASS_RUINS, BusinessCodeEnum.ADS_RUINS, BusinessCodeEnum.AES_RUINS);}if (indexName.equals(EsIndexEnum.AES_SAMPLE_IDX.getIndexName())) {  //样品businessAuthorityVOMap = businessAuthorityService.queryAisAuthorityByBusinessCode(projectId, BusinessCodeEnum.ADS_SOIL, BusinessCodeEnum.AES_RELICS_SAMPLE);}if (indexName.equals(EsIndexEnum.ASS_DIARY_IDX.getIndexName())) { //日记businessAuthorityVOMap = businessAuthorityService.queryAisAuthorityByBusinessCode(projectId, BusinessCodeEnum.ASS_DIARY, BusinessCodeEnum.ADS_DRILL_DIARY, BusinessCodeEnum.AES_DIARY_EXPLORATION, BusinessCodeEnum.AES_DIARY_TEAM);}if (indexName.equals(EsIndexEnum.SITE_IDX.getIndexName())) {  //遗址businessAuthorityVOMap = businessAuthorityService.queryAisAuthorityByBusinessCode(projectId, BusinessCodeEnum.ASS_SITE_RECORD, BusinessCodeEnum.ADS_SITE_RECORD);}if (indexName.equals(EsIndexEnum.AES_LAYER_IDX.getIndexName())) {  //地层businessAuthorityVOMap = businessAuthorityService.queryAisAuthorityByBusinessCode(projectId, BusinessCodeEnum.AES_LAYER);}if (indexName.equals(EsIndexEnum.ASS_CLUE_IDX.getIndexName())) {  //线索businessAuthorityVOMap = businessAuthorityService.queryAisAuthorityByBusinessCode(projectId, BusinessCodeEnum.ASS_CLUE);}if (indexName.equals(EsIndexEnum.ADS_DRILL_IDX.getIndexName())) {  //探孔businessAuthorityVOMap = businessAuthorityService.queryAisAuthorityByBusinessCode(projectId, BusinessCodeEnum.ADS_DRILL);}if (indexName.equals(EsIndexEnum.AES_EXPLORATION_IDX.getIndexName())) {  //探方businessAuthorityVOMap = businessAuthorityService.queryAisAuthorityByBusinessCode(projectId, BusinessCodeEnum.AES_EXPLORATION);}if (indexName.equals(EsIndexEnum.FILE_IDX.getIndexName())) {  //附件HashMap<String, List<BusinessAuthorityVO>> relicsAcsMap = businessAuthorityService.queryAisAuthorityByBusinessCode(projectId, BusinessCodeEnum.ASS_RELICS, BusinessCodeEnum.ADS_RELICS, BusinessCodeEnum.AES_RELICS_RELICS, BusinessCodeEnum.AES_RELICS_TILES);HashMap<String, List<BusinessAuthorityVO>> ruinsAcsMap = businessAuthorityService.queryAisAuthorityByBusinessCode(projectId, BusinessCodeEnum.ASS_RUINS, BusinessCodeEnum.ADS_RUINS, BusinessCodeEnum.AES_RUINS);HashMap<String, List<BusinessAuthorityVO>> sampleAcsMap = businessAuthorityService.queryAisAuthorityByBusinessCode(projectId, BusinessCodeEnum.ADS_SOIL, BusinessCodeEnum.AES_RELICS_SAMPLE);HashMap<String, List<BusinessAuthorityVO>> diaryAcsMap = businessAuthorityService.queryAisAuthorityByBusinessCode(projectId, BusinessCodeEnum.ASS_DIARY, BusinessCodeEnum.ADS_DRILL_DIARY, BusinessCodeEnum.AES_DIARY_EXPLORATION, BusinessCodeEnum.AES_DIARY_TEAM);HashMap<String, List<BusinessAuthorityVO>> siteAcsMap = businessAuthorityService.queryAisAuthorityByBusinessCode(projectId, BusinessCodeEnum.ASS_SITE_RECORD, BusinessCodeEnum.ADS_SITE_RECORD);HashMap<String, List<BusinessAuthorityVO>> layerAcsMap = businessAuthorityService.queryAisAuthorityByBusinessCode(projectId, BusinessCodeEnum.AES_LAYER);HashMap<String, List<BusinessAuthorityVO>> clueAcsMap = businessAuthorityService.queryAisAuthorityByBusinessCode(projectId, BusinessCodeEnum.ASS_CLUE);HashMap<String, List<BusinessAuthorityVO>> adsAcsMap = businessAuthorityService.queryAisAuthorityByBusinessCode(projectId, BusinessCodeEnum.ADS_DRILL);HashMap<String, List<BusinessAuthorityVO>> explorationAcsMap = businessAuthorityService.queryAisAuthorityByBusinessCode(projectId, BusinessCodeEnum.AES_EXPLORATION);if (relicsAcsMap != null) businessAuthorityVOMap.putAll(relicsAcsMap);if (ruinsAcsMap != null) businessAuthorityVOMap.putAll(ruinsAcsMap);if (sampleAcsMap != null) businessAuthorityVOMap.putAll(sampleAcsMap);if (diaryAcsMap != null) businessAuthorityVOMap.putAll(diaryAcsMap);if (siteAcsMap != null) businessAuthorityVOMap.putAll(siteAcsMap);if (layerAcsMap != null) businessAuthorityVOMap.putAll(layerAcsMap);if (clueAcsMap != null) businessAuthorityVOMap.putAll(clueAcsMap);if (adsAcsMap != null) businessAuthorityVOMap.putAll(adsAcsMap);if (explorationAcsMap != null) businessAuthorityVOMap.putAll(explorationAcsMap);}}// 2.创建一个SearchSourceBuilder专门用于构建查询条件SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();//使用BoolQueryBuilder进行复合查询  过滤字段,效率高于mustBoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();// 输入框  查询条件if (searchValue == null || searchValue.isEmpty()) {sourceBuilder.query(QueryBuilders.matchAllQuery());} else {String reg = "^[a-z0-9A-Z]+$";// 判断输入的内容是否完全由数字或字母组成boolean flag = Pattern.compile(reg).matcher(searchValue).matches();searchValue = searchValue.toLowerCase(); //大写转为小写,由于ES创建索引时默认为小写if (flag) {searchValue = "*" + searchValue + "*";}QueryStringQueryBuilder builder = new QueryStringQueryBuilder(searchValue).fields(IndexEntityVO.getSearchField().get(indexName)).analyzer("ik_smart");boolQueryBuilder.must(builder);}// 数据权限过滤if (businessAuthorityVOMap.size() > 0) {BoolQueryBuilder authorityQuery = QueryBuilders.boolQuery();for (Map.Entry<String, List<BusinessAuthorityVO>> businessAuthorEntry : businessAuthorityVOMap.entrySet()) {Optional<BusinessAuthorityVO> filterFirst = businessAuthorEntry.getValue().stream().filter(x -> x.getQueryType().equals(SeekerConstant.SYS_BUSINESS_TYPE_ALL) || StringUtils.isEmpty(x.getGroupId())).findFirst();if (filterFirst.isPresent()) {//查询该模块的 全部或者不存在分组id时if (!indexName.equals(EsIndexEnum.FILE_IDX.getIndexName())) {authorityQuery.should(QueryBuilders.termQuery("flag", parseCode(businessAuthorEntry.getKey())));}continue;}BoolQueryBuilder acsBoolQuery = QueryBuilders.boolQuery();if (!indexName.equals(EsIndexEnum.FILE_IDX.getIndexName())) {//非附件类别的都通过业务权限过滤acsBoolQuery.must(QueryBuilders.termQuery("flag", parseCode(businessAuthorEntry.getKey()))); //模块过滤}//每个模块分开处理权限for (BusinessAuthorityVO businessAuthorityVO : businessAuthorEntry.getValue()) {if (businessAuthorityVO.getQueryType().equals(SeekerConstant.SYS_BUSINESS_TYPE_GROUP)) {acsBoolQuery.should(QueryBuilders.termsQuery("groupId", businessAuthorityVO.getGroupId()));//本组权限【 包括分组是为null, 但能查看自己的数据】acsBoolQuery.mustNot(QueryBuilders.existsQuery("groupId")).should(QueryBuilders.termsQuery("creator", businessAuthorityVO.getUserId()));} else if (businessAuthorityVO.getQueryType().equals(SeekerConstant.SYS_BUSINESS_TYPE_SELF)) {acsBoolQuery.should(QueryBuilders.termsQuery("creator", businessAuthorityVO.getUserId()));} else if (businessAuthorityVO.getQueryType().equals(SeekerConstant.SYS_BUSINESS_TYPE_DISABLE)) {acsBoolQuery.mustNot(QueryBuilders.termsQuery("groupId", businessAuthorityVO.getGroupId()));}}authorityQuery.should(acsBoolQuery);}boolQueryBuilder.must(authorityQuery);}// 分组条件  entrySet遍历,在键和值都需要时使用(最常用)   此处是遍历传入的字段限定,为完全符合BoolQueryBuilder mustQueryBuilder = QueryBuilders.boolQuery();if (param.getSearchMap() != null && param.getSearchMap().size() > 0) {for (Map.Entry<String, Object> entry : param.getSearchMap().entrySet()) {//判断组织idif ("orgId".equals(entry.getKey())) {String orgIds = CurrentUser.getOrgIds();String newOrgIds = orgIds.replace("'", "");String[] split = newOrgIds.split(",");if (split.length > 0) {boolQueryBuilder.filter(QueryBuilders.termsQuery(entry.getKey(), split));}continue;}//处理排序if (entry.getValue() != null && "order".equals(entry.getKey())) {// searchMap中键值为es中索引的字段,值为arrayList封装的ArrayList<String> terms = (ArrayList<String>) entry.getValue();if (terms.size() > 0) {terms.forEach(item -> {sourceBuilder.sort(item, SortOrder.DESC);});}} else {//处理条件查询if (entry.getValue() != null && !"".equals(entry.getValue())) {//分组条件查询if (entry.getValue() instanceof ArrayList) {// searchMap中键值为es中索引的字段,值为arrayList封装的ArrayList<String> terms = (ArrayList<String>) entry.getValue();BoolQueryBuilder shouldQueryBuilder = QueryBuilders.boolQuery();if (terms.size() > 0) {terms.forEach(item -> shouldQueryBuilder.should(QueryBuilders.termQuery(entry.getKey(), item)));mustQueryBuilder.must(shouldQueryBuilder);}} else {//单个键值对条件boolQueryBuilder.filter(QueryBuilders.termQuery(entry.getKey(), entry.getValue()));}}}}}boolQueryBuilder.must(mustQueryBuilder);//匹配度倒数,数值越大匹配度越高sourceBuilder.sort("_score", SortOrder.DESC);// 给请求设置需要高亮显示的字段HighlightBuilder highlightBuilder = new HighlightBuilder();List highlightFieldList = IndexEntityVO.getHighlightField().get(indexName);if (CollectionUtils.isNotEmpty(highlightFieldList)) {for (int i = 0; i < highlightFieldList.size(); i++) {String name = highlightFieldList.get(i).toString();HighlightBuilder.Field highlight =new HighlightBuilder.Field(name).preTags("<span style='color:#e74c3c;'>").postTags("</span>").fragmentSize(200).numOfFragments(1);highlight.highlighterType("unified");highlightBuilder.field(highlight);}}sourceBuilder.highlighter(highlightBuilder);//分页处理sourceBuilder.query(boolQueryBuilder).from((param.getPageNum() - 1) * param.getPageSize()).size(param.getPageSize());// 4.调用SearchRequest.source将查询条件设置到检索请求searchRequest.source(sourceBuilder);// 5.执行RestHighLevelClient.search发起请求SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);ReturnBean returnBean = new ReturnBean();List<Map<String, Object>> list = new ArrayList<>();//SearchHits提供有关所有匹配的全局信息,例如总命中数或最高分数:SearchHits hits = response.getHits();long totalHits = response.getHits().getTotalHits();returnBean.setTotal(totalHits);returnBean.setCurrent(param.getPageNum());returnBean.setSize(param.getPageSize());SearchHit[] searchHits = hits.getHits();ArrayList<String> fileInfoIdList = new ArrayList<>();for (SearchHit hit : searchHits) {//获取命中的数据源Map<String, Object> source = hit.getSourceAsMap();//文件类别需要处理if ("fam_file_idx".equals(indexName) || (source.get("flag") != null && source.get("flag").toString().equals("file"))) {if (source.get("fileInfoId") != null) {fileInfoIdList.add(source.get("fileInfoId").toString());}}//高亮结果处理Map<String, HighlightField> highlightFields = hit.getHighlightFields();if (CollectionUtils.isNotEmpty(highlightFieldList)) {for (int i = 0; i < highlightFieldList.size(); i++) {String name = highlightFieldList.get(i).toString();HighlightField highlightField = highlightFields.get(name);StringBuilder sb = new StringBuilder();if (highlightField != null) {Text[] fragments = highlightField.getFragments();for (Text text : fragments) {sb.append(text);}source.put(name, sb.toString());}}}list.add(source);}if (CollectionUtils.isNotEmpty(fileInfoIdList)) {HashMap<String, Object> map = fileComponent.queryFileList(fileInfoIdList);for (Map<String, Object> objectMap : list) {if (map.get(objectMap.get("fileInfoId")) != null) {LinkedHashMap fileInfoMap = (LinkedHashMap) map.get(objectMap.get("fileInfoId"));objectMap.put("filePath", fileInfoMap.get("filePath") + fileInfoMap.get("fileName").toString());objectMap.put("fileName", fileInfoMap.get("fileName"));objectMap.put("serverPath", fileInfoMap.get("serverPath"));}}}returnBean.setRecords(list);return returnBean;}/*** @param param {@link com.sw.fam.vo.ais.SearchBean} 请求参数* @return ReturnBean {@link com.sw.fam.vo.ais.ReturnBean} 返回结果* @throws IOException 检索服务异常* @description 获取某个索引下面的分类* @create ganquanzhong 2020/09/22*/@Overridepublic ReturnBean queryGroupList(SearchBean param) throws IOException {SearchRequest searchRequest = null;String indexName = param.getClusterName();// 构建SearchRequest检索请求if (indexName == null || "".equals(indexName)) {//查全部searchRequest = new SearchRequest();} else {searchRequest = new SearchRequest(indexName);}// 创建一个SearchSourceBuilder专门用于构建查询条件SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 分组条件时加入的条件,如项目等BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();if (param.getSearchMap() != null && param.getSearchMap().size() > 0) {for (Map.Entry<String, Object> entry : param.getSearchMap().entrySet()) {//判断组织idif ("orgId".equals(entry.getKey())) {String orgIds = CurrentUser.getOrgIds();String newOrgIds = orgIds.replace("'", "");String[] split = newOrgIds.split(",");if (split.length > 0) {boolQueryBuilder.filter(QueryBuilders.termsQuery(entry.getKey(), split));}continue;}//处理条件查询if (entry.getValue() != null && !"".equals(entry.getValue())) {boolQueryBuilder.filter(QueryBuilders.termQuery(entry.getKey(), entry.getValue()));}}}//分组查询封装List searchGroup = IndexEntityVO.getSearchGroupTerm().get(indexName);ReturnBean returnBean = new ReturnBean();List<Map<String, Object>> list = new ArrayList<>();HashMap<String, Object> group = new HashMap<>();if (CollectionUtils.isNotEmpty(searchGroup)) {SearchResponse response = null;Map<String, Aggregation> aggMap = null;ParsedStringTerms stringTerms = null;Iterator<? extends Terms.Bucket> iterator = null;for (int i = 0; i < searchGroup.size(); i++) {//聚合查询AggregationBuilder groupAgg = AggregationBuilders.terms("group_" + searchGroup.get(i)).field(searchGroup.get(i).toString()).size(Integer.MAX_VALUE);sourceBuilder.aggregation(groupAgg).query(boolQueryBuilder);searchRequest.source(sourceBuilder);response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);//处理返回的聚合结果aggMap = response.getAggregations().asMap();if (aggMap != null && aggMap.size() > 0) {stringTerms = (ParsedStringTerms) aggMap.get("group_" + searchGroup.get(i));//将集合转换成迭代器遍历桶iterator = stringTerms.getBuckets().iterator();ArrayList<Map> resultList = new ArrayList<>();while (iterator.hasNext()) {HashMap<String, Object> sourceMap = new HashMap<>();Terms.Bucket bucket = iterator.next();//bucket桶也是一个map对象, 我们取它的key值就可以if (StringUtils.isNotEmpty(bucket.getKeyAsString())) {sourceMap.put("id", bucket.getKeyAsString());resultList.add(sourceMap);}}group.put(searchGroup.get(i) + "List", resultList);}}}list.add(group);returnBean.setRecords(list);return returnBean;}/*** @param code 业务权限code* @return String 检索类型flag* @description 解析业务权限中的code为检索中flag类型* @create ganquanzhong 2020/09/22*/private String parseCode(String code) {String flag = "";if ("FAM_ASS_DIARY".equals(code)) flag = "assDiary";else if ("FAM_ADS_DRILL_DIARY".equals(code)) flag = "adsDiary";else if ("FAM_AES_DIARY_EXPLORATION".equals(code)) flag = "aesExplorationDiary";else if ("FAM_AES_DIARY_TEAM".equals(code)) flag = "aesExplorationDiary";else if ("FAM_ASS_SITE_RECORD".equals(code)) flag = "site";else if ("FAM_ASS_RUINS".equals(code)) flag = "assRuins";else if ("FAM_ADS_RUINS".equals(code)) flag = "adsRuins";else if ("FAM_AES_RUINS".equals(code)) flag = "aesRuins";else if ("FAM_ASS_RELICS".equals(code)) flag = "assRelics";else if ("FAM_ADS_RELICS".equals(code)) flag = "adsRelics";else if ("FAM_AES_RELICS".equals(code)) flag = "aesRelics";else if ("FAM_ADS_SOIL".equals(code)) flag = "adsSoil";else if ("FAM_AES_RELICS_SAMPLE".equals(code)) flag = "aesSample";else if ("FAM_AES_LAYER".equals(code)) flag = "aesLayer";else if ("FAM_ASS_CLUE".equals(code)) flag = "clue";else if ("FAM_ADS_DRILL".equals(code)) flag = "drill";else if ("FAM_AES_EXPLORATION".equals(code)) flag = "exploration";else flag = "file";return flag;}
}

http://chatgpt.dhexx.cn/article/F4tGhAUt.shtml

相关文章

ES-3-高级查询

文章目录 1 深分页Scroll1.1 分页的查询过程1.2 Scroll查询的实现 2 delete-by-query3 ES的复合查询3.1 bool查询3.2 boosting查询 4 filter查询5 高亮查询6 聚合查询6.1 去重计数查询cardinality6.2 范围统计range6.3 统计聚合查询extended_stats 1 深分页Scroll 1.1 分页的查…

Elasticsearch嵌套查询must和mustNot

场景&#xff1a;在bug关联固件的时候将bug的数据放到固件的数据下&#xff0c;可以根据固件数据下是否包含bug数据查询出已关联和未关联的数据。 ES文档结构 目录 1.must查询此bug关联的固件 java代码 2.mustNot查询此bug未关联的固件 java代码 3.劫后余生 4.闲来…

MQ消息

AMQP协议介绍 AMQP&#xff0c;即Advanced Message Queuing Protocol&#xff0c;高级消息队列协议&#xff0c;是应用层协议的一个开放标准&#xff0c;为面向消息的中间件设计。 AMQP的主要特征是面向消息、队列、路由&#xff08;包括点对点和发布/订阅&#xff09;、可靠性…

MQ基础信息mq的简介

MQ 同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&#xff0c;但是你却不能…

MFQ

一什么是MFQ&PPDCS&#xff1f;MFQ&PPDCS是由外部教练邰晓梅提出的一套测试分析和测试设计方法。MFQ将被测对象分层&#xff0c;针对不同层次进行测试分析和设计进行&#xff0c;使测试设计人员不会那么容易忘记一些测试的相关点&#xff08;功能交互、质量属性&#x…

MQ的了解

MQ的了解&#xff1a; 如果进行产品选型 Kafka 优点&#xff1a;吞吐量非常大&#xff0c;性能非常好&#xff0c;集群高可用。 缺点&#xff1a;会丢数据&#xff0c;功能比较单一 使用场景&#xff1a;日志分析、大数据采集 RebbitMQ 优点&#xff1a;消息可靠性高&…

多级反馈队列调度算法(MFQ)

多级反馈队列调度算法是目前公认的较好的一种进程调度算法,它能较好的满足各类进程的需要。 MFQ算法首先设置多个就绪队列。队列的优先级递减,且各队列时间片大小也不同。例如我实现的算法里,设置了3个队列,第一队列优先级>第二队列>第三队列,且后一个队列的时间片大…

从MFQ方法到需求分析

前几天看了一篇性能测试相关的文章&#xff1a;性能测试模型初探及应用方法分析&#xff0c;其中提到了MFQ分析方法。专门去查阅了MFQ相关的一些资料&#xff0c;学习了一番。 之后想起了以前看《Google的软件测试之道》这本书时&#xff0c;书中提到的一种测试分析方法&#x…

nRF24l01无线传输

模块简介&#xff1a; 它是一款工作于2.4GHZ~2.5GHZISM频段&#xff0c;带功放通信距离可达上千米&#xff0c;近距离传输速度可达2Mbps&#xff0c;具有6通道且每通道都有自己的缓冲区&#xff0c;可以同时跟不同的NFR进行通信的无线收发模块。 工作模式&#xff1a;接收模式…

C51- NRF24L01 无线串口模块

1.硬件知识 1.1 nRF24L01的引脚功能 &#xff08;IO方向是相对模块而言的&#xff09; CE&#xff1a;Chip Enable&#xff0c;芯片使能&#xff0c;在发送和接收过程中都要将这个引脚拉高。 IRQ: 低电平触发&#xff0c;当状态寄存器中 TX_DS、RX_DR 或 MAX_RT 为高时触发中断…

NRF24L01+模块实现双向通信(带ACK payload)

本文主要关于NRF24L01 2.4GHz无线模块的应用。 目录 说明模块开发的大致步骤使用方式一、单向通信二、双向通信&#xff08;有应答包(ACK payload))寄存器配置 三、星状组网 注意事项 说明 1、NRF24L01和NRF24L01的区别&#xff0c;前者支持Enhanced ShockBurst™,后者不支持…

2.4G模块NRF24L01调试经验

参照野火STM32程序调试NRF24L01成功&#xff0c;颇获喜感 nRF24L01是一款工作在2.4~2.5GHz世界通用ISM频段的单片无线收发器芯片。无线收发器包括&#xff1a;频率发生器、增强型SchockBurstTM模式控制器、功率放大器、警惕振荡器、调制器、解调器。输出功率、频道选择和协议的…

小体积、高速率的nRF24L01芯片通信模块

在选择纯硬件通信模块时&#xff0c; 面对上述问题&#xff0c;AS01提供了很好的解决办法。 AS01系列模块是工作在2.4GHz(ISM频段)的纯硬件模块。此系列基于NORDIC原装nRF24L01P芯片方案开发&#xff0c;提供多种接口形式&#xff0c;具有高空速&#xff08;最高空速可达到2…

Arduino使用NRF24L01模块进行无线通信

Arduino使用NRF24L01模块进行无线通信 前言 ​ 其实CSDN有很多关于这个无线模块的使用&#xff0c;包括Arduino的使用例程&#xff0c;但是实际自己跟着做一遍的时候还是发现了有些小问题&#xff0c;于是记录一下方便以后做其他有意思的小项目。&#xff08;Arduino的库文件…

nRF24L01--2.4G无线通信模块(1)(51单片机和51单片机通信)

作者&#xff1a;李剀 出处&#xff1a;https://www.cnblogs.com/kevin-nancy/ 或者 https://blog.csdn.net/Kevin_8_Lee/article/details/95667604 欢迎转载&#xff0c;但也请保留上面这段声明。谢谢&#xff01;&#xff08;上面两个都是我的博客&#xff0c;只是在不同平台…

STM32控制NRF24L01无线模块进行通信

一.NRF2401无线模块 1.模块介绍 功能介绍 (1)2.4Ghz 全球开放ISM 频段免许可证使 2) 最高工作速率2Mbps&#xff0c;高效GFSK调制&#xff0c;抗干扰能力强&#xff0c;特别适合工业控制场合 (3)126 频道&#xff0c;满足多点通信和跳频通信需要 (4) 内置硬件CRC 检错和点对…

NRF24L012.4G模块

文章目录 datasheet1. 相关案例&#xff1a;2. nRF24L01通信的常识1. 发送模式。1.5 补充spi一点知识1. SPI读写时序2. 工作模式2.1 收发模式Enhanced ShockBurstTM收发模式Enhanced ShockBurstTM发送流程&#xff1a;Enhanced ShockBurstTM接收流程&#xff1a; 3. SPI指令 3.…

STM32驱动NRF24L01无线模块

目录 一、模块简介二、工作模式三、主要命令四、配置寄存器五、状态寄存器六、接收模式七、发送模式八、STM32使用NRF24L01模块 一、模块简介 NRF24L01是NORDIC公司生产的一款无线通信芯片&#xff0c;采用FSK调制&#xff0c;内部集成NORDIC自己的Enhanced Short Burst 协议&…

nRF24L01无线模块笔记

nRF24L01模块 官网链接: https://www.nordicsemi.com/Products/nRF24-series 常见的无线收发模块, 工作在2.4GHz频段, 适合近距离遥控和数据传输. nRF24L01是一个能兼顾距离和数据速率的无线模块, 在空旷环境下&#xff0c;2M速率15米, 1M速率30米, 250K速率能达到50米. 和蓝牙…

NRF24L01+模块:一对一双向通信,成功!

查找了很多资料&#xff0c;好多都是复制粘贴转发&#xff0c;或者安装英文手册直译的&#xff08;比如我自己上篇笔记&#xff0c;&#xff0c;&#xff09;&#xff0c;看完还是一脸懵逼&#xff0c;没几个可行的&#xff0c;推荐几个比较实在的资料&#xff1a;手册我也不是…