39 changed files with 4457 additions and 768 deletions
-
4.idea/compiler.xml
-
2.idea/encodings.xml
-
13.idea/libraries/Maven__com_alibaba_fastjson_1_1_22.xml
-
6.idea/misc.xml
-
3.idea/modules.xml
-
174cl_query_data_job/cl_query_data_job.iml
-
173cl_search_api/cl_search_api.iml
-
12cl_search_api/pom.xml
-
2cl_search_api/src/main/java/com/bfd/mf/SearchApplication.java
-
33cl_search_api/src/main/java/com/bfd/mf/common/service/cache/TopicQueryService.java
-
209cl_search_api/src/main/java/com/bfd/mf/common/service/es/BaseFieldEnum.java
-
416cl_search_api/src/main/java/com/bfd/mf/common/service/es/BaseSearchQuery.java
-
879cl_search_api/src/main/java/com/bfd/mf/common/service/es/EsBase.java
-
240cl_search_api/src/main/java/com/bfd/mf/common/service/es/EsBaseParam.java
-
277cl_search_api/src/main/java/com/bfd/mf/common/service/es/EsDTO.java
-
140cl_search_api/src/main/java/com/bfd/mf/common/service/es/EsQueryServiceForSQMini.java
-
416cl_search_api/src/main/java/com/bfd/mf/common/service/es/GetQueryBuilder.java
-
118cl_search_api/src/main/java/com/bfd/mf/common/service/es/HighLevelQuery.java
-
4cl_search_api/src/main/java/com/bfd/mf/common/service/es/ParseSearchScopeService.java
-
11cl_search_api/src/main/java/com/bfd/mf/common/util/constants/ESConstant.java
-
209cl_search_api/src/main/java/com/bfd/mf/common/util/enums/BaseFieldEnum.java
-
15cl_search_api/src/main/java/com/bfd/mf/common/util/enums/DocumentFieldEnum.java
-
138cl_search_api/src/main/java/com/bfd/mf/common/util/enums/SearchExpressionEnum.java
-
160cl_search_api/src/main/java/com/bfd/mf/common/util/enums/SearchMatchTypeEnum.java
-
218cl_search_api/src/main/java/com/bfd/mf/common/util/enums/SearchScopeEnum.java
-
71cl_search_api/src/main/java/com/bfd/mf/common/util/enums/SearchWordStrategyEnum.java
-
328cl_search_api/src/main/java/com/bfd/mf/common/util/es/EsUtils.java
-
13cl_search_api/src/main/java/com/bfd/mf/common/util/slice/SliceScrollUtil.java
-
12cl_search_api/src/main/java/com/bfd/mf/common/util/utility/CollectionUtils.java
-
22cl_search_api/src/main/java/com/bfd/mf/common/web/repository/mysql/topic/TaskRepository.java
-
109cl_search_api/src/main/java/com/bfd/mf/common/web/vo/params/QueryRequest.java
-
28cl_search_api/src/main/java/com/bfd/mf/common/web/vo/view/monitor/ESMonitorBaseEntity.java
-
137cl_search_api/src/main/java/com/bfd/mf/controller/SearchDataController.java
-
18cl_search_api/src/main/java/com/bfd/mf/service/SearchAnalysisService.java
-
109cl_search_api/src/main/java/com/bfd/mf/service/SearchAuthorService.java
-
370cl_search_api/src/main/java/com/bfd/mf/service/SearchDataService.java
-
61cl_search_api/src/main/resources/application-113.yml
-
61cl_search_api/src/main/resources/application-134.yml
-
14cl_search_api/src/main/resources/application.yml
@ -1,13 +0,0 @@ |
|||||
<component name="libraryTable"> |
|
||||
<library name="Maven: com.alibaba:fastjson:1.1.22"> |
|
||||
<CLASSES> |
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/alibaba/fastjson/1.1.22/fastjson-1.1.22.jar!/" /> |
|
||||
</CLASSES> |
|
||||
<JAVADOC> |
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/alibaba/fastjson/1.1.22/fastjson-1.1.22-javadoc.jar!/" /> |
|
||||
</JAVADOC> |
|
||||
<SOURCES> |
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/alibaba/fastjson/1.1.22/fastjson-1.1.22-sources.jar!/" /> |
|
||||
</SOURCES> |
|
||||
</library> |
|
||||
</component> |
|
@ -0,0 +1,209 @@ |
|||||
|
package com.bfd.mf.common.service.es; |
||||
|
|
||||
|
import java.util.Arrays; |
||||
|
import java.util.HashMap; |
||||
|
import java.util.Map; |
||||
|
|
||||
|
/** |
||||
|
* 文档-网页-图片索引属性枚举 |
||||
|
* @author lihonghao |
||||
|
*/ |
||||
|
public enum BaseFieldEnum { |
||||
|
/** |
||||
|
* 文件id |
||||
|
*/ |
||||
|
id, |
||||
|
/** |
||||
|
* 文件md5值 |
||||
|
*/ |
||||
|
md5, |
||||
|
/** |
||||
|
* 文件标题 |
||||
|
*/ |
||||
|
title, |
||||
|
/** |
||||
|
* 摘要 |
||||
|
*/ |
||||
|
summary, |
||||
|
/** |
||||
|
* 文档内容 |
||||
|
*/ |
||||
|
content, |
||||
|
/** |
||||
|
* 数据来源 |
||||
|
*/ |
||||
|
source, |
||||
|
/** |
||||
|
* 原文/译文 |
||||
|
*/ |
||||
|
type, |
||||
|
/** |
||||
|
* 原文id |
||||
|
*/ |
||||
|
original_id, |
||||
|
/** |
||||
|
*入库时间 |
||||
|
*/ |
||||
|
create_time, |
||||
|
/** |
||||
|
* 文档语言 |
||||
|
*/ |
||||
|
language, |
||||
|
/** |
||||
|
* 上传用户 |
||||
|
*/ |
||||
|
upload_user, |
||||
|
/** |
||||
|
* 上传用户姓名 |
||||
|
*/ |
||||
|
upload_user_name, |
||||
|
/** |
||||
|
* 是否删除 |
||||
|
*/ |
||||
|
del, |
||||
|
/** |
||||
|
* 网站枚举 |
||||
|
*/ |
||||
|
website, |
||||
|
/** |
||||
|
* 发布人 |
||||
|
*/ |
||||
|
publisher, |
||||
|
/** |
||||
|
* 发布时间 |
||||
|
*/ |
||||
|
public_time, |
||||
|
/** |
||||
|
* 网站版面 |
||||
|
*/ |
||||
|
cate_md5, |
||||
|
/** |
||||
|
* 智能标签 |
||||
|
*/ |
||||
|
ai_tag, |
||||
|
/** |
||||
|
* 智能地区 |
||||
|
*/ |
||||
|
ai_area, |
||||
|
/** |
||||
|
* 主题一级分类 |
||||
|
*/ |
||||
|
subject_classify1, |
||||
|
/** |
||||
|
* 主题二级分类 |
||||
|
*/ |
||||
|
subject_classify2, |
||||
|
/** |
||||
|
* 主题 |
||||
|
*/ |
||||
|
subject, |
||||
|
/** |
||||
|
* 渠道 |
||||
|
*/ |
||||
|
channel, |
||||
|
/** |
||||
|
* 审核状态 |
||||
|
*/ |
||||
|
audit_state, |
||||
|
/** |
||||
|
* 用户上传文档,归属部门 |
||||
|
*/ |
||||
|
department_id, |
||||
|
/** |
||||
|
* 整编状态 |
||||
|
*/ |
||||
|
edit_state, |
||||
|
|
||||
|
/** |
||||
|
* 敏感词 |
||||
|
*/ |
||||
|
sensitive_tag, |
||||
|
/** |
||||
|
* 置顶状态 |
||||
|
*/ |
||||
|
flag_top, |
||||
|
/** |
||||
|
* 置顶有效期 |
||||
|
*/ |
||||
|
flag_top_validity, |
||||
|
/** |
||||
|
* 0-无 1-不重要 2-有点重要 3-一般、4-重要、5-非常重要 |
||||
|
*/ |
||||
|
flag_importance, |
||||
|
/** |
||||
|
* 分类标签 |
||||
|
*/ |
||||
|
subject_tag, |
||||
|
/** |
||||
|
* 事件id |
||||
|
*/ |
||||
|
event_id, |
||||
|
/** |
||||
|
* 事件id |
||||
|
*/ |
||||
|
event_detect_time, |
||||
|
/** |
||||
|
* 重复校验字段 |
||||
|
*/ |
||||
|
duplicate_key, |
||||
|
/** |
||||
|
* 媒体类型 |
||||
|
*/ |
||||
|
media_type, |
||||
|
/** |
||||
|
* 文中提及的标准时间 |
||||
|
*/ |
||||
|
norm_time, |
||||
|
/** |
||||
|
* 时间间隔(天) |
||||
|
*/ |
||||
|
delay_time, |
||||
|
/** |
||||
|
* 省名称 |
||||
|
*/ |
||||
|
province_code, |
||||
|
/** |
||||
|
* 市名称 |
||||
|
*/ |
||||
|
city_code, |
||||
|
/** |
||||
|
* 区县 |
||||
|
*/ |
||||
|
county_code, |
||||
|
|
||||
|
; |
||||
|
|
||||
|
/** |
||||
|
* 需要进行匹配的属性 |
||||
|
* @return |
||||
|
*/ |
||||
|
public static Map<String, Float> getMatchFields(){ |
||||
|
Map<String, Float> matchMap = new HashMap<>(2); |
||||
|
matchMap.put(BaseFieldEnum.title.name(), 2.0F); |
||||
|
matchMap.put(BaseFieldEnum.content.name(), 1.0F); |
||||
|
return matchMap; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 需要进行匹配的属性-含拼音 |
||||
|
* @return |
||||
|
*/ |
||||
|
public static Map<String, Float> getMatchFieldsWithPy(){ |
||||
|
Map<String, Float> matchMap = getMatchFields(); |
||||
|
Map<String, Float> pyMap = new HashMap<>(matchMap.size() * 2); |
||||
|
matchMap.forEach((k, v) -> { |
||||
|
pyMap.put(k, v); |
||||
|
/// 系统中取消拼音搜索 |
||||
|
//pyMap.put(k.concat(EsBase.ES_PINYIN_SUFFIX), v/10); |
||||
|
}); |
||||
|
return pyMap; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取全部属性名 |
||||
|
* @return |
||||
|
*/ |
||||
|
public static String[] getAllFields(){ |
||||
|
return Arrays.stream(values()).map(BaseFieldEnum::name).toArray(String[]::new); |
||||
|
} |
||||
|
} |
@ -0,0 +1,416 @@ |
|||||
|
//package com.bfd.mf.common.service.es; |
||||
|
// |
||||
|
//import cn.percent.common.base.BasePageQuery; |
||||
|
//import cn.percent.modules.ais.enums.SearchMatchTypeEnum; |
||||
|
//import io.swagger.annotations.ApiModel; |
||||
|
//import io.swagger.annotations.ApiModelProperty; |
||||
|
// |
||||
|
//import java.util.List; |
||||
|
//import java.util.stream.Collectors; |
||||
|
// |
||||
|
///** |
||||
|
// * 检索查询基础类 |
||||
|
// * |
||||
|
// * @author lihonghao |
||||
|
// */ |
||||
|
//@ApiModel(value = "BaseSearchQuery") |
||||
|
//public class BaseSearchQuery extends BasePageQuery { |
||||
|
// |
||||
|
// /** |
||||
|
// * 限制数据主键范围 |
||||
|
// */ |
||||
|
// @ApiModelProperty(value = "documentId限制数据主键范围", hidden = true) |
||||
|
// private String[] documentId; |
||||
|
// /** |
||||
|
// * 二次搜索关键词 |
||||
|
// */ |
||||
|
// @ApiModelProperty(value = "二次搜索关键词") |
||||
|
// private String sk; |
||||
|
// /** |
||||
|
// * 排除关键词 |
||||
|
// */ |
||||
|
// @ApiModelProperty(value = "排除关键词") |
||||
|
// private String nk; |
||||
|
// /** |
||||
|
// * 标题搜索 |
||||
|
// */ |
||||
|
// @ApiModelProperty(value = "标题搜索") |
||||
|
// private String title; |
||||
|
// /** |
||||
|
// * 是否高亮 |
||||
|
// */ |
||||
|
// @ApiModelProperty(value = "是否高亮, 默认高亮") |
||||
|
// private Boolean highlight = true; |
||||
|
// /** |
||||
|
// * 原文译文 |
||||
|
// */ |
||||
|
// @ApiModelProperty(value = "原文译文,多值逗号分隔 /enum/contentType枚举值") |
||||
|
// private List<String> contentTypeList; |
||||
|
// /** |
||||
|
// * 开始时间 |
||||
|
// */ |
||||
|
// @ApiModelProperty(value = "开始时间") |
||||
|
// private Long beginTime; |
||||
|
// /** |
||||
|
// * 结束时间 |
||||
|
// */ |
||||
|
// @ApiModelProperty(value = "结束时间") |
||||
|
// private Long endTime; |
||||
|
// /** |
||||
|
// * 上传用户 |
||||
|
// */ |
||||
|
// @ApiModelProperty(value = "是否只展示当前用户数据 1-是 0-否 默认否") |
||||
|
// private Integer onlyMine; |
||||
|
// /** |
||||
|
// * 上传用户 |
||||
|
// */ |
||||
|
// @ApiModelProperty(value = "上传用户账号", hidden = true) |
||||
|
// private String uploadUser; |
||||
|
// /** |
||||
|
// * 文档来源 |
||||
|
// */ |
||||
|
// @ApiModelProperty(value = "文档来源,多值逗号分隔 /enum/source枚举值") |
||||
|
// private List<String> sourceList; |
||||
|
// /** |
||||
|
// * 语言 |
||||
|
// */ |
||||
|
// @ApiModelProperty(value = "语言,多值逗号分隔或数组") |
||||
|
// private List<String> languageList; |
||||
|
// /** |
||||
|
// * 语言 |
||||
|
// */ |
||||
|
// @ApiModelProperty(value = "智能标签,多值逗号分隔或数组") |
||||
|
// private List<String> aiTagList; |
||||
|
// /** |
||||
|
// * 语言 |
||||
|
// */ |
||||
|
// @ApiModelProperty(value = "智能地区,多值逗号分隔或数组") |
||||
|
// private List<String> aiAreaList; |
||||
|
// /** |
||||
|
// * 主题一级分类 |
||||
|
// */ |
||||
|
// @ApiModelProperty(value = "主题一级分类编码, 默认全部") |
||||
|
// private String subjectClassify1; |
||||
|
// /** |
||||
|
// * 主题2级分类 |
||||
|
// */ |
||||
|
// @ApiModelProperty(value = "主题2级分类编码, 默认全部") |
||||
|
// private String subjectClassify2; |
||||
|
// /** |
||||
|
// * 主题 |
||||
|
// */ |
||||
|
// @ApiModelProperty(value = "主题编码,多值逗号分隔或数组") |
||||
|
// private List<String> subjectList; |
||||
|
// /** |
||||
|
// * 网站 |
||||
|
// */ |
||||
|
// @ApiModelProperty(value = "网站 /enum/website枚举值,单值") |
||||
|
// public String website; |
||||
|
// /** |
||||
|
// * 网站 |
||||
|
// */ |
||||
|
// @ApiModelProperty(value = "网站 /enum/website枚举值,多值逗号分隔或数组") |
||||
|
// public List<String> websiteList; |
||||
|
// /** |
||||
|
// * 所属网站的版面--面包夹 |
||||
|
// */ |
||||
|
// @ApiModelProperty(value = "所属网站的版面--面包夹md5,多值逗号分隔或数组") |
||||
|
// private List<String> cateMd5List; |
||||
|
// /** |
||||
|
// * 升序降序 |
||||
|
// */ |
||||
|
// @ApiModelProperty(value = "升序降序 1升序 2降序,默认降序排列") |
||||
|
// private Integer order = 2; |
||||
|
// /** |
||||
|
// * 排序类型 |
||||
|
// */ |
||||
|
// @ApiModelProperty(value = "排序类型:1相关度排序 2时间排序,默认相关度排序") |
||||
|
// private Integer orderType = 1; |
||||
|
// /** |
||||
|
// * 高级搜索 |
||||
|
// */ |
||||
|
// @ApiModelProperty(value = "高级搜索") |
||||
|
// private List<HighLevelQuery> highLevelQueries; |
||||
|
// |
||||
|
// /** |
||||
|
// * 精确搜索--提取出的短语集合 |
||||
|
// */ |
||||
|
// @ApiModelProperty(hidden = true) |
||||
|
// private List<String> accurateList; |
||||
|
// /** |
||||
|
// * 渠道 |
||||
|
// */ |
||||
|
// @ApiModelProperty(value = "渠道数据来源") |
||||
|
// private List<String> channelList; |
||||
|
// /** |
||||
|
// * 文档审核状态 |
||||
|
// */ |
||||
|
// @ApiModelProperty(value = "文档审核状态 0-未审核,1-审核通过, 2-审核不通过") |
||||
|
// private List<Integer> auditStateList; |
||||
|
// /** |
||||
|
// * 实体类型 |
||||
|
// */ |
||||
|
// @ApiModelProperty(value = "实体类型") |
||||
|
// private List<Integer> ontologyIdList; |
||||
|
// /** |
||||
|
// * 是否高级搜索 |
||||
|
// * |
||||
|
// * @return |
||||
|
// */ |
||||
|
// @ApiModelProperty(hidden = true) |
||||
|
// public boolean isHighLevel() { |
||||
|
// return highLevelQueries != null && !highLevelQueries.isEmpty(); |
||||
|
// } |
||||
|
// |
||||
|
// /** |
||||
|
// * 是否精确搜索 |
||||
|
// * |
||||
|
// * @return |
||||
|
// */ |
||||
|
// @ApiModelProperty(hidden = true) |
||||
|
// public boolean isAccurateQuery() { |
||||
|
// return null != accurateList && !accurateList.isEmpty(); |
||||
|
// } |
||||
|
// |
||||
|
// |
||||
|
// /** |
||||
|
// * 是否是跨度搜索 |
||||
|
// * |
||||
|
// * @return |
||||
|
// */ |
||||
|
// @ApiModelProperty(hidden = true) |
||||
|
// public boolean isSpanQuery() { |
||||
|
// return this.isHighLevel() && highLevelQueries.stream().anyMatch(e -> SearchMatchTypeEnum.PARAGRAPH.equals(e.getMatchType()) || SearchMatchTypeEnum.SENTENCE.equals(e.getMatchType())); |
||||
|
// } |
||||
|
// |
||||
|
// /** |
||||
|
// * 部门,0-不查询部门,1-查询用户所在部门 |
||||
|
// */ |
||||
|
// @ApiModelProperty(value = "部门,0-不查询部门,1-查询用户所在部门") |
||||
|
// private String onlyDepartment; |
||||
|
// |
||||
|
// public String getOnlyDepartment() { |
||||
|
// return onlyDepartment; |
||||
|
// } |
||||
|
// |
||||
|
// public void setOnlyDepartment(String onlyDepartment) { |
||||
|
// this.onlyDepartment = onlyDepartment; |
||||
|
// } |
||||
|
// |
||||
|
// public String[] getDocumentId() { |
||||
|
// return documentId; |
||||
|
// } |
||||
|
// |
||||
|
// public void setDocumentId(String... documentId) { |
||||
|
// this.documentId = documentId; |
||||
|
// } |
||||
|
// |
||||
|
// public String getTitle() { |
||||
|
// return title; |
||||
|
// } |
||||
|
// |
||||
|
// public void setTitle(String title) { |
||||
|
// this.title = title; |
||||
|
// } |
||||
|
// |
||||
|
// public Boolean getHighlight() { |
||||
|
// return highlight; |
||||
|
// } |
||||
|
// |
||||
|
// public void setHighlight(Boolean highlight) { |
||||
|
// this.highlight = highlight; |
||||
|
// } |
||||
|
// |
||||
|
// public Long getBeginTime() { |
||||
|
// return beginTime; |
||||
|
// } |
||||
|
// |
||||
|
// public void setBeginTime(Long beginTime) { |
||||
|
// this.beginTime = beginTime; |
||||
|
// } |
||||
|
// |
||||
|
// public Long getEndTime() { |
||||
|
// return endTime; |
||||
|
// } |
||||
|
// |
||||
|
// public void setEndTime(Long endTime) { |
||||
|
// this.endTime = endTime; |
||||
|
// } |
||||
|
// |
||||
|
// public String getUploadUser() { |
||||
|
// return uploadUser; |
||||
|
// } |
||||
|
// |
||||
|
// public void setUploadUser(String uploadUser) { |
||||
|
// this.uploadUser = uploadUser; |
||||
|
// } |
||||
|
// |
||||
|
// public List<String> getLanguageList() { |
||||
|
// return languageList; |
||||
|
// } |
||||
|
// |
||||
|
// public void setLanguageList(List<String> languageList) { |
||||
|
// this.languageList = languageList; |
||||
|
// } |
||||
|
// |
||||
|
// public Integer getOrder() { |
||||
|
// return order; |
||||
|
// } |
||||
|
// |
||||
|
// public void setOrder(Integer order) { |
||||
|
// this.order = order; |
||||
|
// } |
||||
|
// |
||||
|
// public Integer getOrderType() { |
||||
|
// return orderType; |
||||
|
// } |
||||
|
// |
||||
|
// public void setOrderType(Integer orderType) { |
||||
|
// this.orderType = orderType; |
||||
|
// } |
||||
|
// |
||||
|
// public String getSk() { |
||||
|
// return sk; |
||||
|
// } |
||||
|
// |
||||
|
// public void setSk(String sk) { |
||||
|
// this.sk = sk; |
||||
|
// } |
||||
|
// |
||||
|
// public List<HighLevelQuery> getHighLevelQueries() { |
||||
|
// return highLevelQueries; |
||||
|
// } |
||||
|
// |
||||
|
// public void setHighLevelQueries(List<HighLevelQuery> highLevelQueries) { |
||||
|
// this.highLevelQueries = highLevelQueries == null ? null : highLevelQueries.stream().filter(HighLevelQuery::isAvailable).collect(Collectors.toList()); |
||||
|
// } |
||||
|
// |
||||
|
// public List<String> getContentTypeList() { |
||||
|
// return contentTypeList; |
||||
|
// } |
||||
|
// |
||||
|
// public void setContentTypeList(List<String> contentTypeList) { |
||||
|
// this.contentTypeList = contentTypeList; |
||||
|
// } |
||||
|
// |
||||
|
// public Integer getOnlyMine() { |
||||
|
// return onlyMine; |
||||
|
// } |
||||
|
// |
||||
|
// public void setOnlyMine(Integer onlyMine) { |
||||
|
// this.onlyMine = onlyMine; |
||||
|
// } |
||||
|
// |
||||
|
// public List<String> getSourceList() { |
||||
|
// return sourceList; |
||||
|
// } |
||||
|
// |
||||
|
// public void setSourceList(List<String> sourceList) { |
||||
|
// this.sourceList = sourceList; |
||||
|
// } |
||||
|
// |
||||
|
// public List<String> getAiTagList() { |
||||
|
// return aiTagList; |
||||
|
// } |
||||
|
// |
||||
|
// public void setAiTagList(List<String> aiTagList) { |
||||
|
// this.aiTagList = aiTagList; |
||||
|
// } |
||||
|
// |
||||
|
// public List<String> getAiAreaList() { |
||||
|
// return aiAreaList; |
||||
|
// } |
||||
|
// |
||||
|
// public void setAiAreaList(List<String> aiAreaList) { |
||||
|
// this.aiAreaList = aiAreaList; |
||||
|
// } |
||||
|
// |
||||
|
// public String getSubjectClassify1() { |
||||
|
// return subjectClassify1; |
||||
|
// } |
||||
|
// |
||||
|
// public void setSubjectClassify1(String subjectClassify1) { |
||||
|
// this.subjectClassify1 = subjectClassify1; |
||||
|
// } |
||||
|
// |
||||
|
// public String getSubjectClassify2() { |
||||
|
// return subjectClassify2; |
||||
|
// } |
||||
|
// |
||||
|
// public void setSubjectClassify2(String subjectClassify2) { |
||||
|
// this.subjectClassify2 = subjectClassify2; |
||||
|
// } |
||||
|
// |
||||
|
// public List<String> getSubjectList() { |
||||
|
// return subjectList; |
||||
|
// } |
||||
|
// |
||||
|
// public void setSubjectList(List<String> subjectList) { |
||||
|
// this.subjectList = subjectList; |
||||
|
// } |
||||
|
// |
||||
|
// public String getWebsite() { |
||||
|
// return website; |
||||
|
// } |
||||
|
// |
||||
|
// public void setWebsite(String website) { |
||||
|
// this.website = website; |
||||
|
// } |
||||
|
// |
||||
|
// public List<String> getWebsiteList() { |
||||
|
// return websiteList; |
||||
|
// } |
||||
|
// |
||||
|
// public void setWebsiteList(List<String> websiteList) { |
||||
|
// this.websiteList = websiteList; |
||||
|
// } |
||||
|
// |
||||
|
// public List<String> getCateMd5List() { |
||||
|
// return cateMd5List; |
||||
|
// } |
||||
|
// |
||||
|
// public void setCateMd5List(List<String> cateMd5List) { |
||||
|
// this.cateMd5List = cateMd5List; |
||||
|
// } |
||||
|
// |
||||
|
// |
||||
|
// public List<String> getAccurateList() { |
||||
|
// return accurateList; |
||||
|
// } |
||||
|
// |
||||
|
// public void setAccurateList(List<String> accurateList) { |
||||
|
// this.accurateList = accurateList; |
||||
|
// } |
||||
|
// |
||||
|
// public List<String> getChannelList() { |
||||
|
// return channelList; |
||||
|
// } |
||||
|
// |
||||
|
// public void setChannelList(List<String> channelList) { |
||||
|
// this.channelList = channelList; |
||||
|
// } |
||||
|
// |
||||
|
// public List<Integer> getAuditStateList() { |
||||
|
// return auditStateList; |
||||
|
// } |
||||
|
// |
||||
|
// public void setAuditStateList(List<Integer> auditStateList) { |
||||
|
// this.auditStateList = auditStateList; |
||||
|
// } |
||||
|
// |
||||
|
// public String getNk() { |
||||
|
// return nk; |
||||
|
// } |
||||
|
// |
||||
|
// public void setNk(String nk) { |
||||
|
// this.nk = nk; |
||||
|
// } |
||||
|
// |
||||
|
// public List<Integer> getOntologyIdList() { |
||||
|
// return ontologyIdList; |
||||
|
// } |
||||
|
// |
||||
|
// public void setOntologyIdList(List<Integer> ontologyIdList) { |
||||
|
// this.ontologyIdList = ontologyIdList; |
||||
|
// } |
||||
|
//} |
@ -0,0 +1,879 @@ |
|||||
|
//package com.bfd.mf.common.service.es; |
||||
|
// |
||||
|
//import com.google.common.base.Strings; |
||||
|
//import org.apache.commons.lang.ArrayUtils; |
||||
|
//import org.apache.commons.lang.StringUtils; |
||||
|
//import org.apache.lucene.queryparser.classic.QueryParser; |
||||
|
//import org.apache.lucene.search.join.ScoreMode; |
||||
|
//import org.elasticsearch.action.search.SearchRequestBuilder; |
||||
|
//import org.elasticsearch.action.search.SearchResponse; |
||||
|
//import org.elasticsearch.action.search.SearchType; |
||||
|
//import org.elasticsearch.client.transport.TransportClient; |
||||
|
//import org.elasticsearch.common.text.Text; |
||||
|
//import org.elasticsearch.index.query.BoolQueryBuilder; |
||||
|
//import org.elasticsearch.index.query.DisMaxQueryBuilder; |
||||
|
//import org.elasticsearch.index.query.MultiMatchQueryBuilder; |
||||
|
//import org.elasticsearch.index.query.QueryBuilder; |
||||
|
//import org.elasticsearch.index.query.QueryBuilders; |
||||
|
//import org.elasticsearch.index.query.SpanNearQueryBuilder; |
||||
|
//import org.elasticsearch.index.query.SpanNotQueryBuilder; |
||||
|
//import org.elasticsearch.index.query.SpanQueryBuilder; |
||||
|
//import org.elasticsearch.index.query.TermsQueryBuilder; |
||||
|
//import org.elasticsearch.search.SearchHit; |
||||
|
//import org.elasticsearch.search.SearchHits; |
||||
|
//import org.elasticsearch.search.aggregations.AggregationBuilder; |
||||
|
//import org.elasticsearch.search.aggregations.AggregationBuilders; |
||||
|
//import org.elasticsearch.search.aggregations.bucket.nested.Nested; |
||||
|
//import org.elasticsearch.search.aggregations.bucket.nested.NestedAggregationBuilder; |
||||
|
//import org.elasticsearch.search.aggregations.bucket.terms.Terms; |
||||
|
//import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; |
||||
|
//import org.elasticsearch.search.fetch.subphase.highlight.HighlightField; |
||||
|
//import org.elasticsearch.search.rescore.RescoreBuilder; |
||||
|
//import org.elasticsearch.search.sort.FieldSortBuilder; |
||||
|
//import org.elasticsearch.search.sort.SortBuilders; |
||||
|
//import org.elasticsearch.search.sort.SortOrder; |
||||
|
//import org.slf4j.Logger; |
||||
|
//import org.slf4j.LoggerFactory; |
||||
|
//import org.springframework.stereotype.Component; |
||||
|
// |
||||
|
//import javax.annotation.Resource; |
||||
|
//import java.util.ArrayList; |
||||
|
//import java.util.Arrays; |
||||
|
//import java.util.HashMap; |
||||
|
//import java.util.List; |
||||
|
//import java.util.Map; |
||||
|
//import java.util.Objects; |
||||
|
//import java.util.function.Consumer; |
||||
|
//import java.util.stream.Collectors; |
||||
|
//import java.util.stream.Stream; |
||||
|
// |
||||
|
// |
||||
|
///** |
||||
|
// * es 基础服务 |
||||
|
// * |
||||
|
// * @author Aquarius & Hao |
||||
|
// */ |
||||
|
//@Component |
||||
|
//public class EsBase { |
||||
|
// |
||||
|
// protected Logger logger = LoggerFactory.getLogger(EsBase.class); |
||||
|
// @Resource |
||||
|
// protected TransportClient transportClient; |
||||
|
// /** |
||||
|
// * keyword默认名 |
||||
|
// */ |
||||
|
// public static final String ES_INDEX = "_index"; |
||||
|
// /** |
||||
|
// * 默认索引type |
||||
|
// */ |
||||
|
// public static final String ES_TYPE = "docs"; |
||||
|
// /** |
||||
|
// * keyword默认名 |
||||
|
// */ |
||||
|
// public static final String ES_KEYWORD_SUFFIX = ".keyword"; |
||||
|
// /** |
||||
|
// * 拼音默认名 |
||||
|
// */ |
||||
|
// public static final String ES_PINYIN_SUFFIX = ".pinyin"; |
||||
|
// /** |
||||
|
// * 拼音默认名 |
||||
|
// */ |
||||
|
// public static final String ES_SPY_SUFFIX = ".spy"; |
||||
|
// /** |
||||
|
// * 拼音默认名 |
||||
|
// */ |
||||
|
// public static final String ES_FPY_SUFFIX = ".fpy"; |
||||
|
// /** |
||||
|
// * 拼音默认名 |
||||
|
// */ |
||||
|
// public static final String ES_NGRAM_SUFFIX = ".ngram"; |
||||
|
// /** |
||||
|
// * 分隔符星号 |
||||
|
// */ |
||||
|
// public static final String SEPARATOR_ASTERISK = "*"; |
||||
|
// /** |
||||
|
// * 分隔符点 |
||||
|
// */ |
||||
|
// public static final String SEPARATOR_POINT = "."; |
||||
|
// /** |
||||
|
// * 分隔符逗号 |
||||
|
// */ |
||||
|
// public static final String SEPARATOR_COMMA = ","; |
||||
|
// /** |
||||
|
// * es返回_id键值 |
||||
|
// */ |
||||
|
// public static final String ES_DOC_ID = "ES_DOC_ID"; |
||||
|
// /** |
||||
|
// * es返回高亮信息 |
||||
|
// */ |
||||
|
// public static final String ES_HIGHLIGHT_FIELD = "ES_HIGHLIGHT_FIELD"; |
||||
|
// /** |
||||
|
// * es 句子分隔符 |
||||
|
// */ |
||||
|
// public static final String SEPARATOR_SENTENCE = "sentenceforbfd"; |
||||
|
// /** |
||||
|
// * es返 段落分隔符 |
||||
|
// */ |
||||
|
// public static final String SEPARATOR_PARAGRAPH = "paragraphforbfd"; |
||||
|
// |
||||
|
// /** |
||||
|
// * field append suffix e.g. ".keyword" |
||||
|
// * |
||||
|
// * @return e.g. "id.keyword" |
||||
|
// */ |
||||
|
// public String keyword(String field) { |
||||
|
// if (StringUtils.isNotBlank(field)) { |
||||
|
// return field + ES_KEYWORD_SUFFIX; |
||||
|
// } |
||||
|
// return field; |
||||
|
// } |
||||
|
// |
||||
|
// /** |
||||
|
// * 字段添加.pin后缀 |
||||
|
// * |
||||
|
// * @param field |
||||
|
// * @return |
||||
|
// */ |
||||
|
// public String pinyin(String field) { |
||||
|
// if (StringUtils.isNotBlank(field)) { |
||||
|
// return field + ES_PINYIN_SUFFIX; |
||||
|
// } |
||||
|
// return field; |
||||
|
// } |
||||
|
// |
||||
|
// /** |
||||
|
// * 字段添加.spy后缀 |
||||
|
// * |
||||
|
// * @param field |
||||
|
// * @return |
||||
|
// */ |
||||
|
// public String spy(String field) { |
||||
|
// if (StringUtils.isNotBlank(field)) { |
||||
|
// return field + ES_SPY_SUFFIX; |
||||
|
// } |
||||
|
// return field; |
||||
|
// } |
||||
|
// |
||||
|
// /** |
||||
|
// * 字段添加.fpy后缀 |
||||
|
// * |
||||
|
// * @param field |
||||
|
// * @return |
||||
|
// */ |
||||
|
// public String fpy(String field) { |
||||
|
// if (StringUtils.isNotBlank(field)) { |
||||
|
// return field + ES_FPY_SUFFIX; |
||||
|
// } |
||||
|
// return field; |
||||
|
// } |
||||
|
// |
||||
|
// /** |
||||
|
// * 字段添加.ngram后缀 |
||||
|
// * |
||||
|
// * @param field |
||||
|
// * @return |
||||
|
// */ |
||||
|
// public String ngram(String field) { |
||||
|
// if (StringUtils.isNotBlank(field)) { |
||||
|
// return field + ES_NGRAM_SUFFIX; |
||||
|
// } |
||||
|
// return field; |
||||
|
// } |
||||
|
// |
||||
|
// /** |
||||
|
// * Splicing "*" |
||||
|
// * |
||||
|
// * @param value |
||||
|
// * @return e.g. "*test*" |
||||
|
// */ |
||||
|
// public String wildcardDelimiter(String value) { |
||||
|
// if (StringUtils.isNotBlank(value)) { |
||||
|
// return SEPARATOR_ASTERISK + value + SEPARATOR_ASTERISK; |
||||
|
// } |
||||
|
// return value; |
||||
|
// } |
||||
|
// |
||||
|
// /** |
||||
|
// * 属性值转为nested属性 |
||||
|
// * |
||||
|
// * @param field |
||||
|
// * @return |
||||
|
// */ |
||||
|
// public String nested(String nested, String field) { |
||||
|
// if (StringUtils.isNotBlank(field)) { |
||||
|
// return nested.concat(SEPARATOR_POINT).concat(field); |
||||
|
// } |
||||
|
// return field; |
||||
|
// } |
||||
|
// |
||||
|
// /** |
||||
|
// * 返回匹配 s | s,... | ...,s | ...,s,... 的正则表达式 |
||||
|
// */ |
||||
|
// public String regexp(String s) { |
||||
|
// return "(.+,)*" + s + "(,.+)*"; |
||||
|
// } |
||||
|
// |
||||
|
// /** |
||||
|
// * 拼装嵌套查询 |
||||
|
// * |
||||
|
// * @param nested 属性名 |
||||
|
// * @param field 子级属性名 |
||||
|
// * @param values 值 |
||||
|
// * @return |
||||
|
// */ |
||||
|
// public QueryBuilder nestedTermQuery(String nested, String field, Object... values) { |
||||
|
// return this.nestedQuery(nested, QueryBuilders.termsQuery(this.nested(nested, field), values)); |
||||
|
// } |
||||
|
// |
||||
|
// /** |
||||
|
// * 拼装嵌套查询 |
||||
|
// * |
||||
|
// * @param field 属性名 |
||||
|
// * @param value 属性值 |
||||
|
// * @return |
||||
|
// */ |
||||
|
// public QueryBuilder nestedWildcardQuery(String nested, String field, String value) { |
||||
|
// return this.nestedQuery(nested, QueryBuilders.wildcardQuery(this.nested(nested, field), this.wildcardDelimiter(value))); |
||||
|
// } |
||||
|
// |
||||
|
// /** |
||||
|
// * 拼装nested条件 |
||||
|
// * |
||||
|
// * @param nested |
||||
|
// * @param queryBuilder |
||||
|
// * @return |
||||
|
// */ |
||||
|
// public QueryBuilder nestedQuery(String nested, QueryBuilder queryBuilder) { |
||||
|
// return QueryBuilders.nestedQuery(nested, queryBuilder, ScoreMode.None); |
||||
|
// } |
||||
|
// |
||||
|
// /** |
||||
|
// * 分页查询列表 |
||||
|
// * |
||||
|
// * @param queryBuilder |
||||
|
// * @param params |
||||
|
// * @return |
||||
|
// */ |
||||
|
// public PageResp<EsDTO> fetchPage(QueryBuilder queryBuilder, EsBaseParam params |
||||
|
// , Consumer<SearchRequestBuilder> consumerRequestBuilder, Consumer<SearchResponse> consumerResponse) { |
||||
|
// SearchRequestBuilder searchRequestBuilder = transportClient.prepareSearch(params.getIndex()); |
||||
|
// |
||||
|
// if (params.getType() != null) { |
||||
|
// searchRequestBuilder.setTypes(params.getType()); |
||||
|
// } |
||||
|
// searchRequestBuilder.setSearchType(SearchType.QUERY_THEN_FETCH); |
||||
|
// |
||||
|
// // 返回结果集 |
||||
|
// PageResp<EsDTO> pageResp = new PageResp<>(); |
||||
|
// try { |
||||
|
// //filter方式查询 |
||||
|
// searchRequestBuilder.setQuery(queryBuilder); |
||||
|
// // 排序 |
||||
|
// if (params.getOrderField() != null && params.getDescOrAsc() != null) { |
||||
|
// // 无该字段时动态生成该字段最大值/最小值排在最后,如果用missing会出现报错情况,unmappedType可避免报错,排序依然在最后 |
||||
|
// FieldSortBuilder sortBuilder = SortBuilders.fieldSort(params.getOrderField()).order(params.getDescOrAsc()); |
||||
|
// if (BaseFieldEnum.public_time.name().equals(params.getOrderField())){ |
||||
|
// sortBuilder.unmappedType("long"); |
||||
|
// } |
||||
|
// searchRequestBuilder.addSort(sortBuilder); |
||||
|
// } |
||||
|
// // Includes表示设置返回值只能返回Includes数组中属性 |
||||
|
// // Excludes表示设置返回值不进行返回Excludes数组中的属性 |
||||
|
// if (ArrayUtils.isNotEmpty(params.getIncludes()) || ArrayUtils.isNotEmpty(params.getExcludes())) { |
||||
|
// searchRequestBuilder.setFetchSource(params.getIncludes(), params.getExcludes()); |
||||
|
// } |
||||
|
// |
||||
|
// // 设置高亮,使用默认的highlighter高亮器 |
||||
|
// if (params.isWithHighlight()) { |
||||
|
// // 如果进行了指定,则以指定为主 |
||||
|
// if (params.getHighlightBuilder() != null) { |
||||
|
// searchRequestBuilder.highlighter(params.getHighlightBuilder()); |
||||
|
// } else { |
||||
|
// // 否则执行默认配置 |
||||
|
// HighlightBuilder highlightBuilder = new HighlightBuilder() |
||||
|
// // match进行高亮 |
||||
|
// .requireFieldMatch(false) |
||||
|
// //fragment 是指一段连续的文字。返回结果最多可以包含几段不连续的文字。默认是5。 |
||||
|
// .numOfFragments(0) |
||||
|
// //一段 fragment 包含多少个字符。默认100。 |
||||
|
// .fragmentSize(800000) |
||||
|
// .preTags("<em>") |
||||
|
// .postTags("</em>"); |
||||
|
// if (params.getHighlightFields().isEmpty()) { |
||||
|
// highlightBuilder.field("*"); |
||||
|
// } else { |
||||
|
// params.getHighlightFields().forEach(highlightBuilder::field); |
||||
|
// } |
||||
|
// searchRequestBuilder.highlighter(highlightBuilder); |
||||
|
// } |
||||
|
// } |
||||
|
// |
||||
|
// // 分页处理, 否则默认返回10000条数据 |
||||
|
// if (params.getOffset() > -1) { |
||||
|
// searchRequestBuilder.setSize(params.getLimit()); |
||||
|
// searchRequestBuilder.setFrom(params.getOffset()); |
||||
|
// } else { |
||||
|
// searchRequestBuilder.setSize(EsClientConfig.scrollSize); |
||||
|
// } |
||||
|
// |
||||
|
// // 自定义条件 |
||||
|
// if (consumerRequestBuilder != null) { |
||||
|
// consumerRequestBuilder.accept(searchRequestBuilder); |
||||
|
// } |
||||
|
// |
||||
|
// logger.debug("{},{},{}", params.getIndex(), params.getType(), searchRequestBuilder.toString()); |
||||
|
// |
||||
|
// // 查询结果处理 |
||||
|
// SearchResponse response = searchRequestBuilder.setPreference("_primary_first").execute().actionGet(); |
||||
|
// SearchHits hits = response.getHits(); |
||||
|
// Long count = hits.getTotalHits(); |
||||
|
// SearchHit[] searchHits = hits.getHits(); |
||||
|
// EsDTO esDTO = null; |
||||
|
// for (SearchHit searchHit : searchHits) { |
||||
|
// esDTO = new EsDTO(searchHit.getId(), searchHit.sourceAsMap()); |
||||
|
// esDTO.setIndex(searchHit.getIndex()); |
||||
|
// esDTO.setType(searchHit.getType()); |
||||
|
// |
||||
|
// // 返回文档的高亮字段 |
||||
|
// if (params.isWithHighlight()) { |
||||
|
// Map<String, HighlightField> highlightFields = searchHit.getHighlightFields(); |
||||
|
// if (highlightFields != null) { |
||||
|
// Map<String, String> map = new HashMap<>(highlightFields.size()); |
||||
|
// highlightFields.forEach((k, v) -> { |
||||
|
// if (v != null && v.getFragments() != null) { |
||||
|
// map.put(k.replace(ES_KEYWORD_SUFFIX, ""), |
||||
|
// Arrays.asList(v.getFragments()).stream().filter(e -> e != null).map(Text::toString).collect(Collectors.joining(Constants.SEPARATOR_ELLIPSIS))); |
||||
|
// } |
||||
|
// }); |
||||
|
// esDTO.setHighlightData(map); |
||||
|
// } |
||||
|
// } |
||||
|
// pageResp.getList().add(esDTO); |
||||
|
// } |
||||
|
// pageResp.setTotal(count > EsClientConfig.scrollSize ? EsClientConfig.scrollSize : count); |
||||
|
// |
||||
|
// // 自定义结果处理 |
||||
|
// if (consumerResponse != null) { |
||||
|
// consumerResponse.accept(response); |
||||
|
// } |
||||
|
// logger.debug("fetchPage,size = {}, total = {}", pageResp.getList().size(), pageResp.getTotal()); |
||||
|
// } catch (Exception e) { |
||||
|
// throw new RuntimeException("call pageDataQuery exception ", e); |
||||
|
// } |
||||
|
// return pageResp; |
||||
|
// } |
||||
|
// |
||||
|
// |
||||
|
// /** |
||||
|
// * 此方法中,通用字段名使用了BaseFieldEnum索引字段的名字,因各索引统一所以不会产生问题。 |
||||
|
// * <p> |
||||
|
// * 定制化分页查询,用于主检索 |
||||
|
// * |
||||
|
// * @param query 查询条件 |
||||
|
// * @param customBuilder 自定义条件 |
||||
|
// * @param clazz 返回类型 |
||||
|
// * @param indexEnums 查询的索引 |
||||
|
// * @param <P> 参数类型 |
||||
|
// * @param <R> 结果类型 |
||||
|
// * @return |
||||
|
// */ |
||||
|
// public <P extends BaseSearchQuery, R extends BaseEsEntity> SearchPageResp<R> fetchCustomPage(P query, Consumer<BoolQueryBuilder> customBuilder, Class<R> clazz, IndexEnum... indexEnums) { |
||||
|
// EsBaseParam esBaseParam = new EsBaseParam(); |
||||
|
// esBaseParam.setIndex(Arrays.stream(indexEnums).map(IndexEnum::getSearchIndex).toArray(String[]::new)); |
||||
|
// esBaseParam.setExcludes(new String[]{BaseFieldEnum.content.name(), HtmlFieldEnum.forward_content.name()}); |
||||
|
// esBaseParam.setPage(query.getPage()); |
||||
|
// esBaseParam.setLimit(query.getLimit()); |
||||
|
// // 排序处理 |
||||
|
// int scoreOrder = 1, timeOrder = 2, asc = 1; |
||||
|
// if (query.getOrderType() == timeOrder) { |
||||
|
// esBaseParam.setOrderField(BaseFieldEnum.public_time.name()); |
||||
|
// esBaseParam.setDescOrAsc(query.getOrder() == asc ? SortOrder.ASC : SortOrder.DESC); |
||||
|
// } |
||||
|
// |
||||
|
// // 拼装查询条件 |
||||
|
// BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery(); |
||||
|
// // 过滤掉被删除的 |
||||
|
// queryBuilder.filter(QueryBuilders.termQuery(BaseFieldEnum.del.name(), Constants.NO)); |
||||
|
// // 自定义条件 |
||||
|
// if (customBuilder != null) { |
||||
|
// customBuilder.accept(queryBuilder); |
||||
|
// } |
||||
|
// // 设置documentId查询范围 |
||||
|
// if (query.getDocumentId() != null && query.getDocumentId().length != 0) { |
||||
|
// queryBuilder.filter(QueryBuilders.idsQuery().addIds(query.getDocumentId())); |
||||
|
// } |
||||
|
// // 标题条件 |
||||
|
// if (!Strings.isNullOrEmpty(query.getTitle())) { |
||||
|
// queryBuilder.filter(QueryBuilders.wildcardQuery(this.keyword(BaseFieldEnum.title.name()), this.wildcardDelimiter(QueryParser.escape(query.getTitle())))); |
||||
|
// } |
||||
|
// // 来源条件 |
||||
|
// if (query.getSourceList() != null && !query.getSourceList().isEmpty()) { |
||||
|
// queryBuilder.filter(QueryBuilders.termsQuery(BaseFieldEnum.source.name(), query.getSourceList())); |
||||
|
// } |
||||
|
// // 原文译文条件(满足原文条件时无该字段匹配) |
||||
|
// if (query.getContentTypeList() != null && !query.getContentTypeList().isEmpty()) { |
||||
|
// TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery(BaseFieldEnum.type.name(), query.getContentTypeList()); |
||||
|
// if (query.getContentTypeList().contains(ContentTypeEnum.ORIGINAL.getKey())){ |
||||
|
// BoolQueryBuilder contentTypeBoolQueryBuilder = QueryBuilders.boolQuery(); |
||||
|
// contentTypeBoolQueryBuilder.should(QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery(BaseFieldEnum.type.name()))); |
||||
|
// contentTypeBoolQueryBuilder.should(termsQueryBuilder); |
||||
|
// queryBuilder.filter(contentTypeBoolQueryBuilder); |
||||
|
// }else { |
||||
|
// queryBuilder.filter(termsQueryBuilder); |
||||
|
// } |
||||
|
// } |
||||
|
// // 上传用户条件 |
||||
|
// if (query.getUploadUser() != null) { |
||||
|
// queryBuilder.filter(QueryBuilders.termQuery(BaseFieldEnum.upload_user.name(), query.getUploadUser())); |
||||
|
// } |
||||
|
// //部门条件 |
||||
|
// if (String.valueOf(Constants.YES).equals(query.getOnlyDepartment()) && UserUtil.getUser().getDepartmentId() != null) { |
||||
|
// queryBuilder.filter(QueryBuilders.termQuery(DocumentFieldEnum.department_id.name(), UserUtil.getUser().getDepartmentId())); |
||||
|
// } |
||||
|
// // 语言条件 |
||||
|
// if (query.getLanguageList() != null && !query.getLanguageList().isEmpty()) { |
||||
|
// queryBuilder.filter(QueryBuilders.termsQuery(BaseFieldEnum.language.name(), query.getLanguageList())); |
||||
|
// } |
||||
|
// |
||||
|
// // 关键词搜索自定义--带拼音 |
||||
|
// if (query.getK() != null && !"".equals(query.getK().trim())) { |
||||
|
// // 默认短语 |
||||
|
// MultiMatchQueryBuilder.Type matchType = MultiMatchQueryBuilder.Type.BEST_FIELDS; |
||||
|
// queryBuilder.must(this.getMatchQueryBuilder(BaseFieldEnum.getMatchFieldsWithPy(), matchType, query.getK())); |
||||
|
// } |
||||
|
// |
||||
|
// // 精确搜索 |
||||
|
// if (query.isAccurateQuery()) { |
||||
|
// // 暂时只考虑一对双引号的情况 |
||||
|
// query.getAccurateList().stream().forEach(e -> { |
||||
|
// queryBuilder.must(this.getMatchQueryBuilder(BaseFieldEnum.getMatchFieldsWithPy(), MultiMatchQueryBuilder.Type.PHRASE_PREFIX, e)); |
||||
|
// }); |
||||
|
// } |
||||
|
// |
||||
|
// // 二次搜索--采用短语搜素--带拼音 |
||||
|
// if (query.getSk() != null && !"".equals(query.getSk().trim())) { |
||||
|
// queryBuilder.must(this.getMatchQueryBuilder(BaseFieldEnum.getMatchFieldsWithPy(), MultiMatchQueryBuilder.Type.PHRASE_PREFIX, query.getSk())); |
||||
|
// } |
||||
|
// |
||||
|
// // 排除搜索--采用短语搜素 |
||||
|
// if (query.getNk() != null && !"".equals(query.getNk().trim())) { |
||||
|
// queryBuilder.mustNot(this.getMatchQueryBuilder(null,BaseFieldEnum.getMatchFields(), new String[]{query.getNk()}, true, SearchWordStrategyEnum.ANY)); |
||||
|
// } |
||||
|
// |
||||
|
// // 时间条件(满足条件或无该字段) |
||||
|
// if (query.getBeginTime() != null || query.getEndTime() != null){ |
||||
|
// BoolQueryBuilder timeBoolQueryBuilder = QueryBuilders.boolQuery(); |
||||
|
// timeBoolQueryBuilder.should(QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery(BaseFieldEnum.public_time.name()))); |
||||
|
// BoolQueryBuilder timeRangeBoolQueryBuilder = QueryBuilders.boolQuery(); |
||||
|
// if (query.getBeginTime() != null) { |
||||
|
// timeRangeBoolQueryBuilder.filter(QueryBuilders.rangeQuery(BaseFieldEnum.public_time.name()).gte(query.getBeginTime())); |
||||
|
// } |
||||
|
// if (query.getEndTime() != null) { |
||||
|
// timeRangeBoolQueryBuilder.filter(QueryBuilders.rangeQuery(BaseFieldEnum.public_time.name()).lte(query.getEndTime())); |
||||
|
// } |
||||
|
// timeBoolQueryBuilder.should(timeRangeBoolQueryBuilder); |
||||
|
// queryBuilder.filter(timeBoolQueryBuilder); |
||||
|
// } |
||||
|
// |
||||
|
// |
||||
|
// // 标签搜索 |
||||
|
// if (query.getAiTagList() != null && !query.getAiTagList().isEmpty()) { |
||||
|
// queryBuilder.filter(this.nestedTermQuery(BaseFieldEnum.ai_tag.name(), LabelWeightFieldEnum.label.name(), query.getAiTagList().stream().toArray(String[]::new))); |
||||
|
// } |
||||
|
// // 地区搜索 |
||||
|
// if (query.getAiAreaList() != null && !query.getAiAreaList().isEmpty()) { |
||||
|
// queryBuilder.filter(this.nestedTermQuery(BaseFieldEnum.ai_area.name(), LabelWeightFieldEnum.label.name(), query.getAiAreaList().stream().toArray(String[]::new))); |
||||
|
// } |
||||
|
// // 主题一级分类 |
||||
|
// if (!Strings.isNullOrEmpty(query.getSubjectClassify1())) { |
||||
|
// queryBuilder.filter(QueryBuilders.termsQuery(BaseFieldEnum.subject_classify1.name(), query.getSubjectClassify1())); |
||||
|
// } |
||||
|
// // 主题二级分类 |
||||
|
// if (!Strings.isNullOrEmpty(query.getSubjectClassify2())) { |
||||
|
// queryBuilder.filter(QueryBuilders.termsQuery(BaseFieldEnum.subject_classify2.name(), query.getSubjectClassify2())); |
||||
|
// } |
||||
|
// // 主题(满足其他主题时无主题字段匹配) |
||||
|
// if (query.getSubjectList() != null && !query.getSubjectList().isEmpty()) { |
||||
|
// if (query.getSubjectList().contains(DefaultConstants.SUBJECT_DEFAULT)){ |
||||
|
// BoolQueryBuilder subjectBoolQueryBuilder = QueryBuilders.boolQuery(); |
||||
|
// subjectBoolQueryBuilder.should(QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery(BaseFieldEnum.subject.name()))); |
||||
|
// subjectBoolQueryBuilder.should(QueryBuilders.termsQuery(BaseFieldEnum.subject.name(), query.getSubjectList())); |
||||
|
// queryBuilder.filter(subjectBoolQueryBuilder); |
||||
|
// }else { |
||||
|
// queryBuilder.filter(QueryBuilders.termsQuery(BaseFieldEnum.subject.name(), query.getSubjectList())); |
||||
|
// } |
||||
|
// } |
||||
|
// // 渠道条件 |
||||
|
// if (query.getChannelList() != null && !query.getChannelList().isEmpty()) { |
||||
|
// queryBuilder.filter(QueryBuilders.termsQuery(BaseFieldEnum.channel.name(), query.getChannelList())); |
||||
|
// } |
||||
|
// // 网站 |
||||
|
// if (!Strings.isNullOrEmpty(query.getWebsite())) { |
||||
|
// queryBuilder.filter(QueryBuilders.termQuery(BaseFieldEnum.website.name(), query.getWebsite())); |
||||
|
// } |
||||
|
// if (query.getWebsiteList() != null && !query.getWebsiteList().isEmpty()) { |
||||
|
// // 如果渠道选择了用户上传,并且其他渠道选择了二级网站,则需兼容用户上传网站为空的结果 |
||||
|
// if (query.getChannelList() != null && query.getChannelList().contains(DefaultConstants.DEFAULT_CHANNEL_USER)){ |
||||
|
// BoolQueryBuilder subQuery = QueryBuilders.boolQuery(); |
||||
|
// subQuery.should(QueryBuilders.termQuery(BaseFieldEnum.channel.name(), DefaultConstants.DEFAULT_CHANNEL_USER)); |
||||
|
// subQuery.should(QueryBuilders.termsQuery(BaseFieldEnum.website.name(), query.getWebsiteList())); |
||||
|
// queryBuilder.filter(subQuery); |
||||
|
// } else { |
||||
|
// queryBuilder.filter(QueryBuilders.termsQuery(BaseFieldEnum.website.name(), query.getWebsiteList())); |
||||
|
// } |
||||
|
// } |
||||
|
// // 网站面包夹 |
||||
|
// if (query.getCateMd5List() != null && !query.getCateMd5List().isEmpty()) { |
||||
|
// queryBuilder.filter(QueryBuilders.termsQuery(BaseFieldEnum.cate_md5.name(), query.getCateMd5List())); |
||||
|
// } |
||||
|
// // 审核状态(满足审核通过条件时无该字段匹配) |
||||
|
// if (query.getAuditStateList() != null && !query.getAuditStateList().isEmpty()) { |
||||
|
// if (query.getAuditStateList().contains(AuditStateEnum.YES.getKey())){ |
||||
|
// BoolQueryBuilder auditBoolQuery = QueryBuilders.boolQuery(); |
||||
|
// auditBoolQuery.should(QueryBuilders.termsQuery(BaseFieldEnum.audit_state.name(), query.getAuditStateList())); |
||||
|
// auditBoolQuery.should(QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery(BaseFieldEnum.audit_state.name()))); |
||||
|
// queryBuilder.filter(auditBoolQuery); |
||||
|
// }else { |
||||
|
// queryBuilder.filter(QueryBuilders.termsQuery(BaseFieldEnum.audit_state.name(), query.getAuditStateList())); |
||||
|
// } |
||||
|
// } |
||||
|
// // 实体类型 |
||||
|
// if (query.getOntologyIdList() != null && !query.getOntologyIdList().isEmpty()){ |
||||
|
// queryBuilder.filter(QueryBuilders.termsQuery(KgSystemEnum.ontology_id.name(),query.getOntologyIdList())); |
||||
|
// } |
||||
|
// |
||||
|
// // 高级搜索自定义设置 |
||||
|
// if (query.isHighLevel()) { |
||||
|
// // 1、找到所有的not进行非处理 |
||||
|
// query.getHighLevelQueries().stream().filter(e -> SearchExpressionEnum.NOT.is(e.getExpression())).forEach(e -> { |
||||
|
// queryBuilder.mustNot(this.getHighLevelQueryBuilder(e, true)); |
||||
|
// }); |
||||
|
// |
||||
|
// // 2、循环处理剩下的不含not的,处理逻辑为:如果当前是and,则将tempHighLevel进行must处理,tempHighLevel中如果有多个则内部should处理 |
||||
|
// List<HighLevelQuery> tempHighLevel = new ArrayList<>(query.getHighLevelQueries().size()); |
||||
|
// query.getHighLevelQueries().stream().filter(e -> !SearchExpressionEnum.NOT.is(e.getExpression())).forEach(e -> { |
||||
|
// // 如果是and 且 tempHighLevel不为空,则处理tempHighLevel(>1个做内部或操作)并清空 |
||||
|
// if (SearchExpressionEnum.AND.is(e.getExpression()) && !tempHighLevel.isEmpty()) { |
||||
|
// // 拼接条件 |
||||
|
// BoolQueryBuilder tempQueryBuilder = QueryBuilders.boolQuery(); |
||||
|
// tempHighLevel.forEach(temp -> tempQueryBuilder.should(this.getHighLevelQueryBuilder(temp, false))); |
||||
|
// queryBuilder.must(tempQueryBuilder); |
||||
|
// tempHighLevel.clear(); |
||||
|
// } |
||||
|
// // 将当前项加入临时队列 |
||||
|
// tempHighLevel.add(e); |
||||
|
// }); |
||||
|
// |
||||
|
// // 此处拼接tempHighLevel未处理的内容 |
||||
|
// if (!tempHighLevel.isEmpty()) { |
||||
|
// BoolQueryBuilder tempQueryBuilder = QueryBuilders.boolQuery(); |
||||
|
// tempHighLevel.forEach(temp -> tempQueryBuilder.should(this.getHighLevelQueryBuilder(temp, false))); |
||||
|
// queryBuilder.must(tempQueryBuilder); |
||||
|
// } |
||||
|
// } |
||||
|
// |
||||
|
// // 统计全部关键词, k=关键词 v=积分放大倍数 |
||||
|
// Map<String, Integer> keywordMap = new HashMap<>(2); |
||||
|
// if (!Strings.isNullOrEmpty(query.getK())) { |
||||
|
// keywordMap.put(query.getK(), 10); |
||||
|
// } |
||||
|
// if (!Strings.isNullOrEmpty(query.getSk())) { |
||||
|
// keywordMap.put(query.getSk(), 20); |
||||
|
// } |
||||
|
// if (query.isHighLevel()) { |
||||
|
// query.getHighLevelQueries().forEach(e -> { |
||||
|
// Stream.of(e.getText()).forEach(text -> keywordMap.put(text, 10)); |
||||
|
// if (e.getTranslateText() != null) { |
||||
|
// Stream.of(e.getTranslateText()).forEach(text -> keywordMap.put(text, 10)); |
||||
|
// } |
||||
|
// }); |
||||
|
// } |
||||
|
// |
||||
|
// // 高亮自定义设置 |
||||
|
// if (query.getHighlight() != null && query.getHighlight()) { |
||||
|
// esBaseParam.setWithHighlight(true); |
||||
|
// esBaseParam.setHighlightFields(new ArrayList<>(BaseFieldEnum.getMatchFieldsWithPy().keySet())); |
||||
|
// Integer numOfFragments = 2; |
||||
|
// HighlightBuilder highlightBuilder = new HighlightBuilder() |
||||
|
// // match进行高亮 |
||||
|
// .requireFieldMatch(true) |
||||
|
// .order(HighlightBuilder.Order.SCORE) |
||||
|
// //fragment 是指一段连续的文字。返回结果最多可以包含几段不连续的文字。默认是5。 |
||||
|
// .numOfFragments(numOfFragments) |
||||
|
// //一段 fragment 包含多少个字符。默认100。 |
||||
|
// .fragmentSize(Constants.MAX_R_LENGTH / numOfFragments) |
||||
|
// .noMatchSize(Constants.MAX_R_LENGTH) |
||||
|
// .preTags("<em>") |
||||
|
// .postTags("</em>"); |
||||
|
// BaseFieldEnum.getMatchFieldsWithPy().keySet().forEach(highlightBuilder::field); |
||||
|
// |
||||
|
// /* |
||||
|
// * 高级搜索取消自定义高亮 |
||||
|
// * 精确搜索进行短语高亮重定义 |
||||
|
// * 否则进行关键词的高亮重定义 |
||||
|
// */ |
||||
|
// if (!query.isHighLevel()) { |
||||
|
// DisMaxQueryBuilder highlightQuery = QueryBuilders.disMaxQuery(); |
||||
|
// if (query.isAccurateQuery()) { |
||||
|
// query.getAccurateList().stream().forEach(e -> { |
||||
|
// highlightQuery.add(this.getMatchQueryBuilder(BaseFieldEnum.getMatchFieldsWithPy(), MultiMatchQueryBuilder.Type.PHRASE_PREFIX, e)); |
||||
|
// }); |
||||
|
// } else { |
||||
|
// keywordMap.forEach((keyword, boost) -> { |
||||
|
// BaseFieldEnum.getMatchFieldsWithPy().forEach((field, baseBoost) -> { |
||||
|
// float realBoost = baseBoost * boost * 100; |
||||
|
// highlightQuery.add(QueryBuilders.termQuery(field, keyword).boost(realBoost * 2)); |
||||
|
// highlightQuery.add(QueryBuilders.matchPhraseQuery(field, keyword).boost(realBoost)); |
||||
|
// }); |
||||
|
// highlightQuery.add(this.getMatchQueryBuilder(BaseFieldEnum.getMatchFieldsWithPy(), MultiMatchQueryBuilder.Type.BEST_FIELDS, keyword).boost(0.5F)); |
||||
|
// |
||||
|
// }); |
||||
|
// // 如果有二次搜索,因二次搜索使用短语前缀,此处需要特殊处理 |
||||
|
// if (query.getSk() != null && !"".equals(query.getSk().trim())) { |
||||
|
// highlightQuery.add(this.getMatchQueryBuilder(BaseFieldEnum.getMatchFieldsWithPy(), MultiMatchQueryBuilder.Type.PHRASE_PREFIX, query.getSk())); |
||||
|
// } |
||||
|
// } |
||||
|
// highlightBuilder.highlightQuery(highlightQuery); |
||||
|
// } |
||||
|
// esBaseParam.setHighlightBuilder(highlightBuilder); |
||||
|
// } |
||||
|
// |
||||
|
// |
||||
|
// |
||||
|
// // 评分重算条件 |
||||
|
// BoolQueryBuilder reScoreQueryBuilder = QueryBuilders.boolQuery(); |
||||
|
// if (!keywordMap.isEmpty()) { |
||||
|
// BoolQueryBuilder phraseQueryBuilder = QueryBuilders.boolQuery(); |
||||
|
// keywordMap.forEach((keyword, boost) -> { |
||||
|
// BaseFieldEnum.getMatchFieldsWithPy().forEach((field, baseBoost) -> { |
||||
|
// phraseQueryBuilder.should(QueryBuilders.matchPhrasePrefixQuery(field, keyword).slop(2).maxExpansions(10).boost(baseBoost * boost)); |
||||
|
// }); |
||||
|
// |
||||
|
// String paramKgSearchPriority = SettingEnum.PARAMS_KG_SEARCH_PRIORITY.getValue(); |
||||
|
// if (!Strings.isNullOrEmpty(paramKgSearchPriority)){ |
||||
|
// // 高优先级实体评分重算(Type指定PHRASE短语匹配;如果搜索词不匹配时,无损原重算逻辑) |
||||
|
// Long[] ontologyIds = Arrays.stream(paramKgSearchPriority.split(Constants.SEPARATOR_COMMA)).map(Long::parseLong).toArray(Long[]::new); |
||||
|
// List<AisKgPropertyEntity> titleProperties = OntologyUtil.getTitleProperties(ontologyIds); |
||||
|
// Map<String, Float> fieldMap = titleProperties.stream().collect(Collectors.toMap(AisKgPropertyEntity::getCode, aisKgPropertyEntity -> 300f, (o1, o2) -> o2)); |
||||
|
// phraseQueryBuilder.should(this.getMatchQueryBuilder(fieldMap,MultiMatchQueryBuilder.Type.PHRASE,keyword)); |
||||
|
// } |
||||
|
// }); |
||||
|
// reScoreQueryBuilder.must(phraseQueryBuilder); |
||||
|
// } |
||||
|
// /* |
||||
|
// // 相关度查询标记 |
||||
|
// boolean functionFlag = false; |
||||
|
// FunctionScoreQueryBuilder functionQueryBuilder = null; |
||||
|
// // 优化时间衰减函数查询 |
||||
|
// if (query.getOrderType() == scoreOrder) { |
||||
|
// // 更改标记并构建时间衰减函数Query对象 |
||||
|
// functionFlag = true; |
||||
|
// GaussDecayFunctionBuilder exp = ScoreFunctionBuilders.gaussDecayFunction(BaseFieldEnum.create_time.name(), System.currentTimeMillis(), 86400000, 86400000 * 30.0, 0.5); |
||||
|
// functionQueryBuilder = QueryBuilders.functionScoreQuery(queryBuilder, exp).boostMode(CombineFunction.MULTIPLY); |
||||
|
// } |
||||
|
// */ |
||||
|
// |
||||
|
// // 热门标签聚合名称 |
||||
|
// String aiTagLabelAgg = "aiTagLabelAgg"; |
||||
|
// String aiTagAgg = "aiTagAgg"; |
||||
|
// List<KeyValueDTO> hotTagList = new ArrayList<>(); |
||||
|
// PageResp<EsDTO> pageList = this.fetchPage(queryBuilder, esBaseParam, (customRequestBuilder) -> { |
||||
|
// // 高级/跨度/精确搜索时不增加评分重算 |
||||
|
// if (!query.isHighLevel() && !query.isSpanQuery() && !query.isAccurateQuery()) { |
||||
|
// customRequestBuilder.addRescorer(RescoreBuilder.queryRescorer(reScoreQueryBuilder).setQueryWeight(0.7f).setRescoreQueryWeight(1.2f), 100); |
||||
|
// } |
||||
|
// // 聚合当前结果的热门标签 |
||||
|
// // 内层标签属性聚合 |
||||
|
// AggregationBuilder aiTagLabelAggBuilder = AggregationBuilders.terms(aiTagLabelAgg) |
||||
|
// .field(this.nested(BaseFieldEnum.ai_tag.name(), LabelWeightFieldEnum.label.name())) |
||||
|
// .order(Terms.Order.count(false)) |
||||
|
// .size(query.getLimit()); |
||||
|
// // nested主聚合 |
||||
|
// NestedAggregationBuilder aiTagAggBuilder = AggregationBuilders.nested(aiTagAgg, BaseFieldEnum.ai_tag.name()).subAggregation(aiTagLabelAggBuilder); |
||||
|
// customRequestBuilder.addAggregation(aiTagAggBuilder); |
||||
|
// }, (customResponse) -> { |
||||
|
// // 处理热门标签, 取出聚合结果 |
||||
|
// Nested aiTagAggData = customResponse.getAggregations().get(aiTagAgg); |
||||
|
// Terms aiTagLabelAggData = aiTagAggData.getAggregations().get(aiTagLabelAgg); |
||||
|
// if (aiTagLabelAggData != null) { |
||||
|
// for (Terms.Bucket bucket : aiTagLabelAggData.getBuckets()) { |
||||
|
// hotTagList.add(new KeyValueDTO(bucket.getKeyAsString(), String.valueOf(bucket.getDocCount()))); |
||||
|
// } |
||||
|
// } |
||||
|
// }); |
||||
|
// // 拼装返回结果 |
||||
|
// SearchPageResp<R> pageResp = new SearchPageResp<>(query.getLimit(), query.getPage()); |
||||
|
// pageResp.setTotalCount((int) pageList.getTotal()); |
||||
|
// pageResp.setList(pageList.getList().stream().map(e -> e.toHighlightEntity(clazz)).collect(Collectors.toList())); |
||||
|
// pageResp.setHotAiTagList(hotTagList); |
||||
|
// return pageResp; |
||||
|
// } |
||||
|
// |
||||
|
// /** |
||||
|
// * 拼装高级搜索--针对高级搜索中的一行或一个框 |
||||
|
// * |
||||
|
// * @param highLevelQuery |
||||
|
// * @return |
||||
|
// */ |
||||
|
// protected QueryBuilder getHighLevelQueryBuilder(HighLevelQuery highLevelQuery, boolean isNot) { |
||||
|
// BoolQueryBuilder result = QueryBuilders.boolQuery(); |
||||
|
// // 获取高级查询的字段 |
||||
|
// Map<String, Float> fieldMap = SearchScopeEnum.getFieldsByKey(highLevelQuery.getScope()); |
||||
|
// SearchScopeEnum searchScopeEnum = SearchScopeEnum.getEnumByKey(Objects.toString(highLevelQuery.getScope())); |
||||
|
// String path = (null == searchScopeEnum ? null : searchScopeEnum.getPath()); |
||||
|
// |
||||
|
// // 同段搜索---跨度搜索 |
||||
|
// if (SearchMatchTypeEnum.PARAGRAPH.equals(highLevelQuery.getMatchType())) { |
||||
|
// fieldMap.forEach((k, v) -> { |
||||
|
// this.addSpanQueryBuilder(result, k, highLevelQuery.getText(), SEPARATOR_PARAGRAPH); |
||||
|
// this.addSpanQueryBuilder(result, k, highLevelQuery.getTranslateText(), SEPARATOR_PARAGRAPH); |
||||
|
// }); |
||||
|
// return result; |
||||
|
// } |
||||
|
// |
||||
|
// // 同句搜索 |
||||
|
// if (SearchMatchTypeEnum.SENTENCE.equals(highLevelQuery.getMatchType())) { |
||||
|
// fieldMap.forEach((k, v) -> { |
||||
|
// this.addSpanQueryBuilder(result, k, highLevelQuery.getText(), SEPARATOR_SENTENCE); |
||||
|
// this.addSpanQueryBuilder(result, k, highLevelQuery.getTranslateText(), SEPARATOR_SENTENCE); |
||||
|
// }); |
||||
|
// return result; |
||||
|
// } |
||||
|
// |
||||
|
// // 原文普通搜索 |
||||
|
// QueryBuilder rawQueryBuilder = this.getMatchQueryBuilder(path,fieldMap, highLevelQuery.getText(), isNot, SearchWordStrategyEnum.getByKey(highLevelQuery.getWordStrategy())); |
||||
|
// if(rawQueryBuilder != null){ |
||||
|
// result.should(rawQueryBuilder); |
||||
|
// } |
||||
|
// |
||||
|
// // 如果译文不为空,则进行译文普通搜索 |
||||
|
// if (highLevelQuery.getTranslateText() != null) { |
||||
|
// QueryBuilder transQueryBuilder = this.getMatchQueryBuilder(path,fieldMap, highLevelQuery.getTranslateText(), isNot, SearchWordStrategyEnum.getByKey(highLevelQuery.getWordStrategy())); |
||||
|
// if (transQueryBuilder != null){ |
||||
|
// result.should(transQueryBuilder); |
||||
|
// } |
||||
|
// } |
||||
|
// return result; |
||||
|
// } |
||||
|
// |
||||
|
// /** |
||||
|
// * 获取跨度搜索查询条件 |
||||
|
// * |
||||
|
// * @param field 字段名 |
||||
|
// * @param text 内容 |
||||
|
// * @param separator 分隔符 |
||||
|
// * @return |
||||
|
// */ |
||||
|
// private void addSpanQueryBuilder(BoolQueryBuilder queryBuilder, String field, String[] text, String separator) { |
||||
|
// |
||||
|
// if (text == null || text.length == 0) { |
||||
|
// return; |
||||
|
// } |
||||
|
// // 将所有原词按照空格拆分 |
||||
|
// /* |
||||
|
// String[] splitText = Stream.of(text) |
||||
|
// .filter(StringUtils::isNotBlank) |
||||
|
// .flatMap(e -> Stream.of(e.split(" "))) |
||||
|
// .filter(StringUtils::isNotBlank) |
||||
|
// .toArray(String[]::new); |
||||
|
// */ |
||||
|
// String[] splitText = text; |
||||
|
// if (splitText == null || splitText.length == 0) { |
||||
|
// return; |
||||
|
// } |
||||
|
// |
||||
|
// SpanNearQueryBuilder spanNearQueryBuilder = QueryBuilders.spanNearQuery(QueryBuilders.spanTermQuery(field, splitText[0]), 250).inOrder(false); |
||||
|
// Stream.of(splitText).skip(1).forEach(e -> spanNearQueryBuilder.addClause(QueryBuilders.spanTermQuery(field, e))); |
||||
|
// SpanQueryBuilder exclude = QueryBuilders.spanTermQuery(field, separator); |
||||
|
// SpanNotQueryBuilder spanNotQueryBuilder = QueryBuilders.spanNotQuery(spanNearQueryBuilder, exclude); |
||||
|
// //跨度搜索 为了高亮显示 新增对于每个单次进行查询。 |
||||
|
// BoolQueryBuilder query = new BoolQueryBuilder(); |
||||
|
// Stream.of(splitText).forEach(e -> query.must(QueryBuilders.matchPhraseQuery(BaseFieldEnum.content.name(), e))); |
||||
|
// queryBuilder.should(QueryBuilders.boolQuery().must(spanNotQueryBuilder).must(query)); |
||||
|
// } |
||||
|
// |
||||
|
// /** |
||||
|
// * 全文检索查询拼接----含词语策略 |
||||
|
// * |
||||
|
// * @param fieldMap 查询字段 |
||||
|
// * @param text 文本 |
||||
|
// * @param isNot 是否是排除 |
||||
|
// * @param strategyEnum 搜索词策略 |
||||
|
// * @return |
||||
|
// */ |
||||
|
// private QueryBuilder getMatchQueryBuilder(String nestedPath,Map<String, Float> fieldMap, String[] text, boolean isNot, SearchWordStrategyEnum strategyEnum) { |
||||
|
// |
||||
|
// if (text == null || text.length == 0) { |
||||
|
// return null; |
||||
|
// } |
||||
|
// /* |
||||
|
// // 将所有原词按照空格拆分 |
||||
|
// String[] splitText = Stream.of(text) |
||||
|
// .filter(StringUtils::isNotBlank) |
||||
|
// .flatMap(e -> Stream.of(e.split(" "))) |
||||
|
// .filter(StringUtils::isNotBlank) |
||||
|
// .toArray(String[]::new); |
||||
|
// */ |
||||
|
// String [] splitText = text; |
||||
|
// if (splitText == null || splitText.length == 0) { |
||||
|
// return null; |
||||
|
// } |
||||
|
// |
||||
|
// BoolQueryBuilder result = QueryBuilders.boolQuery(); |
||||
|
// // 如果是非 或 指定完整匹配,则用短语,否则用最佳字段 |
||||
|
// MultiMatchQueryBuilder.Type multiMatchType = isNot || SearchWordStrategyEnum.WHOLE.equals(strategyEnum) ? MultiMatchQueryBuilder.Type.PHRASE_PREFIX : MultiMatchQueryBuilder.Type.BEST_FIELDS; |
||||
|
// // 使用拆分后的词进行匹配----如果使用完整匹配则不进行拆分,否则按空格拆分 |
||||
|
// Stream.of(SearchWordStrategyEnum.WHOLE.equals(strategyEnum) ? text : splitText).forEach((e) -> { |
||||
|
// // 校验所有还是单个词 |
||||
|
// QueryBuilder matchQuery = this.getMatchQueryBuilder(nestedPath,fieldMap, multiMatchType, e); |
||||
|
// if (SearchWordStrategyEnum.ALL.equals(strategyEnum)) { |
||||
|
// result.must(matchQuery); |
||||
|
// } else { |
||||
|
// result.should(matchQuery); |
||||
|
// } |
||||
|
// }); |
||||
|
// return result; |
||||
|
// } |
||||
|
// |
||||
|
// |
||||
|
// |
||||
|
// /** |
||||
|
// * 全文检索查询拼接(非nested属性重载方法) |
||||
|
// * |
||||
|
// * @param fieldMap 查询字段 |
||||
|
// * @param type 查询类型 |
||||
|
// * @param text 文本 |
||||
|
// * @return |
||||
|
// */ |
||||
|
// private QueryBuilder getMatchQueryBuilder(Map<String, Float> fieldMap, MultiMatchQueryBuilder.Type type, String text) { |
||||
|
// return this.getMatchQueryBuilder(null,fieldMap,type,text); |
||||
|
// } |
||||
|
// |
||||
|
// /** |
||||
|
// * 全文检索查询拼接,不支持nested属性与非nested属性混合使用,并且nested属性必须归属相同path |
||||
|
// * |
||||
|
// * @param fieldMap 查询字段 |
||||
|
// * @param type 查询类型 |
||||
|
// * @param text 文本 |
||||
|
// * @return |
||||
|
// */ |
||||
|
// private QueryBuilder getMatchQueryBuilder(String nestedPath,Map<String, Float> fieldMap, MultiMatchQueryBuilder.Type type, String text) { |
||||
|
// // 拼装搜索 |
||||
|
// QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery(text) |
||||
|
// .fields(fieldMap) |
||||
|
// .type(type == null ? MultiMatchQueryBuilder.Type.BEST_FIELDS : type) |
||||
|
// .maxExpansions(5) |
||||
|
// .tieBreaker(0.3f) |
||||
|
// /// 关闭高频词处理 |
||||
|
// //.cutoffFrequency(0.01f) |
||||
|
// .lenient(Boolean.TRUE) |
||||
|
// .minimumShouldMatch("60%"); |
||||
|
// |
||||
|
// // 如果有path拼接nested并返回 |
||||
|
// if (!Strings.isNullOrEmpty(nestedPath)){ |
||||
|
// return this.nestedQuery(nestedPath, queryBuilder); |
||||
|
// } |
||||
|
// return queryBuilder; |
||||
|
// } |
||||
|
// |
||||
|
//} |
@ -0,0 +1,240 @@ |
|||||
|
package com.bfd.mf.common.service.es; |
||||
|
|
||||
|
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; |
||||
|
import org.elasticsearch.search.sort.SortOrder; |
||||
|
|
||||
|
import java.util.ArrayList; |
||||
|
import java.util.LinkedHashMap; |
||||
|
import java.util.List; |
||||
|
|
||||
|
/** |
||||
|
* es查询基类 |
||||
|
* @author Aquarius & Hao |
||||
|
*/ |
||||
|
public class EsBaseParam { |
||||
|
|
||||
|
public EsBaseParam(){} |
||||
|
|
||||
|
/** |
||||
|
* 构建 |
||||
|
* @param indexEnum |
||||
|
*/ |
||||
|
// public EsBaseParam(IndexEnum indexEnum){ |
||||
|
// this.index = new String[]{indexEnum.getSearchIndex()}; |
||||
|
// this.type = indexEnum.getType(); |
||||
|
// } |
||||
|
|
||||
|
/** |
||||
|
* 构建 |
||||
|
* @param index |
||||
|
* @param type |
||||
|
*/ |
||||
|
public EsBaseParam(String index, String type){ |
||||
|
this.index = new String[]{index}; |
||||
|
this.type = type; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 排序 |
||||
|
*/ |
||||
|
private String orderField; |
||||
|
private SortOrder descOrAsc; |
||||
|
|
||||
|
/** |
||||
|
* 多列排序 |
||||
|
*/ |
||||
|
private LinkedHashMap<String, SortOrder> lhashMap; |
||||
|
|
||||
|
/** |
||||
|
* 当前页码 |
||||
|
*/ |
||||
|
private Integer page; |
||||
|
/** |
||||
|
* 每页条数 |
||||
|
*/ |
||||
|
private Integer limit; |
||||
|
/** |
||||
|
* 从第几条开始 |
||||
|
*/ |
||||
|
private Integer offset; |
||||
|
|
||||
|
/** |
||||
|
* ES的索引 |
||||
|
*/ |
||||
|
private String[] index; |
||||
|
/** |
||||
|
* ES的type |
||||
|
*/ |
||||
|
private String type; |
||||
|
/** |
||||
|
* 分组的列 |
||||
|
*/ |
||||
|
private String term; |
||||
|
/** |
||||
|
* 分组的列1 |
||||
|
*/ |
||||
|
private String term1; |
||||
|
|
||||
|
/** |
||||
|
* 指定返回的字段名,不指定返回全部 |
||||
|
*/ |
||||
|
private String[] includes; |
||||
|
|
||||
|
/** |
||||
|
* 排出返回的字段名,不指定不做限制 |
||||
|
*/ |
||||
|
private String[] excludes; |
||||
|
|
||||
|
/** |
||||
|
* 高亮属性 |
||||
|
*/ |
||||
|
private HighlightBuilder highlightBuilder; |
||||
|
|
||||
|
/** |
||||
|
* 是否需要高亮 |
||||
|
*/ |
||||
|
private boolean withHighlight = false; |
||||
|
/** |
||||
|
* 高亮字段 |
||||
|
*/ |
||||
|
private List<String> highlightFields = new ArrayList<>(); |
||||
|
|
||||
|
public String[] getIncludes() { |
||||
|
return includes; |
||||
|
} |
||||
|
|
||||
|
public void setIncludes(String[] includes) { |
||||
|
this.includes = includes; |
||||
|
} |
||||
|
|
||||
|
public String[] getExcludes() { |
||||
|
return excludes; |
||||
|
} |
||||
|
|
||||
|
public void setExcludes(String[] excludes) { |
||||
|
this.excludes = excludes; |
||||
|
} |
||||
|
|
||||
|
public String getTerm1() { |
||||
|
return term1; |
||||
|
} |
||||
|
|
||||
|
public void setTerm1(String term1) { |
||||
|
this.term1 = term1; |
||||
|
} |
||||
|
|
||||
|
public String getOrderField() { |
||||
|
return orderField; |
||||
|
} |
||||
|
|
||||
|
public void setOrderField(String orderField) { |
||||
|
this.orderField = orderField; |
||||
|
} |
||||
|
|
||||
|
public String[] getIndex() { |
||||
|
return index; |
||||
|
} |
||||
|
|
||||
|
public void setIndex(String... index) { |
||||
|
this.index = index; |
||||
|
} |
||||
|
|
||||
|
public String getType() { |
||||
|
return type; |
||||
|
} |
||||
|
|
||||
|
public void setType(String type) { |
||||
|
this.type = type; |
||||
|
} |
||||
|
|
||||
|
public String getTerm() { |
||||
|
return term; |
||||
|
} |
||||
|
|
||||
|
public void setTerm(String term) { |
||||
|
this.term = term; |
||||
|
} |
||||
|
|
||||
|
public LinkedHashMap<String, SortOrder> getLhashMap() { |
||||
|
return lhashMap; |
||||
|
} |
||||
|
|
||||
|
public void setLhashMap(LinkedHashMap<String, SortOrder> lhashMap) { |
||||
|
this.lhashMap = lhashMap; |
||||
|
} |
||||
|
|
||||
|
public SortOrder getDescOrAsc() { |
||||
|
return descOrAsc; |
||||
|
} |
||||
|
|
||||
|
public void setDescOrAsc(SortOrder descOrAsc) { |
||||
|
this.descOrAsc = descOrAsc; |
||||
|
} |
||||
|
|
||||
|
public Integer getPage() { |
||||
|
return page; |
||||
|
} |
||||
|
|
||||
|
public void setPage(Integer page) { |
||||
|
this.page = page; |
||||
|
} |
||||
|
|
||||
|
public Integer getLimit() { |
||||
|
if (null == limit) { |
||||
|
limit = 0; |
||||
|
} |
||||
|
return limit; |
||||
|
} |
||||
|
|
||||
|
public void setLimit(Integer limit) { |
||||
|
this.limit = limit; |
||||
|
} |
||||
|
|
||||
|
public Integer getOffset() { |
||||
|
if (this.page != null && this.limit != null) { |
||||
|
if (this.page > 0 && this.limit > 0) { |
||||
|
offset = (this.page - 1) * this.limit; |
||||
|
} else { |
||||
|
offset = -1; |
||||
|
} |
||||
|
} |
||||
|
if (null == offset) { |
||||
|
offset = -1; |
||||
|
} |
||||
|
return offset; |
||||
|
} |
||||
|
|
||||
|
public void setOffset(Integer offset) { |
||||
|
this.offset = offset; |
||||
|
} |
||||
|
|
||||
|
public EsBaseParam orderBy(String orderField, SortOrder descOrAsc){ |
||||
|
this.setOrderField(orderField); |
||||
|
this.setDescOrAsc(descOrAsc); |
||||
|
return this; |
||||
|
} |
||||
|
|
||||
|
public boolean isWithHighlight() { |
||||
|
return withHighlight; |
||||
|
} |
||||
|
|
||||
|
public void setWithHighlight(boolean withHighlight) { |
||||
|
this.withHighlight = withHighlight; |
||||
|
} |
||||
|
|
||||
|
public List<String> getHighlightFields() { |
||||
|
return highlightFields; |
||||
|
} |
||||
|
|
||||
|
public void setHighlightFields(List<String> highlightFields) { |
||||
|
this.highlightFields = highlightFields; |
||||
|
} |
||||
|
|
||||
|
public HighlightBuilder getHighlightBuilder() { |
||||
|
return highlightBuilder; |
||||
|
} |
||||
|
|
||||
|
public void setHighlightBuilder(HighlightBuilder highlightBuilder) { |
||||
|
this.highlightBuilder = highlightBuilder; |
||||
|
} |
||||
|
} |
@ -0,0 +1,277 @@ |
|||||
|
//package com.bfd.mf.common.service.es; |
||||
|
// |
||||
|
//import cn.percent.common.constants.Constants; |
||||
|
//import cn.percent.common.utils.BeanUtils; |
||||
|
//import cn.percent.modules.ais.entity.es.BaseEsEntity; |
||||
|
//import com.alibaba.fastjson.JSON; |
||||
|
//import com.google.common.base.Strings; |
||||
|
//import com.google.common.collect.Lists; |
||||
|
//import org.apache.commons.lang.ObjectUtils; |
||||
|
//import org.apache.commons.lang.StringUtils; |
||||
|
// |
||||
|
//import java.util.ArrayList; |
||||
|
//import java.util.List; |
||||
|
//import java.util.Map; |
||||
|
// |
||||
|
///** |
||||
|
// * ElasticSearch返回值 |
||||
|
// * |
||||
|
// * @author lihonghao |
||||
|
// */ |
||||
|
//public class EsDTO { |
||||
|
// public EsDTO() { |
||||
|
// } |
||||
|
// |
||||
|
// public EsDTO(String docId, Map<String, Object> data) { |
||||
|
// this.docId = docId; |
||||
|
// this.data = data; |
||||
|
// } |
||||
|
// |
||||
|
// public EsDTO(String docId, String index, Map<String, Object> data) { |
||||
|
// this.docId = docId; |
||||
|
// this.index = index; |
||||
|
// this.data = data; |
||||
|
// } |
||||
|
// |
||||
|
// /** |
||||
|
// * 唯一主键 |
||||
|
// */ |
||||
|
// private String docId; |
||||
|
// /** |
||||
|
// * 索引名字 |
||||
|
// */ |
||||
|
// private String index; |
||||
|
// /** |
||||
|
// * 索引类型 |
||||
|
// */ |
||||
|
// private String type; |
||||
|
// |
||||
|
// /** |
||||
|
// * 数据 |
||||
|
// */ |
||||
|
// private Map<String, Object> data; |
||||
|
// /** |
||||
|
// * 数据 |
||||
|
// */ |
||||
|
// private Map<String, String> highlightData; |
||||
|
// |
||||
|
// /** |
||||
|
// * 获取String值 |
||||
|
// * |
||||
|
// * @param key |
||||
|
// * @return |
||||
|
// */ |
||||
|
// public String getString(Object key) { |
||||
|
// return data == null ? "" : ObjectUtils.toString(data.get(key), ""); |
||||
|
// } |
||||
|
// |
||||
|
// /** |
||||
|
// * 获取String值 |
||||
|
// * |
||||
|
// * @param key |
||||
|
// * @return |
||||
|
// */ |
||||
|
// public String getString(Object key, String nullStr) { |
||||
|
// return data == null ? "" : ObjectUtils.toString(data.get(key), nullStr); |
||||
|
// } |
||||
|
// |
||||
|
// /** |
||||
|
// * 地理坐标点用字符串形式表示时是纬度在前,经度在后(”latitude,longitude”), |
||||
|
// * 而数组形式表示时刚好相反,是经度在前,纬度在后([longitude,latitude])。 |
||||
|
// * 其实,在 ElasticeSearch 内部,不管字符串形式还是数组形式,都是纬度在前,经度在后。 |
||||
|
// * 不过早期为了适配 GeoJSON 的格式规范,调整了数组形式的表示方式。 |
||||
|
// * 因此,在使用地理位置(geolocation)的路上就出现了这么一个“捕熊器”,专坑那些不了解这个陷阱的使用者。 |
||||
|
// * <p> |
||||
|
// * 获取String值 |
||||
|
// * |
||||
|
// * @param key |
||||
|
// * @return [lon, lat] |
||||
|
// */ |
||||
|
// public Double[] getLocation(Object key) { |
||||
|
// try { |
||||
|
// if (data == null) { |
||||
|
// return null; |
||||
|
// } |
||||
|
// Object location = data.get(key); |
||||
|
// if (location == null) { |
||||
|
// return null; |
||||
|
// } |
||||
|
// |
||||
|
// if (location instanceof ArrayList) { |
||||
|
// List<Double> geoList = Lists.newArrayList(); |
||||
|
// ((ArrayList) location).forEach(e -> geoList.add(Double.parseDouble(ObjectUtils.toString(e)))); |
||||
|
// return geoList.toArray(new Double[geoList.size()]); |
||||
|
// } |
||||
|
// if (location instanceof Object[]) { |
||||
|
// return (Double[]) location; |
||||
|
// } |
||||
|
// if (location instanceof String) { |
||||
|
// String strLocation = ObjectUtils.toString(location, ""); |
||||
|
// if (strLocation.indexOf(Constants.SEPARATOR_COMMA) != -1) { |
||||
|
// String[] arrLocation = strLocation.split(","); |
||||
|
// return new Double[]{Double.parseDouble(arrLocation[0]), Double.parseDouble(arrLocation[1])}; |
||||
|
// } |
||||
|
// } |
||||
|
// return null; |
||||
|
// } catch (Exception e) { |
||||
|
// e.printStackTrace(); |
||||
|
// return null; |
||||
|
// } |
||||
|
// } |
||||
|
// |
||||
|
// /** |
||||
|
// * 获取经度值 |
||||
|
// * |
||||
|
// * @param key |
||||
|
// */ |
||||
|
// public Double getLongitude(Object key) { |
||||
|
// Double[] geoMap = getLocation(key); |
||||
|
// return geoMap == null ? null : geoMap[0]; |
||||
|
// } |
||||
|
// |
||||
|
// /** |
||||
|
// * 获取纬度值 |
||||
|
// * |
||||
|
// * @param key |
||||
|
// */ |
||||
|
// public Double getLatitude(Object key) { |
||||
|
// Double[] geoMap = getLocation(key); |
||||
|
// return geoMap == null ? null : geoMap[1]; |
||||
|
// } |
||||
|
// |
||||
|
// /** |
||||
|
// * 转实体 |
||||
|
// * |
||||
|
// * @param clazz |
||||
|
// * @param <T> |
||||
|
// * @return |
||||
|
// */ |
||||
|
// public <T> T toEntity(Class<T> clazz) { |
||||
|
// if (data == null) { |
||||
|
// return null; |
||||
|
// } |
||||
|
// // 如果继承至es基类则赋值doc_id |
||||
|
// T entity = JSON.parseObject(JSON.toJSONString(data), clazz); |
||||
|
// if (BaseEsEntity.class.isAssignableFrom(clazz)) { |
||||
|
// BeanUtils.setProperty(entity, BaseEsEntity.DOC_ID, this.getDocId()); |
||||
|
// if (this.getIndex() != null) { |
||||
|
// BeanUtils.setProperty(entity, BaseEsEntity.INDEX, this.getIndex()); |
||||
|
// } |
||||
|
// if (this.getType() != null) { |
||||
|
// BeanUtils.setProperty(entity, BaseEsEntity.TYPE, this.getType()); |
||||
|
// } |
||||
|
// } |
||||
|
// return entity; |
||||
|
// } |
||||
|
// |
||||
|
// /** |
||||
|
// * 转高亮实体 |
||||
|
// * |
||||
|
// * @param clazz |
||||
|
// * @param <T> |
||||
|
// * @return |
||||
|
// */ |
||||
|
// public <T> T toHighlightEntity(Class<T> clazz) { |
||||
|
// String emTag = "<em>"; |
||||
|
// if (data == null) { |
||||
|
// return null; |
||||
|
// } |
||||
|
// if (highlightData != null) { |
||||
|
// |
||||
|
// highlightData.forEach((k, v) -> { |
||||
|
// boolean flag = data.get(k) == null || (!Strings.isNullOrEmpty(v) && v.contains(emTag)); |
||||
|
// if (flag){ |
||||
|
// data.put(k, v); |
||||
|
// } |
||||
|
// }); |
||||
|
// // data.putAll(highlightData); |
||||
|
// } |
||||
|
// // 如果拼音有值则覆盖原始值 |
||||
|
// if (highlightData != null) { |
||||
|
// highlightData.forEach((k, v) -> { |
||||
|
// String realKey = k; |
||||
|
// // 处理拼音后缀高亮 |
||||
|
// if (k.endsWith(EsBase.ES_PINYIN_SUFFIX) && StringUtils.isNotBlank(v)) { |
||||
|
// // 获取拼音字段原始key(去掉后缀.pinyin) |
||||
|
// realKey = StringUtils.removeEnd(k, EsBase.ES_PINYIN_SUFFIX); |
||||
|
// // 获取原始字段值 |
||||
|
// String realValue = data.get(realKey) == null ? "" : data.get(realKey).toString(); |
||||
|
// // 原始值中是否有高亮 |
||||
|
// boolean isOriginalHighlight = !Strings.isNullOrEmpty(realValue) && realValue.contains(emTag); |
||||
|
// // 如果原始值中有高亮则不再处理 |
||||
|
// if (isOriginalHighlight) { |
||||
|
// return; |
||||
|
// } |
||||
|
// |
||||
|
// // 如果原始值没有高亮,那么判断拼音值是否有高亮 |
||||
|
// String pinyinValue = v == null ? "" : v; |
||||
|
// // 原始值中是否有高亮 |
||||
|
// boolean isPinyinHighlight = !Strings.isNullOrEmpty(pinyinValue) && pinyinValue.contains(emTag); |
||||
|
// if (isPinyinHighlight) { |
||||
|
// data.put(realKey, v); |
||||
|
// } |
||||
|
// } |
||||
|
// }); |
||||
|
// } |
||||
|
// // 如果继承至es基类则赋值doc_id |
||||
|
// T entity = JSON.parseObject(JSON.toJSONString(data), clazz); |
||||
|
// if (BaseEsEntity.class.isAssignableFrom(clazz)) { |
||||
|
// BeanUtils.setProperty(entity, BaseEsEntity.DOC_ID, this.getDocId()); |
||||
|
// if (this.getIndex() != null) { |
||||
|
// BeanUtils.setProperty(entity, BaseEsEntity.INDEX, this.getIndex()); |
||||
|
// } |
||||
|
// if (this.getType() != null) { |
||||
|
// BeanUtils.setProperty(entity, BaseEsEntity.TYPE, this.getType()); |
||||
|
// } |
||||
|
// } |
||||
|
// return entity; |
||||
|
// } |
||||
|
// |
||||
|
// public String getDocId() { |
||||
|
// return docId; |
||||
|
// } |
||||
|
// |
||||
|
// public void setDocId(String docId) { |
||||
|
// this.docId = docId; |
||||
|
// } |
||||
|
// |
||||
|
// public Map<String, Object> getData() { |
||||
|
// return data; |
||||
|
// } |
||||
|
// |
||||
|
// public void setData(Map<String, Object> data) { |
||||
|
// this.data = data; |
||||
|
// } |
||||
|
// |
||||
|
// public Map<String, String> getHighlightData() { |
||||
|
// return highlightData; |
||||
|
// } |
||||
|
// |
||||
|
// public void setHighlightData(Map<String, String> highlightData) { |
||||
|
// this.highlightData = highlightData; |
||||
|
// } |
||||
|
// |
||||
|
// public String getIndex() { |
||||
|
// return index; |
||||
|
// } |
||||
|
// |
||||
|
// public void setIndex(String index) { |
||||
|
// this.index = index; |
||||
|
// } |
||||
|
// |
||||
|
// public String getType() { |
||||
|
// return type; |
||||
|
// } |
||||
|
// |
||||
|
// public void setType(String type) { |
||||
|
// this.type = type; |
||||
|
// } |
||||
|
// |
||||
|
// @Override |
||||
|
// public String toString() { |
||||
|
// return "EsDTO{" + |
||||
|
// "docId='" + docId + '\'' + |
||||
|
// ", data=" + data + |
||||
|
// '}'; |
||||
|
// } |
||||
|
//} |
@ -0,0 +1,118 @@ |
|||||
|
package com.bfd.mf.common.service.es; |
||||
|
|
||||
|
import com.bfd.mf.common.util.enums.SearchExpressionEnum; |
||||
|
import com.bfd.mf.common.util.enums.SearchMatchTypeEnum; |
||||
|
import com.bfd.mf.common.util.enums.SearchScopeEnum; |
||||
|
import com.bfd.mf.common.util.enums.SearchWordStrategyEnum; |
||||
|
import com.google.common.base.Strings; |
||||
|
import io.swagger.annotations.ApiModel; |
||||
|
import io.swagger.annotations.ApiModelProperty; |
||||
|
import org.apache.commons.lang.StringUtils; |
||||
|
|
||||
|
import java.io.Serializable; |
||||
|
import java.util.stream.Stream; |
||||
|
|
||||
|
/** |
||||
|
* 高级搜索条件 |
||||
|
* @author lihonghao |
||||
|
*/ |
||||
|
@ApiModel(value = "HighLevelQuery") |
||||
|
public class HighLevelQuery implements Serializable { |
||||
|
|
||||
|
/** |
||||
|
* 表达式 |
||||
|
*/ |
||||
|
@ApiModelProperty(value = "表达式 1-AND 2-OR 3-NOT") |
||||
|
private Integer expression = SearchExpressionEnum.AND.iKey(); |
||||
|
/** |
||||
|
* 搜索类型 |
||||
|
*/ |
||||
|
@ApiModelProperty(value = "搜索范围 100-全文 200-标题 300-内容 400-关键词 500-同一段落 600-同一句子") |
||||
|
private Integer scope = SearchScopeEnum.ALL.iKey(); |
||||
|
/** |
||||
|
* 搜索词策略 |
||||
|
*/ |
||||
|
@ApiModelProperty(value = "搜索词策略 1-包含以下全部字词 2-包含以下完整词句 3-包含以下任一字词, 默认 3") |
||||
|
private String wordStrategy = SearchWordStrategyEnum.ANY.getKey(); |
||||
|
/** |
||||
|
* 文本内容 |
||||
|
*/ |
||||
|
@ApiModelProperty(value = "文本内容") |
||||
|
private String[] text; |
||||
|
/** |
||||
|
* 文本内容 |
||||
|
*/ |
||||
|
@ApiModelProperty(value = "译后-文本内容") |
||||
|
private String[] translateText; |
||||
|
/** |
||||
|
* 跨语种 |
||||
|
*/ |
||||
|
@ApiModelProperty(value = "跨语种, zh, en...") |
||||
|
private String language; |
||||
|
|
||||
|
/** |
||||
|
* 本条件是否可用 值不为空且如果是数组则数组至少有一个不为空 |
||||
|
* @return |
||||
|
*/ |
||||
|
@ApiModelProperty(hidden = true) |
||||
|
public boolean isAvailable(){ |
||||
|
return text != null && !Stream.of(text).allMatch(Strings::isNullOrEmpty); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取匹配类型 |
||||
|
* @return |
||||
|
*/ |
||||
|
@ApiModelProperty(hidden = true) |
||||
|
public SearchMatchTypeEnum getMatchType() { |
||||
|
return SearchScopeEnum.getMatchTypeByKey(this.scope); |
||||
|
} |
||||
|
|
||||
|
public Integer getExpression() { |
||||
|
return expression; |
||||
|
} |
||||
|
|
||||
|
public void setExpression(Integer expression) { |
||||
|
this.expression = expression; |
||||
|
} |
||||
|
|
||||
|
public Integer getScope() { |
||||
|
return scope; |
||||
|
} |
||||
|
|
||||
|
public void setScope(Integer scope) { |
||||
|
this.scope = scope; |
||||
|
} |
||||
|
|
||||
|
public String[] getText() { |
||||
|
return text; |
||||
|
} |
||||
|
|
||||
|
public void setText(String[] text) { |
||||
|
this.text = text == null ? null : Stream.of(text).filter(StringUtils::isNotBlank).toArray(String[]::new); |
||||
|
} |
||||
|
|
||||
|
public String[] getTranslateText() { |
||||
|
return translateText; |
||||
|
} |
||||
|
|
||||
|
public void setTranslateText(String[] translateText) { |
||||
|
this.translateText = translateText == null ? null : Stream.of(translateText).filter(StringUtils::isNotBlank).toArray(String[]::new); |
||||
|
} |
||||
|
|
||||
|
public String getLanguage() { |
||||
|
return language; |
||||
|
} |
||||
|
|
||||
|
public void setLanguage(String language) { |
||||
|
this.language = language; |
||||
|
} |
||||
|
|
||||
|
public String getWordStrategy() { |
||||
|
return wordStrategy; |
||||
|
} |
||||
|
|
||||
|
public void setWordStrategy(String wordStrategy) { |
||||
|
this.wordStrategy = wordStrategy; |
||||
|
} |
||||
|
} |
@ -0,0 +1,209 @@ |
|||||
|
package com.bfd.mf.common.util.enums; |
||||
|
|
||||
|
import java.util.Arrays; |
||||
|
import java.util.HashMap; |
||||
|
import java.util.Map; |
||||
|
|
||||
|
/** |
||||
|
* 文档-网页-图片索引属性枚举 |
||||
|
* @author lihonghao |
||||
|
*/ |
||||
|
public enum BaseFieldEnum { |
||||
|
/** |
||||
|
* 文件id |
||||
|
*/ |
||||
|
id, |
||||
|
/** |
||||
|
* 文件md5值 |
||||
|
*/ |
||||
|
md5, |
||||
|
/** |
||||
|
* 文件标题 |
||||
|
*/ |
||||
|
title, |
||||
|
/** |
||||
|
* 摘要 |
||||
|
*/ |
||||
|
summary, |
||||
|
/** |
||||
|
* 文档内容 |
||||
|
*/ |
||||
|
content, |
||||
|
/** |
||||
|
* 数据来源 |
||||
|
*/ |
||||
|
source, |
||||
|
/** |
||||
|
* 原文/译文 |
||||
|
*/ |
||||
|
type, |
||||
|
/** |
||||
|
* 原文id |
||||
|
*/ |
||||
|
original_id, |
||||
|
/** |
||||
|
*入库时间 |
||||
|
*/ |
||||
|
create_time, |
||||
|
/** |
||||
|
* 文档语言 |
||||
|
*/ |
||||
|
language, |
||||
|
/** |
||||
|
* 上传用户 |
||||
|
*/ |
||||
|
upload_user, |
||||
|
/** |
||||
|
* 上传用户姓名 |
||||
|
*/ |
||||
|
upload_user_name, |
||||
|
/** |
||||
|
* 是否删除 |
||||
|
*/ |
||||
|
del, |
||||
|
/** |
||||
|
* 网站枚举 |
||||
|
*/ |
||||
|
website, |
||||
|
/** |
||||
|
* 发布人 |
||||
|
*/ |
||||
|
publisher, |
||||
|
/** |
||||
|
* 发布时间 |
||||
|
*/ |
||||
|
public_time, |
||||
|
/** |
||||
|
* 网站版面 |
||||
|
*/ |
||||
|
cate_md5, |
||||
|
/** |
||||
|
* 智能标签 |
||||
|
*/ |
||||
|
ai_tag, |
||||
|
/** |
||||
|
* 智能地区 |
||||
|
*/ |
||||
|
ai_area, |
||||
|
/** |
||||
|
* 主题一级分类 |
||||
|
*/ |
||||
|
subject_classify1, |
||||
|
/** |
||||
|
* 主题二级分类 |
||||
|
*/ |
||||
|
subject_classify2, |
||||
|
/** |
||||
|
* 主题 |
||||
|
*/ |
||||
|
subject, |
||||
|
/** |
||||
|
* 渠道 |
||||
|
*/ |
||||
|
channel, |
||||
|
/** |
||||
|
* 审核状态 |
||||
|
*/ |
||||
|
audit_state, |
||||
|
/** |
||||
|
* 用户上传文档,归属部门 |
||||
|
*/ |
||||
|
department_id, |
||||
|
/** |
||||
|
* 整编状态 |
||||
|
*/ |
||||
|
edit_state, |
||||
|
|
||||
|
/** |
||||
|
* 敏感词 |
||||
|
*/ |
||||
|
sensitive_tag, |
||||
|
/** |
||||
|
* 置顶状态 |
||||
|
*/ |
||||
|
flag_top, |
||||
|
/** |
||||
|
* 置顶有效期 |
||||
|
*/ |
||||
|
flag_top_validity, |
||||
|
/** |
||||
|
* 0-无 1-不重要 2-有点重要 3-一般、4-重要、5-非常重要 |
||||
|
*/ |
||||
|
flag_importance, |
||||
|
/** |
||||
|
* 分类标签 |
||||
|
*/ |
||||
|
subject_tag, |
||||
|
/** |
||||
|
* 事件id |
||||
|
*/ |
||||
|
event_id, |
||||
|
/** |
||||
|
* 事件id |
||||
|
*/ |
||||
|
event_detect_time, |
||||
|
/** |
||||
|
* 重复校验字段 |
||||
|
*/ |
||||
|
duplicate_key, |
||||
|
/** |
||||
|
* 媒体类型 |
||||
|
*/ |
||||
|
media_type, |
||||
|
/** |
||||
|
* 文中提及的标准时间 |
||||
|
*/ |
||||
|
norm_time, |
||||
|
/** |
||||
|
* 时间间隔(天) |
||||
|
*/ |
||||
|
delay_time, |
||||
|
/** |
||||
|
* 省名称 |
||||
|
*/ |
||||
|
province_code, |
||||
|
/** |
||||
|
* 市名称 |
||||
|
*/ |
||||
|
city_code, |
||||
|
/** |
||||
|
* 区县 |
||||
|
*/ |
||||
|
county_code, |
||||
|
|
||||
|
; |
||||
|
|
||||
|
/** |
||||
|
* 需要进行匹配的属性 |
||||
|
* @return |
||||
|
*/ |
||||
|
public static Map<String, Float> getMatchFields(){ |
||||
|
Map<String, Float> matchMap = new HashMap<>(2); |
||||
|
matchMap.put(BaseFieldEnum.title.name(), 2.0F); |
||||
|
matchMap.put(BaseFieldEnum.content.name(), 1.0F); |
||||
|
return matchMap; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 需要进行匹配的属性-含拼音 |
||||
|
* @return |
||||
|
*/ |
||||
|
public static Map<String, Float> getMatchFieldsWithPy(){ |
||||
|
Map<String, Float> matchMap = getMatchFields(); |
||||
|
Map<String, Float> pyMap = new HashMap<>(matchMap.size() * 2); |
||||
|
matchMap.forEach((k, v) -> { |
||||
|
pyMap.put(k, v); |
||||
|
/// 系统中取消拼音搜索 |
||||
|
//pyMap.put(k.concat(EsBase.ES_PINYIN_SUFFIX), v/10); |
||||
|
}); |
||||
|
return pyMap; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取全部属性名 |
||||
|
* @return |
||||
|
*/ |
||||
|
public static String[] getAllFields(){ |
||||
|
return Arrays.stream(values()).map(BaseFieldEnum::name).toArray(String[]::new); |
||||
|
} |
||||
|
} |
@ -0,0 +1,15 @@ |
|||||
|
package com.bfd.mf.common.util.enums; |
||||
|
|
||||
|
import javax.annotation.Resource; |
||||
|
|
||||
|
/** |
||||
|
* @Author dujing |
||||
|
* @Date 2023/4/23 10:34 |
||||
|
*/ |
||||
|
public enum DocumentFieldEnum { |
||||
|
; |
||||
|
|
||||
|
public static Resource title; |
||||
|
public static Resource content; |
||||
|
public static Resource ai_tag; |
||||
|
} |
@ -0,0 +1,138 @@ |
|||||
|
package com.bfd.mf.common.util.enums; |
||||
|
|
||||
|
import com.google.common.collect.Lists; |
||||
|
import com.google.common.collect.Maps; |
||||
|
|
||||
|
import java.util.Arrays; |
||||
|
import java.util.LinkedHashMap; |
||||
|
import java.util.List; |
||||
|
|
||||
|
/** |
||||
|
* 表达式枚举值 |
||||
|
* |
||||
|
* @author honghao.li |
||||
|
*/ |
||||
|
public enum SearchExpressionEnum { |
||||
|
|
||||
|
/** |
||||
|
* 与 |
||||
|
*/ |
||||
|
AND("1", ""), |
||||
|
/** |
||||
|
* 或 |
||||
|
*/ |
||||
|
OR("2", ""), |
||||
|
/** |
||||
|
* 非 |
||||
|
*/ |
||||
|
NOT("3", ""); |
||||
|
|
||||
|
/** |
||||
|
* 码值 |
||||
|
*/ |
||||
|
private String key; |
||||
|
/** |
||||
|
* 国际化值 |
||||
|
*/ |
||||
|
private String label; |
||||
|
|
||||
|
/** |
||||
|
* @param key 码值 |
||||
|
* @param label 列表展示值国际化编码 |
||||
|
*/ |
||||
|
SearchExpressionEnum(String key, String label) { |
||||
|
this.key = key; |
||||
|
this.label = label; |
||||
|
} |
||||
|
|
||||
|
public String getKey() { |
||||
|
return key; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 返回int型枚举 |
||||
|
* |
||||
|
* @return |
||||
|
*/ |
||||
|
public int iKey() { |
||||
|
return Integer.parseInt(key); |
||||
|
} |
||||
|
|
||||
|
public String getLabel() { |
||||
|
return label; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取当前枚举值的国际化 |
||||
|
* |
||||
|
* @return |
||||
|
*/ |
||||
|
// public String getLabelI18n() { |
||||
|
// return LocaleI18nUtils.getMessage(label); |
||||
|
// } |
||||
|
|
||||
|
/** |
||||
|
* 判断是否是当前枚举 |
||||
|
* |
||||
|
* @param key |
||||
|
* @return |
||||
|
*/ |
||||
|
public boolean is(Integer key) { |
||||
|
return Integer.valueOf(getKey()).equals(key); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 校验是否支持此类型 |
||||
|
* |
||||
|
* @param key |
||||
|
* @return |
||||
|
*/ |
||||
|
public static boolean isSupport(String key) { |
||||
|
return Arrays.stream(values()).anyMatch(e -> e.getKey().equals(key)); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取全部枚举值的map |
||||
|
* |
||||
|
* @return |
||||
|
*/ |
||||
|
public static LinkedHashMap<String, SearchExpressionEnum> getEnumMap() { |
||||
|
LinkedHashMap<String, SearchExpressionEnum> map = Maps.newLinkedHashMap(); |
||||
|
for (SearchExpressionEnum temp : values()) { |
||||
|
map.put(temp.getKey(), temp); |
||||
|
} |
||||
|
return map; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 根据key获取国际化内容 |
||||
|
* |
||||
|
* @param key |
||||
|
* @return |
||||
|
*/ |
||||
|
// public static String getLabelI18n(String key) { |
||||
|
// if (key == null) { |
||||
|
// return ""; |
||||
|
// } |
||||
|
// |
||||
|
// LinkedHashMap<String, SearchExpressionEnum> map = getEnumMap(); |
||||
|
// if (map.containsKey(key)) { |
||||
|
// return map.get(key).getLabelI18n(); |
||||
|
// } |
||||
|
// return key; |
||||
|
// } |
||||
|
// |
||||
|
// /** |
||||
|
// * 获取key value模式枚举值集合 |
||||
|
// * |
||||
|
// * @return |
||||
|
// */ |
||||
|
// public static List<KeyValueDTO> getEnumList() { |
||||
|
// List<KeyValueDTO> rList = Lists.newArrayList(); |
||||
|
// for (SearchExpressionEnum temp : values()) { |
||||
|
// rList.add(KeyValueDTO.parse(temp.getKey(), temp.getLabelI18n())); |
||||
|
// } |
||||
|
// return rList; |
||||
|
// } |
||||
|
|
||||
|
} |
@ -0,0 +1,160 @@ |
|||||
|
package com.bfd.mf.common.util.enums; |
||||
|
|
||||
|
import com.google.common.collect.Lists; |
||||
|
import com.google.common.collect.Maps; |
||||
|
|
||||
|
import java.util.Arrays; |
||||
|
import java.util.LinkedHashMap; |
||||
|
import java.util.List; |
||||
|
import java.util.stream.Stream; |
||||
|
|
||||
|
/** |
||||
|
* 跨度枚举值 |
||||
|
* |
||||
|
* @author honghao.li |
||||
|
*/ |
||||
|
public enum SearchMatchTypeEnum { |
||||
|
/** |
||||
|
* 分词 |
||||
|
*/ |
||||
|
MATCH("1", ""), |
||||
|
/** |
||||
|
* 精确 |
||||
|
*/ |
||||
|
ACCURATE("2", ""), |
||||
|
/** |
||||
|
* 模糊 |
||||
|
*/ |
||||
|
FUZZY("3", ""), |
||||
|
/** |
||||
|
* 同段 |
||||
|
*/ |
||||
|
PARAGRAPH("4", ""), |
||||
|
/** |
||||
|
* 同句 |
||||
|
*/ |
||||
|
SENTENCE("5", ""), |
||||
|
/** |
||||
|
* 嵌套 |
||||
|
*/ |
||||
|
NESTED("6", ""); |
||||
|
|
||||
|
/** |
||||
|
* 码值 |
||||
|
*/ |
||||
|
private String key; |
||||
|
/** |
||||
|
* 国际化值 |
||||
|
*/ |
||||
|
private String label; |
||||
|
|
||||
|
/** |
||||
|
* @param key 码值 |
||||
|
* @param label 列表展示值国际化编码 |
||||
|
*/ |
||||
|
SearchMatchTypeEnum(String key, String label) { |
||||
|
this.key = key; |
||||
|
this.label = label; |
||||
|
} |
||||
|
|
||||
|
public String getKey() { |
||||
|
return key; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 返回int型枚举 |
||||
|
* |
||||
|
* @return |
||||
|
*/ |
||||
|
public int iKey() { |
||||
|
return Integer.parseInt(key); |
||||
|
} |
||||
|
|
||||
|
public String getLabel() { |
||||
|
return label; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取当前枚举值的国际化 |
||||
|
* |
||||
|
* @return |
||||
|
*/ |
||||
|
// public String getLabelI18n() { |
||||
|
// return LocaleI18nUtils.getMessage(label); |
||||
|
// } |
||||
|
|
||||
|
/** |
||||
|
* 判断是否是当前枚举 |
||||
|
* |
||||
|
* @param key |
||||
|
* @return |
||||
|
*/ |
||||
|
public boolean is(Integer key) { |
||||
|
return Integer.valueOf(getKey()).equals(key); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 校验是否支持此类型 |
||||
|
* |
||||
|
* @param key |
||||
|
* @return |
||||
|
*/ |
||||
|
public static boolean isSupport(String key) { |
||||
|
return Arrays.stream(values()).anyMatch(e -> e.getKey().equals(key)); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 校验是否支持此类型 |
||||
|
* |
||||
|
* @param tempEnum |
||||
|
* @return |
||||
|
*/ |
||||
|
public static boolean isSpanType(SearchMatchTypeEnum tempEnum) { |
||||
|
return tempEnum != null && Stream.of(SearchMatchTypeEnum.PARAGRAPH, SearchMatchTypeEnum.SENTENCE).anyMatch(tempEnum::equals); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取全部枚举值的map |
||||
|
* |
||||
|
* @return |
||||
|
*/ |
||||
|
public static LinkedHashMap<String, SearchMatchTypeEnum> getEnumMap() { |
||||
|
LinkedHashMap<String, SearchMatchTypeEnum> map = Maps.newLinkedHashMap(); |
||||
|
for (SearchMatchTypeEnum temp : values()) { |
||||
|
map.put(temp.getKey(), temp); |
||||
|
} |
||||
|
return map; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 根据key获取国际化内容 |
||||
|
* |
||||
|
* @param key |
||||
|
* @return |
||||
|
*/ |
||||
|
// public static String getLabelI18n(String key) { |
||||
|
// if (key == null) { |
||||
|
// return ""; |
||||
|
// } |
||||
|
// |
||||
|
// LinkedHashMap<String, SearchMatchTypeEnum> map = getEnumMap(); |
||||
|
// if (map.containsKey(key)) { |
||||
|
// return map.get(key).getLabelI18n(); |
||||
|
// } |
||||
|
// return key; |
||||
|
// } |
||||
|
|
||||
|
/** |
||||
|
* 获取key value模式枚举值集合 |
||||
|
* |
||||
|
* @return |
||||
|
*/ |
||||
|
// public static List<KeyValueDTO> getEnumList() { |
||||
|
// List<KeyValueDTO> rList = Lists.newArrayList(); |
||||
|
// for (SearchMatchTypeEnum temp : values()) { |
||||
|
// rList.add(KeyValueDTO.parse(temp.getKey(), temp.getLabelI18n())); |
||||
|
// } |
||||
|
// return rList; |
||||
|
// } |
||||
|
|
||||
|
} |
@ -0,0 +1,218 @@ |
|||||
|
package com.bfd.mf.common.util.enums; |
||||
|
|
||||
|
import com.bfd.mf.common.util.constants.ESConstant; |
||||
|
import com.google.common.collect.Maps; |
||||
|
|
||||
|
import java.util.*; |
||||
|
|
||||
|
/** |
||||
|
* 100-全文 200-标题 300-内容 400-关键词 500-同一段落 600-同一句子 |
||||
|
* 搜索范围 |
||||
|
* |
||||
|
* @author honghao.li |
||||
|
*/ |
||||
|
public enum SearchScopeEnum { |
||||
|
|
||||
|
/** |
||||
|
* 全文 |
||||
|
*/ |
||||
|
ALL("100", SearchMatchTypeEnum.MATCH) { |
||||
|
@Override |
||||
|
public Map<String, Float> getFieldMap() { |
||||
|
return new HashMap() {{ |
||||
|
put(ESConstant.TITLE, 1.0F); |
||||
|
put(ESConstant.CONTENT, 1.0F); |
||||
|
}}; |
||||
|
} |
||||
|
}, |
||||
|
/** |
||||
|
* 标题 |
||||
|
*/ |
||||
|
TITLE("200", SearchMatchTypeEnum.MATCH) { |
||||
|
@Override |
||||
|
public Map<String, Float> getFieldMap() { |
||||
|
return new HashMap() {{ |
||||
|
put(DocumentFieldEnum.title.name(), 1.0F); |
||||
|
}}; |
||||
|
} |
||||
|
}, |
||||
|
/** |
||||
|
* 内容 |
||||
|
*/ |
||||
|
CONTENT("300", SearchMatchTypeEnum.MATCH) { |
||||
|
@Override |
||||
|
public Map<String, Float> getFieldMap() { |
||||
|
return new HashMap() {{ |
||||
|
put(DocumentFieldEnum.content.name(), 1.0F); |
||||
|
}}; |
||||
|
} |
||||
|
}, |
||||
|
/** |
||||
|
* 关键词 |
||||
|
*/ |
||||
|
// TAG("400", SearchMatchTypeEnum.NESTED) { |
||||
|
// @Override |
||||
|
// public Map<String, Float> getFieldMap() { |
||||
|
// return new HashMap() {{ |
||||
|
// put(DocumentFieldEnum.ai_tag.name().concat(Constants.SEPARATOR_POINT).concat(LabelWeightFieldEnum.label.name()), 1.0F); |
||||
|
// }}; |
||||
|
// } |
||||
|
// |
||||
|
// @Override |
||||
|
// public String getPath() { |
||||
|
// return this.getFieldMap().keySet().stream().findFirst().get().split("\\"+Constants.SEPARATOR_POINT)[0]; |
||||
|
// } |
||||
|
// }, |
||||
|
/** |
||||
|
* 内容同一段落 |
||||
|
*/ |
||||
|
// PARAGRAPH("500", SearchMatchTypeEnum.PARAGRAPH) { |
||||
|
// @Override |
||||
|
// public Map<String, Float> getFieldMap() { |
||||
|
// return new HashMap() {{ |
||||
|
// put(HtmlFieldEnum.content.name(), 1.0F); |
||||
|
// }}; |
||||
|
// } |
||||
|
// }, |
||||
|
/** |
||||
|
* 内容同一句子 |
||||
|
*/ |
||||
|
SENTENCE("600", SearchMatchTypeEnum.SENTENCE) { |
||||
|
@Override |
||||
|
public Map<String, Float> getFieldMap() { |
||||
|
return new HashMap() {{ |
||||
|
put(DocumentFieldEnum.content.name(), 1.0F); |
||||
|
}}; |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* 码值 |
||||
|
*/ |
||||
|
private String key; |
||||
|
/** |
||||
|
* 匹配类型 |
||||
|
*/ |
||||
|
private SearchMatchTypeEnum matchTypeEnum; |
||||
|
|
||||
|
/** |
||||
|
* @param key 码值 |
||||
|
*/ |
||||
|
SearchScopeEnum(String key, SearchMatchTypeEnum matchTypeEnum) { |
||||
|
this.key = key; |
||||
|
this.matchTypeEnum = matchTypeEnum; |
||||
|
} |
||||
|
|
||||
|
public String getKey() { |
||||
|
return key; |
||||
|
} |
||||
|
|
||||
|
public String getPath() { |
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
public SearchMatchTypeEnum getMatchTypeEnum() { |
||||
|
return matchTypeEnum; |
||||
|
} |
||||
|
|
||||
|
// public Map<String, Float> getFieldMap() { |
||||
|
// return BaseFieldEnum.getMatchFieldsWithPy(); |
||||
|
// } |
||||
|
|
||||
|
/** |
||||
|
* 返回int型枚举 |
||||
|
* |
||||
|
* @return |
||||
|
*/ |
||||
|
public int iKey() { |
||||
|
return Integer.parseInt(key); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 判断是否是当前枚举 |
||||
|
* |
||||
|
* @param key |
||||
|
* @return |
||||
|
*/ |
||||
|
public boolean is(Integer key) { |
||||
|
return Integer.valueOf(getKey()).equals(key); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 校验是否支持此类型 |
||||
|
* |
||||
|
* @param key |
||||
|
* @return |
||||
|
*/ |
||||
|
public static boolean isSupport(String key) { |
||||
|
return Arrays.stream(values()).anyMatch(e -> e.getKey().equals(key)); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 根据key获取对应属性 |
||||
|
* |
||||
|
* @param key |
||||
|
* @return |
||||
|
*/ |
||||
|
public static Map<String, Float> getFieldsByKey(Integer key) { |
||||
|
if (key == null) { |
||||
|
return new HashMap<>(0); |
||||
|
} |
||||
|
|
||||
|
String strKey = key.toString(); |
||||
|
Map<String, SearchScopeEnum> map = getEnumMap(); |
||||
|
if (map.containsKey(strKey)) { |
||||
|
return map.get(strKey).getFieldMap(); |
||||
|
} |
||||
|
// 默认值 |
||||
|
return BaseFieldEnum.getMatchFields(); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 根据key获取对应属性 |
||||
|
* |
||||
|
* @param key |
||||
|
* @return |
||||
|
*/ |
||||
|
public static SearchScopeEnum getEnumByKey(String key) { |
||||
|
for (SearchScopeEnum value : SearchScopeEnum.values()) { |
||||
|
if (Objects.equals(key, value.getKey())) { |
||||
|
return value; |
||||
|
} |
||||
|
} |
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 根据key获取对应属性 |
||||
|
* |
||||
|
* @param key |
||||
|
* @return |
||||
|
*/ |
||||
|
public static SearchMatchTypeEnum getMatchTypeByKey(Integer key) { |
||||
|
if (key == null) { |
||||
|
return null; |
||||
|
} |
||||
|
String strKey = key.toString(); |
||||
|
Map<String, SearchScopeEnum> map = getEnumMap(); |
||||
|
if (!map.containsKey(strKey)) { |
||||
|
return null; |
||||
|
} |
||||
|
return map.get(strKey).getMatchTypeEnum(); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取全部枚举值的map |
||||
|
* |
||||
|
* @return |
||||
|
*/ |
||||
|
public static LinkedHashMap<String, SearchScopeEnum> getEnumMap() { |
||||
|
LinkedHashMap<String, SearchScopeEnum> map = Maps.newLinkedHashMap(); |
||||
|
for (SearchScopeEnum temp : values()) { |
||||
|
map.put(temp.getKey(), temp); |
||||
|
} |
||||
|
return map; |
||||
|
} |
||||
|
|
||||
|
public abstract Map<String, Float> getFieldMap(); |
||||
|
} |
@ -0,0 +1,71 @@ |
|||||
|
package com.bfd.mf.common.util.enums; |
||||
|
|
||||
|
import com.google.common.collect.Maps; |
||||
|
|
||||
|
import java.util.LinkedHashMap; |
||||
|
|
||||
|
/** |
||||
|
* 搜索词策略 |
||||
|
* 包含以下全部字词 |
||||
|
* 包含以下完整词句 |
||||
|
* 包含以下任一字词 |
||||
|
* @author lihonghao |
||||
|
*/ |
||||
|
public enum SearchWordStrategyEnum { |
||||
|
|
||||
|
/** |
||||
|
* 包含以下全部字词 |
||||
|
*/ |
||||
|
ALL("1"), |
||||
|
/** |
||||
|
* 包含以下完整词句 |
||||
|
*/ |
||||
|
WHOLE("2"), |
||||
|
/** |
||||
|
* 包含以下任一字词 |
||||
|
*/ |
||||
|
ANY("3"); |
||||
|
|
||||
|
SearchWordStrategyEnum(String key) { |
||||
|
this.key = key; |
||||
|
} |
||||
|
|
||||
|
private String key; |
||||
|
|
||||
|
public String getKey() { |
||||
|
return key; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 判断是否是当前枚举 |
||||
|
* |
||||
|
* @param key |
||||
|
* @return |
||||
|
*/ |
||||
|
public boolean is(String key) { |
||||
|
return getKey().equals(key); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 根据key获取枚举 |
||||
|
* |
||||
|
* @param key 扩展名 |
||||
|
* @return |
||||
|
*/ |
||||
|
public static SearchWordStrategyEnum getByKey(String key) { |
||||
|
return SearchWordStrategyEnum.getEnumMap().get(key); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取全部枚举值的map |
||||
|
* |
||||
|
* @return |
||||
|
*/ |
||||
|
public static LinkedHashMap<String, SearchWordStrategyEnum> getEnumMap() { |
||||
|
LinkedHashMap<String, SearchWordStrategyEnum> map = Maps.newLinkedHashMap(); |
||||
|
for (SearchWordStrategyEnum temp : values()) { |
||||
|
map.put(temp.getKey(), temp); |
||||
|
} |
||||
|
return map; |
||||
|
} |
||||
|
} |
@ -1,61 +0,0 @@ |
|||||
server: |
|
||||
port: 18909 |
|
||||
tomcat: |
|
||||
uri-encoding: UTF-8 |
|
||||
max-threads: 800 |
|
||||
maxHttpHeaderSize: 655360 |
|
||||
http2: |
|
||||
enabled: true |
|
||||
|
|
||||
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 |
|
||||
|
|
||||
jpa: |
|
||||
open-in-view: false |
|
||||
database: mysql |
|
||||
|
|
||||
servlet: |
|
||||
multipart: |
|
||||
max-file-size: 1009MB #单个数据大小 |
|
||||
max-request-size: 2048MB #总数据大小 |
|
||||
|
|
||||
####### |
|
||||
bfd.api.mf: |
|
||||
textPostUrl: http://rule.sq.baifendian.com/nerplace |
|
||||
emotionPostUrl : http://172.18.1.166:15038/bertsentiment |
|
||||
wordCloudPostUrl : http://rule.sq.baifendian.com/wordcloud |
|
||||
|
|
||||
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-mini: |
|
||||
# name: SQ_Mini |
|
||||
# address: 172.18.1.147:9313 |
|
||||
# upper: 2018-09-01 |
|
||||
# standby: cl_major_* |
|
||||
# es-normal: |
|
||||
# name: SQ_Normal_new |
|
||||
# address: 172.18.1.134:9301 |
|
||||
# upper: 2018-09-01 |
|
||||
# standby: cl_index_* |
|
||||
es-mini: |
|
||||
name: SQ_Mini |
|
||||
address: 172.26.11.111:9301 |
|
||||
upper: 2018-09-01 |
|
||||
standby: cl_major_ |
|
||||
es-normal: |
|
||||
name: SQ_Normal |
|
||||
address: 172.26.11.109:9301 |
|
||||
upper: 2018-09-01 |
|
||||
standby: cl_index_* |
|
@ -1,61 +0,0 @@ |
|||||
server: |
|
||||
port: 18909 |
|
||||
tomcat: |
|
||||
uri-encoding: UTF-8 |
|
||||
max-threads: 800 |
|
||||
maxHttpHeaderSize: 655360 |
|
||||
http2: |
|
||||
enabled: true |
|
||||
|
|
||||
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 |
|
||||
|
|
||||
jpa: |
|
||||
open-in-view: false |
|
||||
database: mysql |
|
||||
|
|
||||
servlet: |
|
||||
multipart: |
|
||||
max-file-size: 1009MB #单个数据大小 |
|
||||
max-request-size: 2048MB #总数据大小 |
|
||||
|
|
||||
####### |
|
||||
bfd.api.mf: |
|
||||
textPostUrl: http://rule.sq.baifendian.com/nerplace |
|
||||
emotionPostUrl : http://172.18.1.166:15038/bertsentiment |
|
||||
wordCloudPostUrl : http://rule.sq.baifendian.com/wordcloud |
|
||||
|
|
||||
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-mini: |
|
||||
name: SQ_Mini |
|
||||
address: 172.18.1.147:9313 |
|
||||
upper: 2018-09-01 |
|
||||
standby: cl_major_* |
|
||||
es-normal: |
|
||||
name: SQ_Normal_new |
|
||||
address: 172.18.1.134:9301 |
|
||||
upper: 2018-09-01 |
|
||||
standby: cl_index_* |
|
||||
# es-mini: |
|
||||
# name: SQ_Mini |
|
||||
# address: 172.26.11.111:9301 |
|
||||
# upper: 2018-09-01 |
|
||||
# standby: cl_major_ |
|
||||
# es-normal: |
|
||||
# name: SQ_Normal |
|
||||
# address: 172.26.11.109:9301 |
|
||||
# upper: 2018-09-01 |
|
||||
# standby: cl_index_* |
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue