提交 df3fd5e5 作者: 925993793@qq.com

【fix】资讯列表增加高级检索条件

上级 5e9045ca
package com.zzsn.event.es;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.net.URLDecoder;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.base.Charsets;
import com.zzsn.event.constant.Constants;
import com.zzsn.event.entity.Event;
import com.zzsn.event.entity.Subject;
import com.zzsn.event.service.*;
import com.zzsn.event.util.DateUtil;
import com.zzsn.event.util.EsDateUtil;
import com.zzsn.event.util.EsIndexUtil;
import com.zzsn.event.util.tree.Node;
import com.zzsn.event.vo.*;
import com.zzsn.event.vo.es.DisplayInfo;
import com.zzsn.event.vo.es.Label;
import com.zzsn.event.vo.es.SpecialInformation;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.apache.commons.lang3.StringUtils;
import org.apache.lucene.search.join.ScoreMode;
import org.elasticsearch.action.search.SearchRequest;
......@@ -657,6 +660,11 @@ public class EsService {
} else {
boolQuery.must(QueryBuilders.termQuery("sid", eventDataCondition.getSourceId()));
}
//高级查询数据处理
BoolQueryBuilder superQuery = buildSuperQuery(eventDataCondition.getSuperQueryMatchType(), eventDataCondition.getSuperQueryParams());
if (superQuery != null) {
boolQuery.must(superQuery);
}
if (StringUtils.isNotEmpty(eventDataCondition.getOrigin())) {
boolQuery.must(QueryBuilders.matchPhraseQuery("origin", eventDataCondition.getOrigin()));
}
......@@ -1846,6 +1854,11 @@ public class EsService {
}
}
}
//高级查询数据处理
BoolQueryBuilder superQuery = buildSuperQuery(searchCondition.getSuperQueryMatchType(), searchCondition.getSuperQueryParams());
if (superQuery != null) {
boolQuery.must(superQuery);
}
List<SearchWordVO> searchWordList = searchCondition.getSearchWordList();
//研究中心 搜索词方式
if (CollectionUtils.isNotEmpty(searchWordList)) {
......@@ -2258,4 +2271,111 @@ public class EsService {
}
}
}
/**
* 高级检索条件封装
*
* @param superQueryMatchType 规则
* @param superQueryParams 条件(url转码后的json)
* @author lkg
* @date 2025/3/13
*/
private BoolQueryBuilder buildSuperQuery(String superQueryMatchType, String superQueryParams) {
if (StringUtils.isNotEmpty(superQueryParams)) {
try {
BoolQueryBuilder superBuilder = QueryBuilders.boolQuery();
String params = URLDecoder.decode(superQueryParams, Charsets.UTF_8);
JSONArray array = JSON.parseArray(params);
for (int i = 0; i < array.size(); i++) {
JSONObject item = array.getJSONObject(i);
BoolQueryBuilder builder2 = QueryBuilders.boolQuery();
String type = item.getString("type");
String rule = item.getString("rule");
String field = item.getString("field");
String val = item.getString("val");
if ("date".equals(type)) {
//日期类型处理
if ("eq".equals(rule)) {
builder2.must(QueryBuilders.rangeQuery(field).from(val + "T00:00:00").to(val + "T23:59:59"));
}
if ("ne".equals(rule)) {
builder2.mustNot(QueryBuilders.rangeQuery(field).from(val + "T00:00:00").to(val + "T23:59:59"));
} else if ("gt".equals(rule)) {
builder2.must(QueryBuilders.rangeQuery(field).from((val + "T23:59:59")));
} else if ("ge".equals(rule)) {
builder2.must(QueryBuilders.rangeQuery(field).from((val + "T00:00:00")));
} else if ("lt".equals(rule)) {
builder2.must(QueryBuilders.rangeQuery(field).to((val + "T00:00:00")));
} else if ("le".equals(rule)) {
builder2.must(QueryBuilders.rangeQuery(field).to((val + "T23:59:59")));
}
} else if ("list".equals(type)) {
//列表(数组)类查询
if ("eq".equals(rule)) {
builder2.must(QueryBuilders.termQuery(field + ".keyword", val));
} else if ("ne".equals(rule)) {
builder2.mustNot(QueryBuilders.termQuery(field + ".keyword", val));
} else if ("in".equals(rule)) {
builder2.must(QueryBuilders.termsQuery(field + ".keyword", val.split(" |\\+|,|,|;|;")));
} else if ("not_in".equals(rule)) {
builder2.mustNot(QueryBuilders.termsQuery(field + ".keyword", val.split(" |\\+|,|,|;|;")));
} else if ("keyWordsGroup".equals(rule)) {
if (StringUtils.isNotEmpty(val)) {
BoolQueryBuilder wordAllBoolQuery = QueryBuilders.boolQuery();
String[] andWords = val.split("\\+");
for (String words : andWords) {
String replace = words.replace("(", "").replace(")", "");
BoolQueryBuilder wordOrBoolQuery = QueryBuilders.boolQuery();
for (String word : replace.split("\\|")) {
wordOrBoolQuery.should(QueryBuilders.termQuery(field + ".keyword", word));
}
wordAllBoolQuery.must(wordOrBoolQuery);
}
builder2.must(wordAllBoolQuery);
}
}
} else if ("string".equals(type)) {
//文本类查询
if ("eq".equals(rule)) {
builder2.must(QueryBuilders.termQuery(field + ".keyword", val));
} else if ("ne".equals(rule)) {
builder2.mustNot(QueryBuilders.termQuery(field + ".keyword", val));
} else if ("in".equals(rule)) {
builder2.must(QueryBuilders.termsQuery(field + ".keyword", val.split(" |\\+|,|,|;|;")));
} else if ("not_in".equals(rule)) {
builder2.mustNot(QueryBuilders.termsQuery(field + ".keyword", val.split(" |\\+|,|,|;|;")));
} else if ("like".equals(rule)) {
builder2.must(QueryBuilders.matchPhrasePrefixQuery(field, val));
} else if ("not_like".equals(rule)) {
builder2.mustNot(QueryBuilders.matchPhrasePrefixQuery(field, val));
} else if ("keyWordsGroup".equals(rule)) {
if (StringUtils.isNotEmpty(val)) {
BoolQueryBuilder wordAllBoolQuery = QueryBuilders.boolQuery();
String[] andWords = val.split("\\+");
for (String words : andWords) {
String replace = words.replace("(", "").replace(")", "");
BoolQueryBuilder wordOrBoolQuery = QueryBuilders.boolQuery();
for (String word : replace.split("\\|")) {
wordOrBoolQuery.should(QueryBuilders.matchPhraseQuery(field, word));
}
wordAllBoolQuery.must(wordOrBoolQuery);
}
builder2.must(wordAllBoolQuery);
}
}
}
if ("or".equals(superQueryMatchType)) {
superBuilder.should(builder2);
} else {
superBuilder.must(builder2);
}
}
return superBuilder;
} catch (Exception e) {
log.error("高级查询条件封装失败,e:{},params:{}", e.getMessage(), superQueryParams);
}
}
return null;
}
}
......@@ -87,6 +87,12 @@ public class InfoDataSearchCondition {
private String sourceId;
//搜索词信息集合-研究中心
private List<SearchWordVO> searchWordList;
/*------高级查询条件---start-------------------*/
//规则
private String superQueryMatchType;
//条件(url转码后的json)
private String superQueryParams;
/*------高级查询条件---end-------------------*/
//数据集id,保存数据集时使用-研究中心
private String dataSetId;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论