44 changed files with 757 additions and 3597 deletions
-
6cl_query_data_job/src/main/java/com/bfd/mf/job/domain/repository/SubjectCountRepository.java
-
14cl_query_data_job/src/main/java/com/bfd/mf/job/domain/repository/TaskRepository.java
-
2cl_query_data_job/src/main/java/com/bfd/mf/job/download/DownLoadFile.java
-
22cl_query_data_job/src/main/java/com/bfd/mf/job/service/alarm/AlarmService.java
-
13cl_query_data_job/src/main/java/com/bfd/mf/job/service/es/EsQueryMiniService.java
-
7cl_query_data_job/src/main/java/com/bfd/mf/job/service/query/QueryService.java
-
29cl_query_data_job/src/main/java/com/bfd/mf/job/service/statistics/StatisticsService.java
-
206cl_query_data_job/src/main/java/com/bfd/mf/job/service/statistics/TotalCountService.java
-
12cl_query_data_job/src/main/java/com/bfd/mf/job/util/EMailUtils.java
-
7cl_query_data_job/src/main/java/com/bfd/mf/job/worker/AlarmProducer.java
-
105cl_query_data_job/src/main/resources/application-0827.yml
-
17cl_query_data_job/src/main/resources/application-113.yml
-
23cl_query_data_job/src/main/resources/application.yml
-
4cl_search_api/cl_search_api.iml
-
14cl_search_api/pom.xml
-
6cl_search_api/src/main/java/com/bfd/mf/common/service/cache/TopicQueryService.java
-
2cl_search_api/src/main/java/com/bfd/mf/common/service/es/EsQueryAuthorCountService.java
-
103cl_search_api/src/main/java/com/bfd/mf/common/service/es/EsQueryServiceForSQMini.java
-
3cl_search_api/src/main/java/com/bfd/mf/common/service/es/SubjectQueryDataService.java
-
64cl_search_api/src/main/java/com/bfd/mf/common/util/OperatorUtil.java
-
18cl_search_api/src/main/java/com/bfd/mf/common/util/ZipUtils.java
-
26cl_search_api/src/main/java/com/bfd/mf/common/util/constants/ESConstant.java
-
8cl_search_api/src/main/java/com/bfd/mf/common/util/enums/RTCodeEnum.java
-
22cl_search_api/src/main/java/com/bfd/mf/common/util/es/EsUtils.java
-
2cl_search_api/src/main/java/com/bfd/mf/common/util/es/MonitorUtils.java
-
12cl_search_api/src/main/java/com/bfd/mf/common/util/slice/SliceScrollUtil.java
-
360cl_search_api/src/main/java/com/bfd/mf/common/util/spread/SpreadServiceUtil.java
-
1042cl_search_api/src/main/java/com/bfd/mf/common/util/subject/ExpNodeUtil.java
-
911cl_search_api/src/main/java/com/bfd/mf/common/util/subject/ExpressionParser.java
-
669cl_search_api/src/main/java/com/bfd/mf/common/util/subject/QueryBuilderUtil.java
-
3cl_search_api/src/main/java/com/bfd/mf/common/web/vo/params/QueryRequest.java
-
37cl_search_api/src/main/java/com/bfd/mf/controller/SearchAnalysisController.java
-
48cl_search_api/src/main/java/com/bfd/mf/controller/SearchAuthorController.java
-
46cl_search_api/src/main/java/com/bfd/mf/controller/SearchDataController.java
-
123cl_search_api/src/main/java/com/bfd/mf/controller/UploadExcelController.java
-
31cl_search_api/src/main/java/com/bfd/mf/service/SearchAnalysisService.java
-
106cl_search_api/src/main/java/com/bfd/mf/service/SearchAuthorService.java
-
128cl_search_api/src/main/java/com/bfd/mf/service/SearchDataService.java
-
3cl_search_api/src/main/java/com/bfd/mf/service/SearchKeywordsCouldService.java
-
10cl_search_api/src/main/java/com/bfd/mf/service/UpdateService.java
-
33cl_search_api/src/main/java/com/bfd/mf/service/UploadExcelService.java
-
7cl_search_api/src/main/resources/application.yml
-
18cl_search_api/src/main/resources/log4j.properties
-
32cl_search_api/src/main/resources/log4j2.properties
@ -0,0 +1,105 @@ |
|||
debug: false |
|||
|
|||
logging: |
|||
level: |
|||
com.bfd.mf: debug |
|||
spring: |
|||
datasource: |
|||
driver-class-name: com.mysql.jdbc.Driver |
|||
username: root |
|||
password: bfd123 |
|||
url: jdbc:mysql://172.26.11.113:3306/intelligent_crawl?useOldAliasMetadataBehavior=true&characterEncoding=UTF-8&zeroDateTimeBehavior=round |
|||
hikari: |
|||
maximum-pool-size: 10 |
|||
minimum-idle: 1 |
|||
#spring: |
|||
# datasource: |
|||
# driver-class-name: com.mysql.jdbc.Driver |
|||
# username: root |
|||
# password: Bfd123!@# |
|||
# url: jdbc:mysql://172.18.1.134:3306/intelligent_crawl?useOldAliasMetadataBehavior=true&characterEncoding=UTF-8&zeroDateTimeBehavior=round |
|||
# hikari: |
|||
# maximum-pool-size: 10 |
|||
# minimum-idle: 1 |
|||
#spring: |
|||
# datasource: |
|||
# driver-class-name: com.mysql.jdbc.Driver |
|||
# username: root |
|||
# password: Bfd123!@# |
|||
# url: jdbc:mysql://172.18.1.134:3306/all_task?useOldAliasMetadataBehavior=true&characterEncoding=UTF-8&zeroDateTimeBehavior=round |
|||
# hikari: |
|||
# maximum-pool-size: 10 |
|||
# minimum-idle: 1 |
|||
|
|||
|
|||
worker: |
|||
version: 3.0.1 |
|||
enable-test: false |
|||
test-thread-count: 10 |
|||
test-task-id: 180 |
|||
## 数据默认要写的 kafka |
|||
broker-list: 172.18.1.113:9092 |
|||
send-topic : databasestokafka |
|||
analysis-topic: |
|||
- sq_topic_cl_query_analysis_1 |
|||
|
|||
analysis-group: sq_group_cl_analysis_1 |
|||
## 服务的状态,true 为启动 |
|||
enable-analysis-producer: false # 查ES写kafka |
|||
enable-analysis-consumer: false # 读kafka写ES |
|||
enable-statistics-producer: true # 统计 taskCount 和 subjectCount (采集平台) |
|||
enable-query-producer: false # 离线拉数(采集平台) |
|||
enable-backtrace-producer: false # 欧莱雅查数(采集平台,欧莱雅项目独用) |
|||
enable-rw-oly-producer: false # 欧莱雅数据导出,暂时不用 |
|||
enable-up-load-producer: false # 上传(采集平台) |
|||
enable-output-producer: false #未开发,暂留 |
|||
enable-taskcount-producer: false # 任务数量的统计,任务量和任务平均时长(运营后台) |
|||
enable-alarm-producer: false # 报警,查ES统计报警发邮件写数据库(运营后台) |
|||
## 启动服务的线程数 |
|||
statistics-producer-thread-count: 1 |
|||
query-producer-thread-count: 10 |
|||
backtrace-producer-thread-count: 1 |
|||
rw-oly-producer-thread-count: 1 |
|||
up-load-producer-thread-count: 1 |
|||
output-producer-thread-count: 1 |
|||
taskcount-producer-thread-count: 1 |
|||
alarm-producer-thread-count: 1 |
|||
|
|||
period-s: 5 |
|||
interval-time: 1800000 |
|||
# 拉数年份查询的开始时间,现在是19年之前的合并成年了,这个时间就是:2019-01-01 00:00:00 |
|||
query-data-year-starttime: 1546272000000 |
|||
|
|||
rule-rest: http://rule.sq.baifendian.com/data_match/content/ |
|||
comment-rest: http://rule.sq.baifendian.com/reputation/addReputationTask |
|||
rule-rest-concurrency: 500 |
|||
content-limit: 2000 |
|||
failure-upper: 2000 |
|||
|
|||
goFastPostUrl : http://172.18.1.113:8080/upload |
|||
goFastDomain : http://172.18.1.113:8080 |
|||
uploadOLYExcelPath : /opt/nfsdata/excelTask/ |
|||
uploadZipPath : /opt/nfsdata/uploadFiles/ |
|||
indexNamePre : cl_major_ |
|||
|
|||
es-normal: |
|||
name: SQ_Normal_new |
|||
address: 172.18.1.134:9301 |
|||
upper: 2000-01-01 |
|||
standby: cl_index_0 |
|||
es-reply-source: |
|||
name: SQ_Mini_new |
|||
address: 172.18.1.148:9303 |
|||
upper: 2000-01-01 |
|||
standby: cl_index_0 |
|||
es-mini: |
|||
name: SQ_Mini |
|||
address: 172.18.1.147:9313 |
|||
bulk-thread-count: 5 |
|||
bulk-rate: 3 |
|||
bulk-size: 100 |
|||
es-logstash: |
|||
name: SQ_Log |
|||
address: 172.26.11.111:9301 |
|||
upper: 2021-01-01 |
|||
standby: logstash-2021.05.13 |
|||
@ -1,64 +0,0 @@ |
|||
package com.bfd.mf.common.util; |
|||
|
|||
import java.util.ArrayList; |
|||
import java.util.Arrays; |
|||
import java.util.List; |
|||
|
|||
|
|||
public class OperatorUtil { |
|||
private static final Character[] seps = new Character[] { '&', '|', '~', '<', '《', '>', '》', '(', '(', ')', ')', |
|||
',', ',', '"', '“', '”' };// 分隔符,将整个表达式分隔成若干个子串进行处理 |
|||
private static final Character[] ops = new Character[] { '&', '|', '~' };// 去掉'!' |
|||
public static final List<Character> operators = new ArrayList<Character>(); |
|||
public static final List<Character> seperators = new ArrayList<Character>(); |
|||
|
|||
static { |
|||
operators.addAll(Arrays.asList(ops)); |
|||
seperators.addAll(Arrays.asList(seps)); |
|||
} |
|||
|
|||
public static boolean isOperator(char c) { |
|||
return operators.contains(c); |
|||
} |
|||
|
|||
|
|||
public static boolean isSeperator(char c) { |
|||
return seperators.contains(c); |
|||
} |
|||
|
|||
|
|||
public static int priorityCompare(char op1, char op2) { |
|||
// ()>!>&>| |
|||
switch (op1) { |
|||
case '!': |
|||
case '!': |
|||
return op2 == '(' || op2 == ')' ? -1 : 1; |
|||
case '&': |
|||
return op2 == '!' ? -1 : (op2 == '|' ? 1 : 0); |
|||
case '|': |
|||
return op2 == '|' ? 0 : -1; |
|||
} |
|||
return 0; |
|||
} |
|||
|
|||
|
|||
public static boolean matchChar(char c, char c2) { |
|||
switch (c) { |
|||
case '(': |
|||
case '(': |
|||
return c2 == ')' || c2 == ')'; |
|||
case ')': |
|||
case ')': |
|||
return c2 == '(' || c2 == '('; |
|||
case '>': |
|||
case '》': |
|||
return c2 == '<' || c2 == '《'; |
|||
case '<': |
|||
case '《': |
|||
return c2 == '>' || c2 == '》'; |
|||
default: |
|||
break; |
|||
} |
|||
return false; |
|||
} |
|||
} |
|||
@ -1,360 +0,0 @@ |
|||
package com.bfd.mf.common.util.spread; |
|||
|
|||
import com.alibaba.fastjson.JSONObject; |
|||
import com.bfd.mf.common.util.enums.SpreadEnums; |
|||
import com.bfd.mf.common.util.utility.DateUtil; |
|||
import com.bfd.nlp.common.util.object.TObjectUtils; |
|||
import org.apache.commons.lang3.StringUtils; |
|||
import org.slf4j.Logger; |
|||
import org.slf4j.LoggerFactory; |
|||
|
|||
import java.util.*; |
|||
import java.util.regex.Matcher; |
|||
import java.util.regex.Pattern; |
|||
|
|||
public class SpreadServiceUtil { |
|||
private static final Logger logger = LoggerFactory.getLogger(SpreadServiceUtil.class); |
|||
|
|||
private static final Long ONE_DAY = 24 * 60 * 60 * 1000L; |
|||
private static final Long ONE_HOUR = 60 * 60 * 1000L; |
|||
// static { |
|||
// try { |
|||
// while (!ApplicationUtil.initialFinsih) { |
|||
// logger.warn("[SpreadServiceUtil Initial] AbsSpringServiceHolder: Wait spring content initialization, sleep 1s..."); |
|||
// Thread.sleep(1000); |
|||
// } |
|||
// |
|||
// oemUrlCommonService = ApplicationUtil.getApplicationContext().getBean(OemUrlCommonService.class); |
|||
// bfdApiConfig = ApplicationUtil.getApplicationContext().getBean(BFDApiConfig.class); |
|||
// |
|||
// if (TObjectUtils.isNull(oemUrlCommonService)) { |
|||
// throw new Exception("oemUrlCommonService is null"); |
|||
// } |
|||
// |
|||
// } catch (Exception e) { |
|||
// logger.error("[SpreadServiceUtil Initial] Object {} is NULL", e.getMessage(), e); |
|||
// System.exit(-1); |
|||
// } |
|||
// } |
|||
|
|||
/** |
|||
* 获取三个月前的起始时间 |
|||
*/ |
|||
public static Long getTimeOfThreeMonthsAgo(Long time) { |
|||
if (TObjectUtils.isNull(time)) { |
|||
time = System.currentTimeMillis(); |
|||
} |
|||
|
|||
Date endDate = new Date(time); |
|||
Calendar calendar = Calendar.getInstance(); |
|||
calendar.setTime(endDate); |
|||
calendar.add(Calendar.MONTH, -3); |
|||
calendar.set(Calendar.DAY_OF_MONTH, 1); |
|||
calendar.set(Calendar.HOUR_OF_DAY, 0); |
|||
calendar.set(Calendar.MINUTE, 0); |
|||
calendar.set(Calendar.SECOND, 0); |
|||
calendar.set(Calendar.MILLISECOND, 0); |
|||
logger.info("[SpreadServiceUtil] getTimeOfThreeMonthsAgo: result is {}", calendar.getTime()); |
|||
return calendar.getTimeInMillis(); |
|||
} |
|||
|
|||
private static Long getEndTime(Long time, Integer type) { |
|||
Long startTime; |
|||
if (type.equals(SpreadEnums.TREND.UNIT_HOUR)) { |
|||
startTime = getEndTimeOfHour(time); |
|||
} else { |
|||
startTime = getEndTimeOfDay(time); |
|||
} |
|||
return startTime; |
|||
} |
|||
|
|||
private static Long getEndTimeOfDay(Long time) { |
|||
Calendar calendar = Calendar.getInstance(); |
|||
calendar.setTimeInMillis(time); |
|||
calendar.set(Calendar.HOUR_OF_DAY, 23); |
|||
calendar.set(Calendar.MINUTE, 59); |
|||
calendar.set(Calendar.SECOND, 59); |
|||
calendar.set(Calendar.MILLISECOND, 999); |
|||
return calendar.getTimeInMillis(); |
|||
} |
|||
|
|||
private static Long getEndTimeOfHour(Long time) { |
|||
Calendar calendar = Calendar.getInstance(); |
|||
calendar.setTimeInMillis(time); |
|||
calendar.set(Calendar.MINUTE, 59); |
|||
calendar.set(Calendar.SECOND, 59); |
|||
calendar.set(Calendar.MILLISECOND, 999); |
|||
return calendar.getTimeInMillis(); |
|||
} |
|||
|
|||
public static Long[] getTimeList1(Long startTime, Long endTime, Integer type) { |
|||
Long[] timeList = null; |
|||
try { |
|||
Long interval; |
|||
if (type.equals(SpreadEnums.TREND.UNIT_HOUR)) { |
|||
interval = ONE_HOUR; |
|||
} else if (type.equals(SpreadEnums.TREND.UNIT_DAY)) { |
|||
interval = ONE_DAY; |
|||
} else { |
|||
throw new Exception(" !!! type is illegal !!!"); |
|||
} |
|||
Double intervalNum = Math.ceil((endTime - startTime) / (double) interval); |
|||
timeList = new Long[intervalNum.intValue() + 1]; |
|||
Long time = startTime; |
|||
for (int i = 0; i < intervalNum.intValue(); i++) { |
|||
timeList[i] = time; |
|||
time += interval; |
|||
} |
|||
timeList[intervalNum.intValue()] = endTime; |
|||
|
|||
logger.info("[SpreadServiceUtil] getTimeList: startTime is {}, endTime is {}, timeList is {}", startTime, endTime, timeList); |
|||
} catch (Exception e) { |
|||
logger.error("[SpreadServiceUtil] getTimeList: failed, startTime is {}, endTime is {}, timeList is {}, error is ", startTime, endTime, timeList, e); |
|||
} |
|||
return timeList; |
|||
} |
|||
|
|||
public static Long[] getTimeList2(Long startTime, Long endTime, Integer type) { |
|||
Long[] timeList = null; |
|||
try { |
|||
Long interval; |
|||
if (type.equals(SpreadEnums.TREND.UNIT_HOUR)) { |
|||
interval = ONE_HOUR; |
|||
} else if (type.equals(SpreadEnums.TREND.UNIT_DAY)) { |
|||
interval = ONE_DAY; |
|||
} else { |
|||
throw new Exception(" !!! type is illegal !!!"); |
|||
} |
|||
|
|||
List<Long> timeListTemp = new ArrayList<>(); |
|||
timeListTemp.add(startTime); |
|||
|
|||
if (startTime.equals(endTime)) { |
|||
timeList = new Long[timeListTemp.size()]; |
|||
return timeListTemp.toArray(timeList); |
|||
} |
|||
|
|||
Long endTimeOfStart = getEndTime(endTime, type); |
|||
if (endTimeOfStart >= endTime) { |
|||
timeListTemp.add(endTime); |
|||
timeList = new Long[timeListTemp.size()]; |
|||
return timeListTemp.toArray(timeList); |
|||
} |
|||
for (long time = endTimeOfStart + interval; time < endTime; time += interval) { |
|||
timeListTemp.add(time); |
|||
} |
|||
timeListTemp.add(endTime); |
|||
timeList = new Long[timeListTemp.size()]; |
|||
timeListTemp.toArray(timeList); |
|||
|
|||
logger.info("[SpreadServiceUtil] getTimeList: startTime is {}, endTime is {}, timeList is {}", startTime, endTime, timeList); |
|||
} catch (Exception e) { |
|||
logger.error("[SpreadServiceUtil] getTimeList: failed, startTime is {}, endTime is {}, timeList is {}, error is ", startTime, endTime, timeList, e); |
|||
} |
|||
return timeList; |
|||
} |
|||
|
|||
/** |
|||
* 将Long型时间序列列表转换为String型列表 |
|||
*/ |
|||
public static String[] convertToTimeStringList(Long[] timeList, Integer type) { |
|||
String[] timeStringList = new String[timeList.length]; |
|||
try { |
|||
String dateFormat; |
|||
if (Objects.equals(type, SpreadEnums.TREND.UNIT_HOUR)) { |
|||
dateFormat = DateUtil.TIME_FORMAT; |
|||
} else if (Objects.equals(type, SpreadEnums.TREND.UNIT_DAY)) { |
|||
dateFormat = DateUtil.DATE_FORMAT; |
|||
} else { |
|||
throw new Exception(" !!! type is illegal !!!"); |
|||
} |
|||
|
|||
for (int i = 0; i < timeList.length; i++) { |
|||
timeStringList[i] = DateUtil.parseDateByFormat(timeList[i], dateFormat); |
|||
} |
|||
} catch (Exception e) { |
|||
logger.error("[SpreadServiceUtil] getTimeStringList: failed, timeList is {}, error is ", Arrays.asList(timeStringList), e); |
|||
} |
|||
return timeStringList; |
|||
} |
|||
|
|||
|
|||
// public static List<Map<String,Object>> convertToTimeStringList(List<Map<String,Object>> trendList,Long[] timeList, Integer type) { |
|||
// String[] timeStringList = new String[timeList.length]; |
|||
// try { |
|||
// String dateFormat; |
|||
// if (Objects.equals(type, SpreadEnums.TREND.UNIT_HOUR)) { |
|||
// dateFormat = DateUtil.TIME_FORMAT; |
|||
// } else if (Objects.equals(type, SpreadEnums.TREND.UNIT_DAY)) { |
|||
// dateFormat = DateUtil.DATE_FORMAT; |
|||
// } else { |
|||
// throw new Exception(" !!! type is illegal !!!"); |
|||
// } |
|||
// |
|||
// for (int i = 0; i < timeList.length; i++) { |
|||
// Map<String,Object> map = new HashMap<>(); |
|||
// timeStringList[i] = DateUtil.parseDateByFormat(timeList[i], dateFormat); |
|||
// map.put("name",timeStringList[i]); |
|||
// trendList.add(map); |
|||
// } |
|||
// } catch (Exception e) { |
|||
// logger.error("[SpreadServiceUtil] getTimeStringList: failed, timeList is {}, error is ", Arrays.asList(timeStringList), e); |
|||
// } |
|||
// // return timeStringList; |
|||
// return trendList; |
|||
// } |
|||
|
|||
|
|||
/** |
|||
* 构造list搜索返回值 |
|||
*/ |
|||
public static JSONObject getSearchListData(List<JSONObject> spreadList, Integer totalNum, Integer limit) { |
|||
JSONObject data = new JSONObject(); |
|||
Double pageNum = 0d; |
|||
try { |
|||
pageNum = Math.ceil((double) totalNum / limit); |
|||
} catch (Exception e) { |
|||
logger.error("[SpreadServiceUtil] getSearchListData: failed, spreadList is {}, limit is {}, error is ", |
|||
spreadList, limit, e); |
|||
} |
|||
data.put("totalNum", totalNum); |
|||
data.put("pageNum", pageNum.intValue()); |
|||
data.put("spreadList", spreadList); |
|||
return data; |
|||
} |
|||
|
|||
/** |
|||
* 精确过滤 |
|||
*/ |
|||
public static Boolean accurateSearchResult(JSONObject spread, String field, String text) { |
|||
if (spread.containsKey(field) && spread.getString(field).equals(text)) { |
|||
return true; |
|||
} |
|||
return false; |
|||
} |
|||
|
|||
/** |
|||
* 关键词过滤 |
|||
*/ |
|||
public static Boolean searchResult(JSONObject spread, String field, String text) { |
|||
if (spread.containsKey(field) && spread.getString(field).contains(text)) { |
|||
return true; |
|||
} |
|||
return false; |
|||
} |
|||
|
|||
/** |
|||
* 按照指定排序规则排序 |
|||
*/ |
|||
public static List<JSONObject> sortBySortFlag(List<JSONObject> spreadList, String sortFlag) { |
|||
logger.info("[SpreadServiceUtil] sortBySortFlag: -排序前-spreadList is {}, sortFlag is {}", spreadList, sortFlag); |
|||
try { |
|||
if (sortFlag.equals(SpreadEnums.SORT_TYPE.PUBTIME_DESC_SORT_FLAG.getValue())) { |
|||
// 按时间倒序 |
|||
Collections.sort(spreadList, new Comparator<JSONObject>() { |
|||
@Override |
|||
public int compare(JSONObject o1, JSONObject o2) { |
|||
// 发布时间相同的,则再看采集时间 |
|||
return o2.getLong(SpreadEnums.LIST.SPREAD_FIELD_PUBTIME).compareTo(o1.getLong(SpreadEnums.LIST.SPREAD_FIELD_PUBTIME)) == 0 ? |
|||
o2.getLong(SpreadEnums.LIST.SPREAD_FIELD_CRAWLTIME).compareTo(o1.getLong(SpreadEnums.LIST.SPREAD_FIELD_CRAWLTIME)) : |
|||
o2.getLong(SpreadEnums.LIST.SPREAD_FIELD_PUBTIME).compareTo(o1.getLong(SpreadEnums.LIST.SPREAD_FIELD_PUBTIME)); |
|||
} |
|||
}); |
|||
} |
|||
if (sortFlag.equals(SpreadEnums.SORT_TYPE.PUBTIME_ASC_SORT_FLAG.getValue())) { |
|||
// 按时间正序 |
|||
Collections.sort(spreadList, new Comparator<JSONObject>() { |
|||
@Override |
|||
public int compare(JSONObject o1, JSONObject o2) { |
|||
// 发布时间相同的,则再看采集时间 |
|||
return o1.getLong(SpreadEnums.LIST.SPREAD_FIELD_PUBTIME).compareTo(o2.getLong(SpreadEnums.LIST.SPREAD_FIELD_PUBTIME)) == 0 ? |
|||
o1.getLong(SpreadEnums.LIST.SPREAD_FIELD_CRAWLTIME).compareTo(o2.getLong(SpreadEnums.LIST.SPREAD_FIELD_CRAWLTIME)) : |
|||
o1.getLong(SpreadEnums.LIST.SPREAD_FIELD_PUBTIME).compareTo(o2.getLong(SpreadEnums.LIST.SPREAD_FIELD_PUBTIME)); |
|||
} |
|||
}); |
|||
} |
|||
logger.info("[SpreadServiceUtil] sortBySortFlag: -排序后-spreadList is {}, sortFlag is {}", spreadList, sortFlag); |
|||
} catch (Exception e) { |
|||
logger.error("[SpreadServiceUtil] sortBySortFlag: failed, spreadList is {}, error is ", spreadList, e); |
|||
} |
|||
return spreadList; |
|||
} |
|||
|
|||
/** |
|||
* 获取指定页面list |
|||
*/ |
|||
public static List<JSONObject> getPage(List<JSONObject> spreadList, Integer start, Integer limit) { |
|||
List<JSONObject> pageList = new ArrayList<>(); |
|||
try { |
|||
if (start >= spreadList.size()) { |
|||
return pageList; |
|||
} |
|||
|
|||
int end = spreadList.size() >= start + limit ? start + limit : spreadList.size(); |
|||
pageList = spreadList.subList(start, end); |
|||
} catch (Exception e) { |
|||
logger.error("[SpreadServiceUtil] getPage: failed, spreadList is {}, " + |
|||
"start is {}, limit is {}, error is ", spreadList, start, limit, e); |
|||
} |
|||
return pageList; |
|||
} |
|||
|
|||
/** |
|||
* 去除括号及括号内的内容 |
|||
*/ |
|||
private static String removeBrackets(String value) { |
|||
logger.info("[SpreadServiceUtil] removeBrackets: value is {}", value); |
|||
try { |
|||
// 中文括号修正为英文括号 |
|||
value = value.trim().replaceAll("(", "(").replaceAll(")", ")"); |
|||
Pattern pattern = Pattern.compile("\\((.*?)\\)"); //英文括号 |
|||
Matcher matcher = pattern.matcher(value); |
|||
while (matcher.find()) { |
|||
value = value.replaceAll(matcher.group(0), ""); // 0是包括括号, 1是只取内容 |
|||
logger.info("[SpreadServiceUtil] removeBrackets: value is {}, remove string is {}", value, matcher.group(1)); |
|||
} |
|||
value = value.trim().replaceAll("\\(", "").replaceAll("\\)", ""); |
|||
logger.info("[SpreadServiceUtil] removeBrackets: result value is {}", value); |
|||
} catch (Exception e) { |
|||
logger.error("[SpreadServiceUtil] removeBrackets: failed, value is {}, error is ", value, e); |
|||
} |
|||
return value; |
|||
} |
|||
|
|||
/** |
|||
* 过滤所有以"<"开头以">"结尾的标签 |
|||
*/ |
|||
private static String filterHtml(String value) { |
|||
logger.info("[SpreadServiceUtil] filterHtml: value is {}", value); |
|||
try { |
|||
String regxpForHtml = "<([^>]*)>"; // 过滤所有以<开头以>结尾的标签 |
|||
Pattern pattern = Pattern.compile(regxpForHtml); |
|||
Matcher matcher = pattern.matcher(value); |
|||
StringBuffer sb = new StringBuffer(); |
|||
while (matcher.find()) { |
|||
matcher.appendReplacement(sb, ""); |
|||
} |
|||
matcher.appendTail(sb); |
|||
logger.info("[SpreadServiceUtil] filterHtml: result value is {}", sb.toString()); |
|||
return sb.toString(); |
|||
} catch (Exception e) { |
|||
logger.error("[SpreadServiceUtil] filterHtml: failed, value is {}, error is ", value, e); |
|||
} |
|||
return value; |
|||
} |
|||
|
|||
/** |
|||
* 过滤特殊字符 |
|||
*/ |
|||
public static String filter(String value) { |
|||
// 合法性过滤 |
|||
if (StringUtils.isEmpty(value) || SpreadEnums.OriginalSource.illegal.contains(value.toLowerCase())) { |
|||
return ""; |
|||
} |
|||
// 过滤括号 |
|||
String valueAfterRemoveBrackets = removeBrackets(value); |
|||
// 过滤html标签 |
|||
String valueAfterFilterHtml = filterHtml(valueAfterRemoveBrackets); |
|||
return valueAfterFilterHtml; |
|||
} |
|||
} |
|||
1042
cl_search_api/src/main/java/com/bfd/mf/common/util/subject/ExpNodeUtil.java
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,911 +0,0 @@ |
|||
package com.bfd.mf.common.util.subject; |
|||
|
|||
import com.bfd.mf.common.util.constants.ESConstant; |
|||
import com.bfd.mf.common.util.OperatorUtil; |
|||
import com.bfd.mf.common.web.vo.params.expression.ExpObject; |
|||
import com.bfd.mf.common.web.vo.params.expression.HalfQuartChar; |
|||
import org.elasticsearch.common.Strings; |
|||
import org.slf4j.Logger; |
|||
import org.slf4j.LoggerFactory; |
|||
|
|||
import java.util.*; |
|||
|
|||
public class ExpressionParser { |
|||
private static final Logger logger = LoggerFactory.getLogger(ExpressionParser.class); |
|||
|
|||
/** |
|||
* 表达式预处理 |
|||
*/ |
|||
public static Vector<Object> preTreatExpression(String exp, String[] fields) { |
|||
if (Strings.isNullOrEmpty(exp)) { |
|||
return null; |
|||
} |
|||
exp = exp.trim(); |
|||
Vector<Object> v = new Vector<Object>(); |
|||
Stack<HalfQuartChar> left = new Stack<>();// '<' |
|||
Stack<HalfQuartChar> leftQ = new Stack<>();// '(' |
|||
Stack<HalfQuartChar> leftS = new Stack<>();// “ 或" |
|||
int begin = 0, end = 0; |
|||
while (end < exp.length()) { |
|||
char c = exp.charAt(end); |
|||
// 处理<>内部空格====begin |
|||
if (c == '<' || c == '《') { |
|||
left.push(new HalfQuartChar(c, end)); |
|||
} else if (c == '》' || c == '>') { |
|||
if (!left.isEmpty()) { |
|||
left.pop(); |
|||
} |
|||
} else if (c == '(' || c == '(') { |
|||
leftQ.push(new HalfQuartChar(c, end)); |
|||
} else if (c == ')' || c == ')') { |
|||
if (!leftQ.isEmpty()) { |
|||
leftQ.pop(); |
|||
} |
|||
} else if (c == '"' || c == '“') { |
|||
leftS.push(new HalfQuartChar(c, end)); |
|||
} else if (c == '"' || c == '”') { |
|||
if (!leftS.isEmpty()) { |
|||
leftS.pop(); |
|||
} |
|||
} |
|||
// 可能是<(A) (B)>,(A)和(B)之间的空格 |
|||
if (c == ' ' && leftS.isEmpty()) {// 没有在“”内部 |
|||
if (!left.isEmpty() && end - left.peek().getPosition() > 1) { |
|||
if (end > 0 && end < exp.length() - 1) { |
|||
char prev = exp.charAt(end - 1); |
|||
char next = exp.charAt(end + 1); |
|||
if (isCharWaitSepLeft(prev) && isCharWaitSepRight(next)) { |
|||
c = '*';// 替换成*,便于后续处理 |
|||
} |
|||
} |
|||
} |
|||
} |
|||
// 处理<>内部空格===end |
|||
// find next operator |
|||
if (!OperatorUtil.isSeperator(c)) { |
|||
end++; |
|||
continue; |
|||
} else if (end > 0 && exp.charAt(end - 1) == '\\' && OperatorUtil.isOperator(c)) {// 转义符 |
|||
exp = exp.replace(exp.charAt(end - 1), ' ');// 转义符用空格代替 |
|||
end++; |
|||
continue; |
|||
} |
|||
// to-do:title 运算符转义 |
|||
if (end > begin) { |
|||
String st = exp.substring(begin, end).trim(); |
|||
if (!Strings.isNullOrEmpty(st)) { |
|||
v.add(st); |
|||
} |
|||
} |
|||
if (c != ',' && c != ',' && c != '"' && c != '“' && c != '”') { |
|||
v.add(new Character(c)); |
|||
} else { |
|||
logger.warn("miss ',' at:{}", end); |
|||
} |
|||
end++; |
|||
begin = end; |
|||
} |
|||
if (end == exp.length() && begin <= end - 1) { |
|||
if (begin == end - 1 && OperatorUtil.isSeperator(exp.charAt(begin))) {// last |
|||
// op |
|||
v.add(new Character(exp.charAt(begin))); |
|||
} else { |
|||
String sub = exp.substring(begin).trim(); |
|||
if (!Strings.isNullOrEmpty(sub)) { |
|||
v.add(sub); |
|||
} |
|||
} |
|||
} |
|||
// 遍历分隔结束,开始处理特殊字符 |
|||
for (int i = 0; i < v.size(); i++) { |
|||
Object o = v.get(i); |
|||
if ((o instanceof String && ((String) o).trim().equals("")) |
|||
|| o instanceof Character && ((char) o == '\u0000' || (char) o == '\n' || (char) o == '\t')) { |
|||
// v.remove(i); |
|||
} else if (i > 0 && i < v.size() - 1) { |
|||
if (o instanceof String && ((String) o).trim().contains(" ")) { |
|||
Object prev = v.get(i - 1); |
|||
Object next = v.get(i + 1); |
|||
if (prev instanceof Character && (char) prev == '<' && next instanceof Character |
|||
&& (char) next == '>') { |
|||
String[] arr = ((String) o).split(" "); |
|||
if (null != arr && arr.length == 2) { |
|||
v.set(i, arr[0]); |
|||
v.add(i, '*');// 《》中间空格用*代替,便于后续处理 |
|||
v.add(i, arr[1]); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
// 处理~10类型 |
|||
for (int j = 0; j < v.size(); j++) { |
|||
Object obj = v.get(j); |
|||
if (obj instanceof String) { |
|||
if (j > 0) { |
|||
Object prv = v.get(j - 1); |
|||
// 处理~10类型后面的数字 |
|||
if (prv instanceof Character && (char) prv == '~') { |
|||
Integer va = Integer.parseInt((String) obj); |
|||
if (null != va) { |
|||
v.set(j, va); |
|||
} |
|||
continue; |
|||
} |
|||
} |
|||
// title:表达式 |
|||
ExpObject ebj = null; |
|||
if (((String) obj).equals("title:") || ((String) obj).equals("content:")) { |
|||
v.remove(j); |
|||
if (j < v.size() - 1) { |
|||
Object next = v.get(j);// next now is j |
|||
if (next instanceof Character && (char) next == '(' || (char) next == '(') { |
|||
Stack<HalfQuartChar> stk = new Stack<HalfQuartChar>(); |
|||
stk.push(new HalfQuartChar('(', j)); |
|||
for (int k = j + 1; k < v.size(); k++) { |
|||
Object kv = v.get(k); |
|||
if (kv instanceof Character) { |
|||
if ((char) kv == '(' || (char) kv == '(') { |
|||
stk.push(new HalfQuartChar('(', k)); |
|||
} else if ((char) kv == ')' || (char) kv == ')') { |
|||
if (!stk.isEmpty()) { |
|||
stk.pop(); |
|||
} |
|||
if (stk.isEmpty()) { |
|||
break; |
|||
} |
|||
} |
|||
} else if (kv instanceof String) { |
|||
if (((String) obj).equals("title:")) { |
|||
ebj = new ExpObject((String) kv, new String[]{"title"}); |
|||
} else { |
|||
ebj = new ExpObject((String) kv, fields); |
|||
} |
|||
v.set(k, ebj); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} else if (((String) obj).startsWith("title:") || ((String) obj).startsWith("content:")) { |
|||
if (((String) obj).startsWith("title:")) { |
|||
String value = ((String) obj).substring("title:".length()); |
|||
ebj = new ExpObject((String) value, new String[]{"title"}); |
|||
} else { |
|||
String value = ((String) obj).substring("content:".length()); |
|||
ebj = new ExpObject((String) value, fields); |
|||
} |
|||
v.set(j, ebj); |
|||
} else { |
|||
List<String> fieldsNew = new ArrayList<>(); |
|||
fieldsNew.add(ESConstant.TITLE); |
|||
List<String> fieldsList = Arrays.asList(fields); |
|||
fieldsNew.addAll(fieldsList); |
|||
ebj = new ExpObject((String) obj, fieldsNew.toArray(new String[fieldsNew.size()])); |
|||
v.set(j, ebj); |
|||
} |
|||
} |
|||
} |
|||
return v; |
|||
} |
|||
|
|||
/** |
|||
* 表达式预处理 不自动添加title属性 |
|||
*/ |
|||
public static Vector<Object> preTreatExpressionNoTitleField(String exp, String[] fields) { |
|||
if (Strings.isNullOrEmpty(exp)) { |
|||
return null; |
|||
} |
|||
exp = exp.trim(); |
|||
Vector<Object> v = new Vector<Object>(); |
|||
Stack<HalfQuartChar> left = new Stack<>();// '<' |
|||
Stack<HalfQuartChar> leftQ = new Stack<>();// '(' |
|||
Stack<HalfQuartChar> leftS = new Stack<>();// “ 或" |
|||
int begin = 0, end = 0; |
|||
while (end < exp.length()) { |
|||
char c = exp.charAt(end); |
|||
// 处理<>内部空格====begin |
|||
if (c == '<' || c == '《') { |
|||
left.push(new HalfQuartChar(c, end)); |
|||
} else if (c == '》' || c == '>') { |
|||
if (!left.isEmpty()) { |
|||
left.pop(); |
|||
} |
|||
} else if (c == '(' || c == '(') { |
|||
leftQ.push(new HalfQuartChar(c, end)); |
|||
} else if (c == ')' || c == ')') { |
|||
if (!leftQ.isEmpty()) { |
|||
leftQ.pop(); |
|||
} |
|||
} else if (c == '"' || c == '“') { |
|||
leftS.push(new HalfQuartChar(c, end)); |
|||
} else if (c == '"' || c == '”') { |
|||
if (!leftS.isEmpty()) { |
|||
leftS.pop(); |
|||
} |
|||
} |
|||
// 可能是<(A) (B)>,(A)和(B)之间的空格 |
|||
if (c == ' ' && leftS.isEmpty()) {// 没有在“”内部 |
|||
if (!left.isEmpty() && end - left.peek().getPosition() > 1) { |
|||
if (end > 0 && end < exp.length() - 1) { |
|||
char prev = exp.charAt(end - 1); |
|||
char next = exp.charAt(end + 1); |
|||
if (isCharWaitSepLeft(prev) && isCharWaitSepRight(next)) { |
|||
c = '*';// 替换成*,便于后续处理 |
|||
} |
|||
} |
|||
} |
|||
} |
|||
// 处理<>内部空格===end |
|||
// find next operator |
|||
if (!OperatorUtil.isSeperator(c)) { |
|||
end++; |
|||
continue; |
|||
} else if (end > 0 && exp.charAt(end - 1) == '\\' && OperatorUtil.isOperator(c)) {// 转义符 |
|||
exp = exp.replace(exp.charAt(end - 1), ' ');// 转义符用空格代替 |
|||
end++; |
|||
continue; |
|||
} |
|||
// to-do:title 运算符转义 |
|||
if (end > begin) { |
|||
String st = exp.substring(begin, end).trim(); |
|||
if (!Strings.isNullOrEmpty(st)) { |
|||
v.add(st); |
|||
} |
|||
} |
|||
if (c != ',' && c != ',' && c != '"' && c != '“' && c != '”') { |
|||
v.add(new Character(c)); |
|||
} else { |
|||
logger.warn("miss ',' at:{}", end); |
|||
} |
|||
end++; |
|||
begin = end; |
|||
} |
|||
if (end == exp.length() && begin <= end - 1) { |
|||
if (begin == end - 1 && OperatorUtil.isSeperator(exp.charAt(begin))) {// last |
|||
// op |
|||
v.add(new Character(exp.charAt(begin))); |
|||
} else { |
|||
String sub = exp.substring(begin).trim(); |
|||
if (!Strings.isNullOrEmpty(sub)) { |
|||
v.add(sub); |
|||
} |
|||
} |
|||
} |
|||
// 遍历分隔结束,开始处理特殊字符 |
|||
for (int i = 0; i < v.size(); i++) { |
|||
Object o = v.get(i); |
|||
if ((o instanceof String && ((String) o).trim().equals("")) |
|||
|| o instanceof Character && ((char) o == '\u0000' || (char) o == '\n' || (char) o == '\t')) { |
|||
// v.remove(i); |
|||
} else if (i > 0 && i < v.size() - 1) { |
|||
if (o instanceof String && ((String) o).trim().contains(" ")) { |
|||
Object prev = v.get(i - 1); |
|||
Object next = v.get(i + 1); |
|||
if (prev instanceof Character && (char) prev == '<' && next instanceof Character |
|||
&& (char) next == '>') { |
|||
String[] arr = ((String) o).split(" "); |
|||
if (null != arr && arr.length == 2) { |
|||
v.set(i, arr[0]); |
|||
v.add(i, '*');// 《》中间空格用*代替,便于后续处理 |
|||
v.add(i, arr[1]); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
// 处理~10类型 |
|||
for (int j = 0; j < v.size(); j++) { |
|||
Object obj = v.get(j); |
|||
if (obj instanceof String) { |
|||
if (j > 0) { |
|||
Object prv = v.get(j - 1); |
|||
// 处理~10类型后面的数字 |
|||
if (prv instanceof Character && (char) prv == '~') { |
|||
Integer va = Integer.parseInt((String) obj); |
|||
if (null != va) { |
|||
v.set(j, va); |
|||
} |
|||
continue; |
|||
} |
|||
} |
|||
// title:表达式 |
|||
ExpObject ebj = null; |
|||
if (((String) obj).equals("title:") || ((String) obj).equals("content:")) { |
|||
v.remove(j); |
|||
if (j < v.size() - 1) { |
|||
Object next = v.get(j);// next now is j |
|||
if (next instanceof Character && (char) next == '(' || (char) next == '(') { |
|||
Stack<HalfQuartChar> stk = new Stack<HalfQuartChar>(); |
|||
stk.push(new HalfQuartChar('(', j)); |
|||
for (int k = j + 1; k < v.size(); k++) { |
|||
Object kv = v.get(k); |
|||
if (kv instanceof Character) { |
|||
if ((char) kv == '(' || (char) kv == '(') { |
|||
stk.push(new HalfQuartChar('(', k)); |
|||
} else if ((char) kv == ')' || (char) kv == ')') { |
|||
if (!stk.isEmpty()) { |
|||
stk.pop(); |
|||
} |
|||
if (stk.isEmpty()) { |
|||
break; |
|||
} |
|||
} |
|||
} else if (kv instanceof String) { |
|||
if (((String) obj).equals("title:")) { |
|||
ebj = new ExpObject((String) kv, new String[]{"title"}); |
|||
} else { |
|||
ebj = new ExpObject((String) kv, fields); |
|||
} |
|||
v.set(k, ebj); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} else if (((String) obj).startsWith("title:") || ((String) obj).startsWith("content:")) { |
|||
if (((String) obj).startsWith("title:")) { |
|||
String value = ((String) obj).substring("title:".length()); |
|||
ebj = new ExpObject((String) value, new String[]{"title"}); |
|||
} else { |
|||
String value = ((String) obj).substring("content:".length()); |
|||
ebj = new ExpObject((String) value, fields); |
|||
} |
|||
v.set(j, ebj); |
|||
} else { |
|||
List<String> fieldsNew = new ArrayList<>(); |
|||
//fieldsNew.add(ESConstant.TITLE); |
|||
List<String> fieldsList = Arrays.asList(fields); |
|||
fieldsNew.addAll(fieldsList); |
|||
ebj = new ExpObject((String) obj, fieldsNew.toArray(new String[fieldsNew.size()])); |
|||
v.set(j, ebj); |
|||
} |
|||
} |
|||
} |
|||
return v; |
|||
} |
|||
|
|||
public static Vector<Object> preProcessExpression(String exp, boolean onlyKeyWord, String[] fields) throws Exception { |
|||
if (Strings.isNullOrEmpty(exp)) { |
|||
return null; |
|||
} |
|||
|
|||
exp = exp.trim(); |
|||
String[] arr = exp.split(" "); |
|||
Vector<Object> v = new Vector<>(); |
|||
int quartNum = 0; |
|||
for (String st : arr) { |
|||
st = st.trim(); |
|||
if (Strings.isNullOrEmpty(st)) { |
|||
continue; |
|||
} |
|||
int begin = 0, end = 0; |
|||
while (end < st.length()) { |
|||
char c = st.charAt(end); |
|||
// find next operator |
|||
if (!OperatorUtil.isSeperator(c)) { |
|||
end++; |
|||
continue; |
|||
} else { // c为分隔符 |
|||
if (end > 0 && st.charAt(end - 1) == '\\') {// 转义符 |
|||
st = st.replace(st.charAt(end - 1), ' ');// 转义符用空格代替 |
|||
end++; |
|||
continue; |
|||
} else if (c == '“' || (c == '"' && quartNum % 2 == 0)) { |
|||
quartNum++; |
|||
} else if (c == '”' || (c == '"' && quartNum % 2 == 1)) { |
|||
quartNum--; |
|||
} else if (quartNum > 0) { |
|||
end++; |
|||
continue; |
|||
} |
|||
} |
|||
if (end > begin) { |
|||
String st0 = st.substring(begin, end).trim(); |
|||
if (!Strings.isNullOrEmpty(st0)) { |
|||
v.add(st0); |
|||
} |
|||
} |
|||
if (c != ',' && c != ',') { |
|||
v.add(new Character(c)); |
|||
} else { |
|||
logger.warn("miss ',' at:{}", end); |
|||
} |
|||
end++; |
|||
begin = end; |
|||
} |
|||
if (end == st.length() && begin <= end - 1) { |
|||
if (begin == end - 1 && OperatorUtil.isSeperator(st.charAt(begin)) && quartNum == 0) { |
|||
v.add(new Character(st.charAt(begin))); |
|||
} else { |
|||
String sub = st.substring(begin).trim(); |
|||
if (!Strings.isNullOrEmpty(sub)) { |
|||
v.add(sub); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
logger.debug("after split,vector now is:{}",v); |
|||
visitVector(v); |
|||
logger.info("=====================endLess loop============="); |
|||
logger.info("keyWord is:{}", exp); |
|||
v = checkAndFormatVector(v, onlyKeyWord, fields); |
|||
logger.debug("after checkAndFormatVector,vector now is:{}",v); |
|||
visitVector(v); |
|||
return v; |
|||
} |
|||
|
|||
public static Vector<Object> preProcessExpressionNoTitleField(String exp, boolean onlyKeyWord, String[] fields) throws Exception { |
|||
if (Strings.isNullOrEmpty(exp)) { |
|||
return null; |
|||
} |
|||
|
|||
exp = exp.trim(); |
|||
String[] arr = exp.split(" "); |
|||
Vector<Object> v = new Vector<>(); |
|||
int quartNum = 0; |
|||
for (String st : arr) { |
|||
st = st.trim(); |
|||
if (Strings.isNullOrEmpty(st)) { |
|||
continue; |
|||
} |
|||
int begin = 0, end = 0; |
|||
while (end < st.length()) { |
|||
char c = st.charAt(end); |
|||
// find next operator |
|||
if (!OperatorUtil.isSeperator(c)) { |
|||
end++; |
|||
continue; |
|||
} else { // c为分隔符 |
|||
if (end > 0 && st.charAt(end - 1) == '\\') {// 转义符 |
|||
st = st.replace(st.charAt(end - 1), ' ');// 转义符用空格代替 |
|||
end++; |
|||
continue; |
|||
} else if (c == '“' || (c == '"' && quartNum % 2 == 0)) { |
|||
quartNum++; |
|||
} else if (c == '”' || (c == '"' && quartNum % 2 == 1)) { |
|||
quartNum--; |
|||
} else if (quartNum > 0) { |
|||
end++; |
|||
continue; |
|||
} |
|||
} |
|||
if (end > begin) { |
|||
String st0 = st.substring(begin, end).trim(); |
|||
if (!Strings.isNullOrEmpty(st0)) { |
|||
v.add(st0); |
|||
} |
|||
} |
|||
if (c != ',' && c != ',') { |
|||
v.add(new Character(c)); |
|||
} else { |
|||
logger.warn("miss ',' at:{}", end); |
|||
} |
|||
end++; |
|||
begin = end; |
|||
} |
|||
if (end == st.length() && begin <= end - 1) { |
|||
if (begin == end - 1 && OperatorUtil.isSeperator(st.charAt(begin)) && quartNum == 0) { |
|||
v.add(new Character(st.charAt(begin))); |
|||
} else { |
|||
String sub = st.substring(begin).trim(); |
|||
if (!Strings.isNullOrEmpty(sub)) { |
|||
v.add(sub); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
logger.debug("after split,vector now is:{}",v); |
|||
visitVector(v); |
|||
logger.info("=====================endLess loop============="); |
|||
logger.info("keyWord is:{}", exp); |
|||
v = checkAndFormatVectorNoTitleField(v, onlyKeyWord, fields); |
|||
logger.debug("after checkAndFormatVector,vector now is:{}",v); |
|||
visitVector(v); |
|||
return v; |
|||
} |
|||
|
|||
private static void visitVector(Vector<Object> vector) { |
|||
if (null == vector || vector.isEmpty()) { |
|||
logger.debug("vector is empty!"); |
|||
return; |
|||
} |
|||
for (int i = 0; i < vector.size(); i++) { |
|||
Object obj = vector.get(i); |
|||
logger.debug("i=" + i + ",value=" + obj); |
|||
} |
|||
return; |
|||
} |
|||
|
|||
private static Vector<Object> checkAndFormatVector(Vector<Object> vector, boolean onlyKeyWord, String[] fields) throws Exception { |
|||
if (null == vector || vector.isEmpty()) { |
|||
return null; |
|||
} |
|||
logger.warn("[checkAndFormatVector] fields: {}{}", fields); |
|||
List list = new ArrayList(); |
|||
for (int i = 0; i < vector.size(); i++) { |
|||
list.add(vector.get(i)); |
|||
} |
|||
logger.info("vector list is:{}", list); |
|||
Stack<HalfQuartChar> leftS = new Stack<HalfQuartChar>();// 存放“” |
|||
Stack<HalfQuartChar> leftQ = new Stack<HalfQuartChar>();// 存放<> |
|||
int qNum = 0;// <>数目 |
|||
int starNum = 0;// <>内部分隔空格个数 |
|||
for (int i = 0; i < vector.size(); i++) { |
|||
Object ob = vector.get(i); |
|||
// <>内部 |
|||
if (!leftQ.isEmpty() && leftS.isEmpty()) { |
|||
if (i > 0) { |
|||
if (isLeftWaitSeperate(vector.get(i - 1)) && isRightWaitSeperate(vector.get(i))) { |
|||
vector.insertElementAt(new Character('*'), i); |
|||
starNum++; |
|||
continue; |
|||
} else if (i > 1 && isLeftWaitSeperate(vector.get(i - 2)) |
|||
&& isRightWaitSeperate(vector.get(i - 1))) { |
|||
vector.insertElementAt(new Character('*'), i - 1); |
|||
starNum++; |
|||
continue; |
|||
} |
|||
} |
|||
} |
|||
if (ob instanceof Character) { |
|||
if ((char) ob == '“' || ((char) ob == '"' && leftS.size() % 2 == 0)) { |
|||
leftS.push(new HalfQuartChar('“', i)); |
|||
vector.remove(ob); |
|||
i--; |
|||
} else if ((char) ob == '”' || ((char) ob == '"' && leftS.size() % 2 == 1)) { |
|||
if (!leftS.isEmpty()) { |
|||
leftS.pop(); |
|||
} else { |
|||
throw new Exception(" “” not match Exception,“ expected "); |
|||
} |
|||
vector.remove(ob); |
|||
i--; |
|||
} else if ((char) ob == '<' || (char) ob == '《') { |
|||
leftQ.push(new HalfQuartChar('<', i)); |
|||
qNum++; |
|||
} else if ((char) ob == '>' || (char) ob == '》') { |
|||
if (!leftQ.isEmpty()) { |
|||
leftQ.pop(); |
|||
} else { |
|||
throw new Exception("> not match Exception,< expected "); |
|||
} |
|||
} |
|||
} else if (ob instanceof String) { |
|||
if (i > 0) { |
|||
Object prv = vector.get(i - 1); |
|||
if (prv instanceof String && onlyKeyWord) {// 连续String |
|||
String ns = null; |
|||
if (!leftS.isEmpty()) {// “”内部连续String=>合并 |
|||
ns = ((String) prv).trim() + " " + ((String) ob).trim(); |
|||
} else if (leftQ.isEmpty()) {// 不在<>内部 |
|||
ns = ((String) prv).trim() + ((String) ob).trim(); |
|||
} |
|||
if (!Strings.isNullOrEmpty(ns)) { |
|||
vector.set(i - 1, ns); |
|||
vector.remove(i--); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
// “”不匹配 |
|||
if (!leftS.isEmpty()) { |
|||
throw new Exception(" “” not match Exception!"); |
|||
} else if (!leftQ.isEmpty()) { |
|||
throw new Exception("<> not match Exception!"); |
|||
} else if (starNum != qNum) { |
|||
throw new Exception("<> phrase Exception,riht format should like: <A B>~10"); |
|||
} |
|||
// 封装成OP或者ExpObject |
|||
for (int j = 0; j < vector.size(); j++) { |
|||
Object obj = vector.get(j); |
|||
if (obj instanceof String) { |
|||
if (j > 0) { |
|||
Object prv = vector.get(j - 1); |
|||
// 处理~10类型后面的数字 |
|||
if (prv instanceof Character && (char) prv == '~') { |
|||
Integer va = Integer.parseInt((String) obj); |
|||
if (null != va) { |
|||
vector.set(j, va); |
|||
} |
|||
continue; |
|||
} |
|||
} |
|||
// title:表达式 |
|||
ExpObject ebj = null; |
|||
if (((String) obj).equals("title:") || ((String) obj).equals("content:")) { |
|||
vector.remove(j); |
|||
if (j < vector.size() - 1) { |
|||
Object next = vector.get(j);// next now is j |
|||
if (next instanceof Character && (char) next == '(' || (char) next == '(') { |
|||
Stack<HalfQuartChar> stk = new Stack<HalfQuartChar>(); |
|||
stk.push(new HalfQuartChar('(', j)); |
|||
for (int k = j + 1; k < vector.size(); k++) { |
|||
Object kv = vector.get(k); |
|||
if (kv instanceof Character) { |
|||
if ((char) kv == '(' || (char) kv == '(') { |
|||
stk.push(new HalfQuartChar('(', k)); |
|||
} else if ((char) kv == ')' || (char) kv == ')') { |
|||
if (!stk.isEmpty()) { |
|||
stk.pop(); |
|||
} |
|||
if (stk.isEmpty()) { |
|||
break; |
|||
} |
|||
} |
|||
} else if (kv instanceof String) {// 括号内部普通字符串 |
|||
// 类似 title:(A|title:B)==》去掉title:B之前的title: |
|||
while (((String) kv).startsWith("title:") || ((String) kv).startsWith("content:")) { |
|||
int begin = ((String) kv).indexOf(':'); |
|||
kv = ((String) kv).substring(begin + 1).trim(); |
|||
} |
|||
if (((String) kv).startsWith("\\title:")// 使用转义符==>当做普通字符串处理 |
|||
|| ((String) kv).startsWith("\\content:")) { |
|||
kv = ((String) kv).substring(2).trim(); |
|||
} |
|||
if (((String) obj).equals("title:")) { |
|||
ebj = new ExpObject((String) kv, new String[]{"title"}); |
|||
} else { |
|||
ebj = new ExpObject((String) kv, fields); |
|||
} |
|||
vector.set(k, ebj); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} else if (((String) obj).startsWith("title:") || ((String) obj).startsWith("content:")) { |
|||
String value = (String) obj; |
|||
while (value.startsWith("title:") || value.startsWith("content:")) { |
|||
value = value.substring(value.indexOf(":") + 1); |
|||
} |
|||
if (((String) obj).startsWith("title:")) { |
|||
ebj = new ExpObject((String) value, new String[]{"title"}); |
|||
} else { |
|||
ebj = new ExpObject((String) value, fields); |
|||
} |
|||
vector.set(j, ebj); |
|||
} else {// 普通字符串 |
|||
if (((String) obj).startsWith("\\title:")// 使用转义符==>当做普通字符串处理 |
|||
|| ((String) obj).startsWith("\\content:")) { |
|||
obj = ((String) obj).substring(2).trim(); |
|||
} |
|||
List<String> fieldsNew = new ArrayList<>(); |
|||
fieldsNew.add(ESConstant.TITLE); |
|||
List<String> fieldsList = Arrays.asList(fields); |
|||
fieldsNew.addAll(fieldsList); |
|||
ebj = new ExpObject((String) obj, fieldsNew.toArray(new String[fieldsNew.size()])); |
|||
vector.set(j, ebj); |
|||
} |
|||
} |
|||
} |
|||
return vector; |
|||
} |
|||
|
|||
private static Vector<Object> checkAndFormatVectorNoTitleField(Vector<Object> vector, boolean onlyKeyWord, String[] fields) throws Exception { |
|||
if (null == vector || vector.isEmpty()) { |
|||
return null; |
|||
} |
|||
logger.warn("[checkAndFormatVector] fields: {}{}", fields); |
|||
List list = new ArrayList(); |
|||
for (int i = 0; i < vector.size(); i++) { |
|||
list.add(vector.get(i)); |
|||
} |
|||
logger.info("vector list is:{}", list); |
|||
Stack<HalfQuartChar> leftS = new Stack<HalfQuartChar>();// 存放“” |
|||
Stack<HalfQuartChar> leftQ = new Stack<HalfQuartChar>();// 存放<> |
|||
int qNum = 0;// <>数目 |
|||
int starNum = 0;// <>内部分隔空格个数 |
|||
for (int i = 0; i < vector.size(); i++) { |
|||
Object ob = vector.get(i); |
|||
// <>内部 |
|||
if (!leftQ.isEmpty() && leftS.isEmpty()) { |
|||
if (i > 0) { |
|||
if (isLeftWaitSeperate(vector.get(i - 1)) && isRightWaitSeperate(vector.get(i))) { |
|||
vector.insertElementAt(new Character('*'), i); |
|||
starNum++; |
|||
continue; |
|||
} else if (i > 1 && isLeftWaitSeperate(vector.get(i - 2)) |
|||
&& isRightWaitSeperate(vector.get(i - 1))) { |
|||
vector.insertElementAt(new Character('*'), i - 1); |
|||
starNum++; |
|||
continue; |
|||
} |
|||
} |
|||
} |
|||
if (ob instanceof Character) { |
|||
if ((char) ob == '“' || ((char) ob == '"' && leftS.size() % 2 == 0)) { |
|||
leftS.push(new HalfQuartChar('“', i)); |
|||
vector.remove(ob); |
|||
i--; |
|||
} else if ((char) ob == '”' || ((char) ob == '"' && leftS.size() % 2 == 1)) { |
|||
if (!leftS.isEmpty()) { |
|||
leftS.pop(); |
|||
} else { |
|||
throw new Exception(" “” not match Exception,“ expected "); |
|||
} |
|||
vector.remove(ob); |
|||
i--; |
|||
} else if ((char) ob == '<' || (char) ob == '《') { |
|||
leftQ.push(new HalfQuartChar('<', i)); |
|||
qNum++; |
|||
} else if ((char) ob == '>' || (char) ob == '》') { |
|||
if (!leftQ.isEmpty()) { |
|||
leftQ.pop(); |
|||
} else { |
|||
throw new Exception("> not match Exception,< expected "); |
|||
} |
|||
} |
|||
} else if (ob instanceof String) { |
|||
if (i > 0) { |
|||
Object prv = vector.get(i - 1); |
|||
if (prv instanceof String && onlyKeyWord) {// 连续String |
|||
String ns = null; |
|||
if (!leftS.isEmpty()) {// “”内部连续String=>合并 |
|||
ns = ((String) prv).trim() + " " + ((String) ob).trim(); |
|||
} else if (leftQ.isEmpty()) {// 不在<>内部 |
|||
ns = ((String) prv).trim() + ((String) ob).trim(); |
|||
} |
|||
if (!Strings.isNullOrEmpty(ns)) { |
|||
vector.set(i - 1, ns); |
|||
vector.remove(i--); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
// “”不匹配 |
|||
if (!leftS.isEmpty()) { |
|||
throw new Exception(" “” not match Exception!"); |
|||
} else if (!leftQ.isEmpty()) { |
|||
throw new Exception("<> not match Exception!"); |
|||
} else if (starNum != qNum) { |
|||
throw new Exception("<> phrase Exception,riht format should like: <A B>~10"); |
|||
} |
|||
// 封装成OP或者ExpObject |
|||
for (int j = 0; j < vector.size(); j++) { |
|||
Object obj = vector.get(j); |
|||
if (obj instanceof String) { |
|||
if (j > 0) { |
|||
Object prv = vector.get(j - 1); |
|||
// 处理~10类型后面的数字 |
|||
if (prv instanceof Character && (char) prv == '~') { |
|||
Integer va = Integer.parseInt((String) obj); |
|||
if (null != va) { |
|||
vector.set(j, va); |
|||
} |
|||
continue; |
|||
} |
|||
} |
|||
// title:表达式 |
|||
ExpObject ebj = null; |
|||
if (((String) obj).equals("title:") || ((String) obj).equals("content:")) { |
|||
vector.remove(j); |
|||
if (j < vector.size() - 1) { |
|||
Object next = vector.get(j);// next now is j |
|||
if (next instanceof Character && (char) next == '(' || (char) next == '(') { |
|||
Stack<HalfQuartChar> stk = new Stack<HalfQuartChar>(); |
|||
stk.push(new HalfQuartChar('(', j)); |
|||
for (int k = j + 1; k < vector.size(); k++) { |
|||
Object kv = vector.get(k); |
|||
if (kv instanceof Character) { |
|||
if ((char) kv == '(' || (char) kv == '(') { |
|||
stk.push(new HalfQuartChar('(', k)); |
|||
} else if ((char) kv == ')' || (char) kv == ')') { |
|||
if (!stk.isEmpty()) { |
|||
stk.pop(); |
|||
} |
|||
if (stk.isEmpty()) { |
|||
break; |
|||
} |
|||
} |
|||
} else if (kv instanceof String) {// 括号内部普通字符串 |
|||
// 类似 title:(A|title:B)==》去掉title:B之前的title: |
|||
while (((String) kv).startsWith("title:") || ((String) kv).startsWith("content:")) { |
|||
int begin = ((String) kv).indexOf(':'); |
|||
kv = ((String) kv).substring(begin + 1).trim(); |
|||
} |
|||
if (((String) kv).startsWith("\\title:")// 使用转义符==>当做普通字符串处理 |
|||
|| ((String) kv).startsWith("\\content:")) { |
|||
kv = ((String) kv).substring(2).trim(); |
|||
} |
|||
if (((String) obj).equals("title:")) { |
|||
ebj = new ExpObject((String) kv, new String[]{"title"}); |
|||
} else { |
|||
ebj = new ExpObject((String) kv, fields); |
|||
} |
|||
vector.set(k, ebj); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} else if (((String) obj).startsWith("title:") || ((String) obj).startsWith("content:")) { |
|||
String value = (String) obj; |
|||
while (value.startsWith("title:") || value.startsWith("content:")) { |
|||
value = value.substring(value.indexOf(":") + 1); |
|||
} |
|||
if (((String) obj).startsWith("title:")) { |
|||
ebj = new ExpObject((String) value, new String[]{"title"}); |
|||
} else { |
|||
ebj = new ExpObject((String) value, fields); |
|||
} |
|||
vector.set(j, ebj); |
|||
} else {// 普通字符串 |
|||
if (((String) obj).startsWith("\\title:")// 使用转义符==>当做普通字符串处理 |
|||
|| ((String) obj).startsWith("\\content:")) { |
|||
obj = ((String) obj).substring(2).trim(); |
|||
} |
|||
List<String> fieldsNew = new ArrayList<>(); |
|||
//fieldsNew.add(ESConstant.TITLE); |
|||
List<String> fieldsList = Arrays.asList(fields); |
|||
fieldsNew.addAll(fieldsList); |
|||
ebj = new ExpObject((String) obj, fieldsNew.toArray(new String[fieldsNew.size()])); |
|||
vector.set(j, ebj); |
|||
} |
|||
} |
|||
} |
|||
return vector; |
|||
} |
|||
|
|||
/** |
|||
* 处理消歧语句表达式 |
|||
*/ |
|||
public static HashSet<ExpObject> handleMinusExpression(String minus, String[] fields) throws Exception { |
|||
if (Strings.isNullOrEmpty(minus)) { |
|||
return null; |
|||
} |
|||
minus = minus.replaceAll(",", ","); |
|||
minus = minus.replaceAll(" ", " "); |
|||
Vector<Object> v = preProcessExpression(minus, false, fields); |
|||
HashSet<ExpObject> set = new HashSet<ExpObject>(); |
|||
if (null != v && !v.isEmpty()) { |
|||
for (Object obj : v) { |
|||
if (obj instanceof ExpObject) { |
|||
set.add((ExpObject) obj); |
|||
} |
|||
} |
|||
} |
|||
return set; |
|||
} |
|||
|
|||
private static boolean isCharWaitSepLeft(char charC) { |
|||
if (!OperatorUtil.isSeperator(charC) || charC == ')' || charC == ')' || charC == '>' || charC == '》' |
|||
|| charC == '"' || charC == '”') { |
|||
return true; |
|||
} |
|||
return false; |
|||
} |
|||
|
|||
private static boolean isCharWaitSepRight(char charC) { |
|||
if (!OperatorUtil.isSeperator(charC) || charC == '(' || charC == '(' || charC == '<' || charC == '《' |
|||
|| charC == '"' || charC == '“') { |
|||
return true; |
|||
} |
|||
return false; |
|||
} |
|||
|
|||
private static boolean isLeftWaitSeperate(Object obj) { |
|||
if (null == obj) { |
|||
return false; |
|||
} |
|||
if (obj instanceof Character) { |
|||
return (char) obj == ')' || (char) obj == ')' || (char) obj == '"' || (char) obj == '”'; |
|||
} else if (obj instanceof String) { |
|||
return !Strings.isNullOrEmpty((String) obj); |
|||
} else if (obj instanceof Integer) {// ~20 |
|||
return true; |
|||
} |
|||
return false; |
|||
} |
|||
|
|||
private static boolean isRightWaitSeperate(Object obj) { |
|||
if (null == obj) { |
|||
return false; |
|||
} |
|||
if (obj instanceof Character) { |
|||
return (char) obj == '(' || (char) obj == '(' || (char) obj == '<' || (char) obj == '《' || (char) obj == '"' |
|||
|| (char) obj == '“'; |
|||
} else if (obj instanceof String) { |
|||
return !Strings.isNullOrEmpty((String) obj); |
|||
} |
|||
return false; |
|||
} |
|||
} |
|||
@ -1,669 +0,0 @@ |
|||
package com.bfd.mf.common.util.subject; |
|||
|
|||
import com.alibaba.fastjson.JSONArray; |
|||
import com.alibaba.fastjson.JSONObject; |
|||
import com.bfd.mf.common.util.constants.ESConstant; |
|||
import com.bfd.mf.common.util.ESServerUtils; |
|||
import com.bfd.mf.common.web.repository.mysql.cache.ClusterRepository; |
|||
import com.bfd.mf.common.web.vo.params.expression.ExpNode; |
|||
import com.bfd.mf.common.web.vo.params.expression.ExpObject; |
|||
import com.bfd.nlp.common.util.object.TObjectUtils; |
|||
import com.bfd.nlp.common.util.string.TStringUtils; |
|||
import org.elasticsearch.action.admin.indices.analyze.AnalyzeResponse; |
|||
import org.elasticsearch.action.admin.indices.analyze.AnalyzeResponse.AnalyzeToken; |
|||
import org.elasticsearch.client.IndicesAdminClient; |
|||
import org.elasticsearch.common.Strings; |
|||
import org.elasticsearch.index.query.*; |
|||
import org.slf4j.Logger; |
|||
import org.slf4j.LoggerFactory; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
|
|||
import java.util.*; |
|||
|
|||
import static com.bfd.mf.common.util.constants.ESConstant.EXCLUDE_KEYWORDS_SPLIT_CN_SYSBOL; |
|||
import static com.bfd.mf.common.util.constants.ESConstant.EXCLUDE_KEYWORDS_SPLIT_SYSBOL; |
|||
|
|||
|
|||
public class QueryBuilderUtil { |
|||
private static final Logger logger = LoggerFactory.getLogger(QueryBuilderUtil.class); |
|||
|
|||
@Autowired |
|||
private ClusterRepository clusterRepository; |
|||
|
|||
public static BoolQueryBuilder getQueryBuilderFromExpNodeTree(ExpNode root, HashSet<ExpObject> set) throws Exception { |
|||
if (null == root || null == root.getValue()) { |
|||
return null; |
|||
} |
|||
/* |
|||
* @2016-12-7 |
|||
* @author lei.bao |
|||
* format之后: |
|||
* 1:distance运算拆成全部单个(左右子树全部是ExpObject) |
|||
* 2:所有ExpObject都是叶子节点且规范 |
|||
*/ |
|||
ExpNode rst = ExpNodeUtil.visitAndFormatTree(root, set); |
|||
// |
|||
Object rt = ExpNodeUtil.ComputeNodeTree(rst, set); |
|||
|
|||
if (rt instanceof BoolQueryBuilder) { |
|||
return (BoolQueryBuilder) rt; |
|||
} else if (rt instanceof MatchQueryBuilder) { |
|||
BoolQueryBuilder bq = QueryBuilders.boolQuery(); |
|||
return bq.must((MatchQueryBuilder) rt); |
|||
}else if(rt instanceof MatchPhraseQueryBuilder){ |
|||
BoolQueryBuilder bq = QueryBuilders.boolQuery(); |
|||
return bq.must((MatchPhraseQueryBuilder) rt); |
|||
}else if(rt instanceof AbstractQueryBuilder){ |
|||
BoolQueryBuilder bq = QueryBuilders.boolQuery(); |
|||
return bq.must((AbstractQueryBuilder) rt); |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
public static BoolQueryBuilder handleExcludeExpression(String exclude, String[] fields) { |
|||
Vector<Object> v = ExpressionParser.preTreatExpression(exclude, fields); |
|||
if (null != v && !v.isEmpty()) { |
|||
BoolQueryBuilder qb = QueryBuilders.boolQuery(); |
|||
for (Object obj : v) { |
|||
if (obj instanceof ExpObject) { |
|||
BoolQueryBuilder innerQb = QueryBuilders.boolQuery(); |
|||
for (String fd : ((ExpObject) obj).getFields()) { |
|||
innerQb.should(QueryBuilders.matchPhraseQuery(fd, ((ExpObject) obj).getExpression()).slop(0)); |
|||
} |
|||
qb.mustNot(innerQb); |
|||
} |
|||
} |
|||
return qb; |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
public static BoolQueryBuilder handleExcludeExpressionNoTitleField(String exclude, String[] fields) { |
|||
Vector<Object> v = ExpressionParser.preTreatExpressionNoTitleField(exclude, fields); |
|||
if (null != v && !v.isEmpty()) { |
|||
BoolQueryBuilder qb = QueryBuilders.boolQuery(); |
|||
for (Object obj : v) { |
|||
if (obj instanceof ExpObject) { |
|||
BoolQueryBuilder innerQb = QueryBuilders.boolQuery(); |
|||
for (String fd : ((ExpObject) obj).getFields()) { |
|||
innerQb.should(QueryBuilders.matchPhraseQuery(fd, ((ExpObject) obj).getExpression()).slop(0)); |
|||
} |
|||
qb.mustNot(innerQb); |
|||
} |
|||
} |
|||
return qb; |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
public static BoolQueryBuilder handleTitleExcludeExpression(String exclude) { |
|||
if (TStringUtils.isNotEmpty(exclude)) { |
|||
// 标点符号修正 |
|||
exclude = exclude.replaceAll(EXCLUDE_KEYWORDS_SPLIT_CN_SYSBOL, |
|||
EXCLUDE_KEYWORDS_SPLIT_SYSBOL); |
|||
exclude = "title:(" + exclude + ")"; |
|||
Vector<Object> v = ExpressionParser.preTreatExpression(exclude, new String[]{ESConstant.TITLE}); |
|||
BoolQueryBuilder qb = QueryBuilders.boolQuery(); |
|||
BoolQueryBuilder titleExcludeBuilder = null; |
|||
if (null != v && !v.isEmpty()) { |
|||
titleExcludeBuilder = QueryBuilders.boolQuery(); |
|||
for (Object obj : v) { |
|||
if (obj instanceof ExpObject) { |
|||
QueryBuilder wordQueryBuilder = QueryBuilders.matchPhraseQuery(ESConstant.SEARCH_SCOPE_TYPE_TITLE, |
|||
((ExpObject) obj).getExpression()).slop(0); |
|||
titleExcludeBuilder.should(wordQueryBuilder); |
|||
} |
|||
} |
|||
qb.mustNot(titleExcludeBuilder); |
|||
return qb; |
|||
} |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
public static List<SpanNotQueryBuilder> getSpanNotQueryBuilder(String field, String shortStr, String longerStr) { |
|||
if (Strings.isNullOrEmpty(shortStr) || Strings.isNullOrEmpty(longerStr)) { |
|||
logger.error("empty short term or longer term,return NULL"); |
|||
return null; |
|||
} |
|||
int start = longerStr.indexOf(shortStr); |
|||
if (start < 0 || start >= longerStr.length()) { |
|||
return null; |
|||
} |
|||
int lenS = shortStr.length(); |
|||
if ((lenS + start) > longerStr.length()) { |
|||
return null; |
|||
} |
|||
List<String> subs = new ArrayList<String>(); |
|||
if (start > 0) { |
|||
subs.add(longerStr.substring(0, start)); |
|||
} |
|||
subs.add(longerStr.substring(start, start + lenS)); |
|||
if ((start + lenS) < longerStr.length()) { |
|||
subs.add(longerStr.substring(start + lenS)); |
|||
} |
|||
// call API to get include clause |
|||
AnalyzeResult anaLyRst = getAnalyzeResult(shortStr); |
|||
if (null == anaLyRst) { |
|||
return null; |
|||
} |
|||
List<String> rst = anaLyRst.getList(); |
|||
// include clause |
|||
List<SpanNearQueryBuilder> spans = new ArrayList<>(); |
|||
SpanNearQueryBuilder span; |
|||
if (null != rst && rst.size() > 1) { |
|||
for (String tk : rst) { |
|||
span = new SpanNearQueryBuilder( |
|||
new SpanTermQueryBuilder(field, tk), anaLyRst.getSlop()).inOrder(true); |
|||
spans.add(span); |
|||
} |
|||
} else { |
|||
span = new SpanNearQueryBuilder( |
|||
new SpanTermQueryBuilder(field, shortStr), anaLyRst.getSlop()).inOrder(true); |
|||
spans.add(span); |
|||
} |
|||
List<String> lst = new LinkedList<>(); |
|||
int maxDis = 0; |
|||
for (String st : subs) { |
|||
AnalyzeResult anLyRst = getAnalyzeResult(st); |
|||
if (null == anLyRst) { |
|||
continue; |
|||
} |
|||
if (anLyRst.getSlop() > maxDis) { |
|||
maxDis = anLyRst.getSlop(); |
|||
} |
|||
List<String> rt = anLyRst.getList(); |
|||
for (String s : rt) { |
|||
if (!listContanins(lst, s)) { |
|||
lst.add(s); |
|||
} |
|||
} |
|||
} |
|||
List<SpanNotQueryBuilder> sns = new ArrayList<>(); |
|||
SpanNotQueryBuilder sn = null; |
|||
if (!lst.isEmpty()) { |
|||
List<SpanNearQueryBuilder> sners = new ArrayList<>(); |
|||
SpanNearQueryBuilder sner = null; |
|||
for (String st0 : lst) { |
|||
sner = new SpanNearQueryBuilder(new SpanTermQueryBuilder(field, st0), maxDis).inOrder(true); |
|||
sners.add(sner); |
|||
} |
|||
if (spans.size() < sners.size()) { |
|||
for (SpanNearQueryBuilder spanNearQueryBuilder : sners) { |
|||
for (SpanNearQueryBuilder span1 : spans) { |
|||
sn = new SpanNotQueryBuilder(span1, spanNearQueryBuilder); |
|||
sns.add(sn); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
return sns; |
|||
} |
|||
|
|||
public static String getBoolQueryBuilderStr(BoolQueryBuilder qb) { |
|||
String st = qb.toString(); |
|||
char[] cs = st.toCharArray(); |
|||
StringBuilder sb = new StringBuilder(); |
|||
for (char c : cs) { |
|||
if (c != '\u0000' && c != '\n' && c != '\t') { |
|||
sb.append(c); |
|||
} |
|||
} |
|||
String sb1 = sb.toString().replaceAll(" ", " "); |
|||
while (sb1.contains(" ")) { |
|||
sb1 = sb1.replaceAll(" ", " "); |
|||
} |
|||
String[] st0 = sb1.toString().split(" "); |
|||
sb = new StringBuilder(); |
|||
int num = 0; |
|||
for (String s0 : st0) { |
|||
if (!Strings.isNullOrEmpty(s0)) { |
|||
while (s0.startsWith(" ") || s0.endsWith(" ")) { |
|||
s0 = s0.trim(); |
|||
} |
|||
if (s0.startsWith("\"") || s0.startsWith("\\“")) { |
|||
num++; |
|||
} else if (s0.endsWith("\"") || s0.endsWith("\\”")) { |
|||
num--; |
|||
} |
|||
if (!"".equals(s0)) { |
|||
sb.append(s0); |
|||
} |
|||
if (num > 0) { |
|||
sb.append(" "); |
|||
} |
|||
} |
|||
} |
|||
st = "BoolQueryBuilder=" + sb.toString(); |
|||
return st; |
|||
} |
|||
|
|||
public static BoolQueryBuilder getBoolQueryBuilderFromSqlStr(String str) { |
|||
BoolQueryBuilder qb = QueryBuilders.boolQuery(); |
|||
if (Strings.isNullOrEmpty(str) || !str.startsWith("BoolQueryBuilder=")) { |
|||
return qb; |
|||
} |
|||
// str = str.replaceAll("\t", " "); |
|||
int start = str.indexOf("{"); |
|||
String jsonStr = str.substring(start); |
|||
JSONObject json = (JSONObject) JSONObject.parse(jsonStr); |
|||
if (null == json) { |
|||
return qb; |
|||
} |
|||
// QueryBuilder pqT = getQueryBuilderFromJSON(json); |
|||
// if (null != pqT && pqT instanceof BoolQueryBuilder) { |
|||
// return (BoolQueryBuilder) pqT; |
|||
// } |
|||
WrapperQueryBuilder wrapper = QueryBuilders.wrapperQuery(jsonStr); |
|||
qb.must(wrapper); |
|||
return qb; |
|||
} |
|||
|
|||
private static List<QueryBuilder> getQueryBuilderFromJSON(JSONObject json) { |
|||
if (null == json) { |
|||
return null; |
|||
} |
|||
JSONObject bool = (JSONObject) json.get("bool"); |
|||
if (TObjectUtils.isNull(bool)) { |
|||
// add term and so on |
|||
JSONObject query = (JSONObject) json.get("query_string"); |
|||
if (null != query) { |
|||
String opr = query.getString("default_operator"); |
|||
Operator op = null; |
|||
if (null != opr && opr.equalsIgnoreCase("and")) { |
|||
op = Operator.AND; |
|||
} else { |
|||
op = Operator.OR; |
|||
} |
|||
List<QueryBuilder> tqbs = new ArrayList<>(); |
|||
QueryBuilder tqb = new QueryStringQueryBuilder(query.getString("query")) |
|||
.defaultField(query.getString("default_field")).defaultOperator(op); |
|||
tqbs.add(tqb); |
|||
return tqbs; |
|||
} |
|||
JSONObject term = (JSONObject) json.get("term"); |
|||
if (null != term) { |
|||
List<QueryBuilder> tqbs = new ArrayList<>(); |
|||
QueryBuilder tqb = null; |
|||
if (null != term.get("content")) { |
|||
tqb = new TermQueryBuilder("content", term.get("content")); |
|||
} else if (null != term.get("title")) { |
|||
tqb = new TermQueryBuilder("title", term.get("title")); |
|||
} else if (null != term.get("source")) { |
|||
tqb = new TermQueryBuilder("source", term.get("source")); |
|||
} |
|||
tqbs.add(tqb); |
|||
return tqbs; |
|||
} |
|||
// match |
|||
JSONObject match = (JSONObject) json.get("match"); |
|||
if (null != match) { |
|||
JSONObject content = match.getJSONObject("content"); |
|||
if (null != content) { |
|||
List<QueryBuilder> list = new ArrayList<>(); |
|||
QueryBuilder slop = QueryBuilders |
|||
.matchPhraseQuery("content", content.getString("query")) |
|||
.slop(content.getIntValue("slop")); |
|||
list.add(slop); |
|||
return list; |
|||
} else { |
|||
JSONObject title = match.getJSONObject("title"); |
|||
if (null != title) { |
|||
List<QueryBuilder> list = new ArrayList<>(); |
|||
QueryBuilder slop = QueryBuilders.matchPhraseQuery("title", title.getString("query")) |
|||
.slop(title.getIntValue("slop")); |
|||
list.add(slop); |
|||
return list; |
|||
} |
|||
} |
|||
} |
|||
// multi_match |
|||
JSONObject multi_match = json.getJSONObject("multi_match"); |
|||
if (null != multi_match) { |
|||
String qry = multi_match.getString("query"); |
|||
JSONArray fields = (JSONArray) multi_match.get("fields"); |
|||
String[] arr = new String[fields.size()];// |
|||
for (int i = 0; i < fields.size(); i++) { |
|||
Object f = fields.get(i); |
|||
if (f instanceof String) { |
|||
arr[i] = (String) f; |
|||
} |
|||
} |
|||
int slop = multi_match.getIntValue("slop"); |
|||
// MultiMatchQueryBuilder mt = new MultiMatchQueryBuilder(); |
|||
List<QueryBuilder> list = new ArrayList<>(); |
|||
QueryBuilder multiQuery = QueryBuilders.multiMatchQuery(qry, arr).slop(slop); |
|||
list.add(multiQuery); |
|||
return list; |
|||
} |
|||
// span_term |
|||
JSONObject span_term = (JSONObject) json.getJSONObject("span_term"); |
|||
if (null != span_term) { |
|||
JSONObject content = span_term.getJSONObject("content"); |
|||
if (null != content) { |
|||
List<QueryBuilder> list = new ArrayList<>(); |
|||
QueryBuilder span_termQ = new SpanTermQueryBuilder("content", content.getString("value")); |
|||
// spanNotQ.include(span_termQ); |
|||
list.add(span_termQ); |
|||
return list; |
|||
} |
|||
JSONObject title = span_term.getJSONObject("title"); |
|||
if (null != title) { |
|||
List<QueryBuilder> list = new ArrayList<>(); |
|||
QueryBuilder span_termQ = new SpanTermQueryBuilder("title", title.getString("value")); |
|||
list.add(span_termQ); |
|||
return list; |
|||
} |
|||
} |
|||
// span_not |
|||
JSONObject span_not = (JSONObject) json.get("span_not"); |
|||
List<QueryBuilder> span_termQ = null; |
|||
if (null != span_not) { |
|||
List<QueryBuilder> spanNotQs = new ArrayList<>(); |
|||
SpanNotQueryBuilder spanNotQ; |
|||
JSONObject include = span_not.getJSONObject("include"); |
|||
SpanNearQueryBuilder sner = null; |
|||
if (null != include) { |
|||
span_termQ = getQueryBuilderFromJSON(include); |
|||
JSONObject span_near = include.getJSONObject("span_near"); |
|||
if (null != span_near && span_near.size() > 0) { |
|||
Object array = span_near.get("clauses"); |
|||
if (null != array) { |
|||
if (array instanceof JSONObject) { |
|||
List<QueryBuilder> span_termQ2 = getQueryBuilderFromJSON((JSONObject) array); |
|||
if (null != span_termQ2 && span_termQ2.size() > 0 && |
|||
span_termQ2 instanceof SpanTermQueryBuilder) { |
|||
sner = new SpanNearQueryBuilder((SpanQueryBuilder) span_termQ2.get(0), 0).inOrder(true); |
|||
} |
|||
} else if (array instanceof JSONArray) { |
|||
ListIterator<Object> arr = ((JSONArray) array).listIterator(); |
|||
while (arr.hasNext()) { |
|||
Object obj = arr.next(); |
|||
if (null == obj) |
|||
continue; |
|||
JSONObject jsn = (JSONObject) obj; |
|||
List<QueryBuilder> span_termQ2 = getQueryBuilderFromJSON((JSONObject) jsn); |
|||
if (null != span_termQ2 && span_termQ2.size() > 0 && span_termQ2 instanceof SpanTermQueryBuilder) { |
|||
sner = new SpanNearQueryBuilder((SpanQueryBuilder) span_termQ2.get(0), 0) |
|||
.inOrder(true); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
JSONObject exclude = span_not.getJSONObject("exclude"); |
|||
SpanNearQueryBuilder snerExclude = null; |
|||
if (null != exclude) { |
|||
JSONObject span_near = exclude.getJSONObject("span_near"); |
|||
if (null != span_near) { |
|||
Object array = span_near.get("clauses"); |
|||
if (null != array) { |
|||
if (array instanceof JSONObject) { |
|||
List<QueryBuilder> span_termQs = getQueryBuilderFromJSON((JSONObject) array); |
|||
if (null != span_termQs && span_termQs.size() > 0 && span_termQs instanceof SpanTermQueryBuilder) { |
|||
// spanNotQ..exclude((SpanTermQueryBuilder) |
|||
// span_termQ); |
|||
snerExclude = new SpanNearQueryBuilder((SpanQueryBuilder) span_termQs.get(0), 0).inOrder(true); |
|||
} |
|||
} else if (array instanceof JSONArray) { |
|||
ListIterator<Object> arr = ((JSONArray) array).listIterator(); |
|||
while (arr.hasNext()) { |
|||
Object obj = arr.next(); |
|||
if (null == obj) |
|||
continue; |
|||
JSONObject jsn = (JSONObject) obj; |
|||
List<QueryBuilder> span_termQs = getQueryBuilderFromJSON((JSONObject) jsn); |
|||
if (null != span_termQs && span_termQs.size() > 0 && span_termQs instanceof SpanTermQueryBuilder) { |
|||
// spanNotQ.exclude((SpanTermQueryBuilder) |
|||
// span_termQ); |
|||
snerExclude = new SpanNearQueryBuilder((SpanQueryBuilder) span_termQs.get(0), 0).inOrder(true); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
if (span_termQ != null && snerExclude != null) { |
|||
spanNotQ = new SpanNotQueryBuilder((SpanQueryBuilder) span_termQ, snerExclude); |
|||
spanNotQs.add(spanNotQ); |
|||
} |
|||
if (sner != null && snerExclude != null) { |
|||
spanNotQ = new SpanNotQueryBuilder(sner, snerExclude); |
|||
spanNotQs.add(spanNotQ); |
|||
} |
|||
return spanNotQs; |
|||
} |
|||
return null; |
|||
} |
|||
// add child BoolQueryBuilder |
|||
List<QueryBuilder> pqbs = new ArrayList<>(); |
|||
BoolQueryBuilder pqb = new BoolQueryBuilder(); |
|||
// |
|||
Object filter = bool.get("filter"); |
|||
if (filter instanceof JSONObject) { |
|||
JSONObject obj = (JSONObject) filter; |
|||
if (null != obj) { |
|||
List<QueryBuilder> qb = getQueryBuilderFromJSON(obj); |
|||
if (null != qb) { |
|||
pqb.filter(qb.get(0)); |
|||
} |
|||
} |
|||
} else if (filter instanceof JSONArray) { |
|||
JSONArray array = (JSONArray) filter; |
|||
JSONObject[] objs = new JSONObject[array.size()]; |
|||
array.toArray(objs); |
|||
for (JSONObject obj : objs) { |
|||
List<QueryBuilder> qb = getQueryBuilderFromJSON(obj); |
|||
if (null != qb) { |
|||
pqb.filter(qb.get(0)); |
|||
} |
|||
} |
|||
} |
|||
pqbs.add(pqb); |
|||
// |
|||
Object mst = bool.get("must"); |
|||
if (mst instanceof JSONObject) { |
|||
JSONObject obj = (JSONObject) mst; |
|||
if (null != obj) { |
|||
List<QueryBuilder> qb = getQueryBuilderFromJSON(obj); |
|||
if (null != qb) { |
|||
pqb.must(qb.get(0)); |
|||
} |
|||
} |
|||
} else if (mst instanceof JSONArray) { |
|||
JSONArray array = (JSONArray) mst; |
|||
JSONObject[] objs = new JSONObject[array.size()]; |
|||
array.toArray(objs); |
|||
for (JSONObject obj : objs) { |
|||
List<QueryBuilder> qb = getQueryBuilderFromJSON(obj); |
|||
if (null != qb) { |
|||
pqb.must(qb.get(0)); |
|||
} |
|||
} |
|||
} |
|||
pqbs.add(pqb); |
|||
Object mstNot = bool.get("must_not"); |
|||
if (mstNot instanceof JSONObject) { |
|||
JSONObject obj = (JSONObject) mstNot; |
|||
if (null != obj) { |
|||
List<QueryBuilder> qb = getQueryBuilderFromJSON(obj); |
|||
if (null != qb) { |
|||
pqb.mustNot(qb.get(0)); |
|||
} |
|||
} |
|||
} else if (mstNot instanceof JSONArray) { |
|||
JSONArray array = (JSONArray) mstNot; |
|||
JSONObject[] objs = new JSONObject[array.size()]; |
|||
array.toArray(objs); |
|||
for (JSONObject obj : objs) { |
|||
if (null != obj) { |
|||
List<QueryBuilder> qb = getQueryBuilderFromJSON(obj); |
|||
if (null != qb) { |
|||
pqb.mustNot(qb.get(0)); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
pqbs.add(pqb); |
|||
Object should = bool.get("should"); |
|||
if (should instanceof JSONObject) { |
|||
JSONObject obj = (JSONObject) should; |
|||
if (null != obj) { |
|||
List<QueryBuilder> qb = getQueryBuilderFromJSON(obj); |
|||
if (null != qb) { |
|||
pqb.mustNot(qb.get(0)); |
|||
} |
|||
} |
|||
} else if (should instanceof JSONArray) { |
|||
JSONArray array = (JSONArray) should; |
|||
JSONObject[] objs = new JSONObject[array.size()]; |
|||
array.toArray(objs); |
|||
for (JSONObject obj : objs) { |
|||
if (null != obj) { |
|||
List<QueryBuilder> qb = getQueryBuilderFromJSON(obj); |
|||
if (null != qb) { |
|||
pqb.mustNot(qb.get(0)); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
pqbs.add(pqb); |
|||
return pqbs; |
|||
} |
|||
|
|||
private static class AnalyzeResult { |
|||
private int slop = 0; |
|||
private List<String> list; |
|||
|
|||
public AnalyzeResult() { |
|||
} |
|||
|
|||
public AnalyzeResult(int slop, List<String> lst) { |
|||
this.slop = slop; |
|||
this.list = lst; |
|||
} |
|||
|
|||
public int getSlop() { |
|||
return slop; |
|||
} |
|||
|
|||
public void setSlop(int slop) { |
|||
this.slop = slop; |
|||
} |
|||
|
|||
public List<String> getList() { |
|||
return list; |
|||
} |
|||
|
|||
public void setList(List<String> list) { |
|||
this.list = list; |
|||
} |
|||
} |
|||
|
|||
private static AnalyzeResult getAnalyzeResult(String termStr) { |
|||
if (Strings.isNullOrEmpty(termStr)) { |
|||
return null; |
|||
} |
|||
AnalyzeResult rst = new AnalyzeResult(); |
|||
List<String> list = new ArrayList<>(); |
|||
if (termStr.trim().length() == 1) { |
|||
list.add(termStr); |
|||
rst.setList(list); |
|||
rst.setSlop(0); |
|||
return rst; |
|||
} |
|||
ESServerUtils esServerUtil = new ESServerUtils(); |
|||
// todo |
|||
if (null == esServerUtil.getClientByClusterId(1L)) { |
|||
esServerUtil.initEsServer(); |
|||
} |
|||
// TODO |
|||
IndicesAdminClient adminClient = esServerUtil.getClientByClusterId(1L).admin().indices(); |
|||
// ESHandler esHandler = ESHandler.getESHandler("bfd_mediaforce", "192.168.189.84:9300"); |
|||
// IndicesAdminClient adminClient = esHandler.getClient().admin().indices(); |
|||
// |
|||
AnalyzeResponse analyzeResponse = adminClient.prepareAnalyze(termStr).setAnalyzer("ik").execute().actionGet(); |
|||
List<AnalyzeToken> lst = analyzeResponse.getTokens(); |
|||
// 分词失败 |
|||
if (null == lst || lst.isEmpty()) { |
|||
list.add(termStr); |
|||
rst.setList(list); |
|||
rst.setSlop(0); |
|||
return rst; |
|||
} else { |
|||
HashSet<AnalyzeToken> exclude = new HashSet<>(); |
|||
for (AnalyzeToken tk : lst) { |
|||
for (AnalyzeToken at : lst) { |
|||
if (!tk.getTerm().equals(at.getTerm()) && at.getTerm().contains(tk.getTerm())) { |
|||
exclude.add(tk); |
|||
} |
|||
} |
|||
} |
|||
List<AnalyzeToken> waitLst = new ArrayList<>(); |
|||
for (AnalyzeToken tk : lst) { |
|||
if (!exclude.contains(tk)) { |
|||
waitLst.add(tk); |
|||
} |
|||
} |
|||
if (waitLst.size() == 1) { |
|||
list.add(waitLst.get(0).getTerm()); |
|||
rst.setList(list); |
|||
rst.setSlop(0); |
|||
return rst; |
|||
} |
|||
// multi-term |
|||
int maxDistance = 0; |
|||
for (int i = 0; i < waitLst.size(); i++) { |
|||
AnalyzeToken tk = waitLst.get(i); |
|||
list.add(tk.getTerm()); |
|||
if (i > 0) { |
|||
AnalyzeToken prv = waitLst.get(i - 1); |
|||
int dis = tk.getPosition() - prv.getPosition() - 1; |
|||
if (dis > maxDistance) { |
|||
maxDistance = dis; |
|||
} |
|||
} |
|||
} |
|||
rst.setList(list); |
|||
rst.setSlop(maxDistance); |
|||
} |
|||
// list = dropShorterStr(list); |
|||
return rst; |
|||
} |
|||
|
|||
private static List<String> dropShorterStr(List<String> lst) { |
|||
if (null == lst || lst.isEmpty()) { |
|||
return null; |
|||
} |
|||
HashSet<String> set = new HashSet<>();// 要排除的term |
|||
for (String st : lst) { |
|||
// 删除较短的分词term |
|||
for (String s : lst) { |
|||
if (!st.equals(s) && s.contains(st)) { |
|||
// lst.remove(st); |
|||
set.add(st); |
|||
} |
|||
} |
|||
} |
|||
List<String> rst = new ArrayList<>(); |
|||
for (String st0 : lst) { |
|||
if (!set.contains(st0)) { |
|||
rst.add(st0); |
|||
} |
|||
} |
|||
return rst; |
|||
} |
|||
|
|||
private static boolean listContanins(List<String> lst, String str) { |
|||
if (null == lst || lst.isEmpty()) { |
|||
return false; |
|||
} |
|||
for (String st : lst) { |
|||
if (st.equals(str)) { |
|||
return true; |
|||
} |
|||
} |
|||
return false; |
|||
} |
|||
} |
|||
@ -1,18 +0,0 @@ |
|||
log4j.rootLogger=INFO, error |
|||
|
|||
###### error appender definition ####### |
|||
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender |
|||
log4j.appender.error.File=logs/sdkclient_error.log |
|||
log4j.appender.error.Append=true |
|||
log4j.appender.error.DatePattern='.'yyyy-MM-dd-HH |
|||
log4j.appender.error.layout=org.apache.log4j.PatternLayout |
|||
log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c] %m%n |
|||
|
|||
#error only |
|||
log4j.appender.error.filter.F1=org.apache.log4j.varia.LevelRangeFilter |
|||
log4j.appender.error.filter.F1.LevelMin=ERROR |
|||
log4j.appender.error.filter.F1.LevelMax=ERROR |
|||
# |
|||
log4j.appender.error.filter.F2=org.apache.log4j.varia.LevelMatchFilter |
|||
log4j.appender.error.filter.F2.levelToMatch=WARN |
|||
log4j.appender.error.filter.F2.acceptOnMatch=false |
|||
@ -1,32 +0,0 @@ |
|||
#### ����### |
|||
#log4j.rootLogger = stdout,D,E,I |
|||
# |
|||
#### �����Ϣ������̧ ### |
|||
#log4j.appender.stdout = org.apache.log4j.ConsoleAppender |
|||
#log4j.appender.stdout.Target = System.out |
|||
#log4j.appender.stdout.layout = org.apache.log4j.PatternLayout |
|||
#log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n |
|||
# |
|||
#### ���INFO �������ϵ���־�ļ����� ### |
|||
#log4j.appender.I = org.apache.log4j.DailyRollingFileAppender |
|||
#log4j.appender.I.File = log_info.log |
|||
#log4j.appender.I.Append = true |
|||
#log4j.appender.I.Threshold = INFO |
|||
#log4j.appender.I.layout = org.apache.log4j.PatternLayout |
|||
#log4j.appender.I.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n |
|||
# |
|||
#### ���DEBUG �������ϵ���־�ļ����� ### |
|||
#log4j.appender.D = org.apache.log4j.DailyRollingFileAppender |
|||
#log4j.appender.D.File = log_debug.log |
|||
#log4j.appender.D.Append = true |
|||
#log4j.appender.D.Threshold = INFO |
|||
#log4j.appender.D.layout = org.apache.log4j.PatternLayout |
|||
#log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n |
|||
# |
|||
#### ���ERROR �������ϵ���־�ļ����� ### |
|||
#log4j.appender.E = org.apache.log4j.DailyRollingFileAppender |
|||
#log4j.appender.E.File = log_error.log |
|||
#log4j.appender.E.Append = true |
|||
#log4j.appender.E.Threshold = ERROR |
|||
#log4j.appender.E.layout = org.apache.log4j.PatternLayout |
|||
#log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue