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