Merge branch 'develop_migration' into 'develop_master'
feat: There is no way the, Es See merge request LiuChao/foton-slrs-system-rest!514
This commit is contained in:
+136
-38
@@ -58,6 +58,12 @@ public class SearchCenterServiceImpl implements SearchCenterService {
|
|||||||
|
|
||||||
private TransportClient client;
|
private TransportClient client;
|
||||||
|
|
||||||
|
// 函数式接口,获取next数组
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface NextArray {
|
||||||
|
int[] getNext(String target);
|
||||||
|
}
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private DicTypeEODao dicTypeEODao;
|
private DicTypeEODao dicTypeEODao;
|
||||||
|
|
||||||
@@ -1346,22 +1352,27 @@ public class SearchCenterServiceImpl implements SearchCenterService {
|
|||||||
QueryBuilder multiQueryBuilder1;
|
QueryBuilder multiQueryBuilder1;
|
||||||
QueryBuilder queryBuilder1 = QueryBuilders.multiMatchQuery("");
|
QueryBuilder queryBuilder1 = QueryBuilders.multiMatchQuery("");
|
||||||
if(StringUtils.isNotBlank(searchInfoEO.getSelectValue())){
|
if(StringUtils.isNotBlank(searchInfoEO.getSelectValue())){
|
||||||
if(searchInfoEO.getSelectValue().length() > 1){
|
// if(searchInfoEO.getSelectValue().length() > 1){
|
||||||
String str0 = searchInfoEO.getSelectValue().substring(0,1);
|
// String str0 = searchInfoEO.getSelectValue().substring(0,1);
|
||||||
String Str1 = searchInfoEO.getSelectValue().substring(1,2);
|
// String Str1 = searchInfoEO.getSelectValue().substring(1,2);
|
||||||
String reg = ".*[0-9].*";
|
// String reg = ".*[0-9].*";
|
||||||
Pattern pattern = Pattern.compile("^[a-zA-Z\\/]+$");
|
// Pattern pattern = Pattern.compile("^[a-zA-Z\\/]+$");
|
||||||
if (pattern.matcher(str0).matches() && Str1.matches(reg)) {
|
// if (pattern.matcher(str0).matches() && Str1.matches(reg)) {
|
||||||
String value = searchInfoEO.getSelectValue().replace(str0,str0+" ");
|
// String value = searchInfoEO.getSelectValue().replace(str0,str0+" ");
|
||||||
searchInfoEO.setSelectValue(value);
|
// searchInfoEO.setSelectValue(value);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
boolQueryShould
|
||||||
|
.should(QueryBuilders.wildcardQuery("sortTitle.keyword", "*" + searchInfoEO.getSelectValue().toUpperCase() + "*")).boost(1005f)
|
||||||
queryBuilder1 = QueryBuilders.multiMatchQuery(searchInfoEO.getSelectValue(),
|
.should(QueryBuilders.wildcardQuery("numberTitle.keyword", "*" + searchInfoEO.getSelectValue().toUpperCase() + "*")).boost(1004f)
|
||||||
"title"
|
.should(QueryBuilders.wildcardQuery("yearOrder.keyword", "*" + searchInfoEO.getSelectValue().toUpperCase() + "*")).boost(1003f)
|
||||||
).minimumShouldMatch("100%").field("title",1000f);
|
.should(QueryBuilders.wildcardQuery("nameTitle.keyword", "*" + searchInfoEO.getSelectValue().toUpperCase() + "*")).boost(1002f)
|
||||||
boolQueryBuilder.must(queryBuilder1);
|
.should(QueryBuilders.wildcardQuery("title.keyword", "*" + searchInfoEO.getSelectValue().toUpperCase() + "*").boost(1000f));
|
||||||
|
// queryBuilder1 = QueryBuilders.wildcardQuery("title.keyword","*" + searchInfoEO.getSelectValue() + "*");
|
||||||
|
// queryBuilder1 = QueryBuilders.multiMatchQuery(searchInfoEO.getSelectValue(),
|
||||||
|
// "title"
|
||||||
|
// ).minimumShouldMatch("100%").field("title",1000f);
|
||||||
|
boolQueryBuilder.must(boolQueryShould);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1384,7 +1395,7 @@ public class SearchCenterServiceImpl implements SearchCenterService {
|
|||||||
|
|
||||||
//在结果中检索
|
//在结果中检索
|
||||||
HighlightBuilder hiBuilder=new HighlightBuilder();
|
HighlightBuilder hiBuilder=new HighlightBuilder();
|
||||||
HighlightBuilder.Field highlightTitle = new HighlightBuilder.Field("title");
|
HighlightBuilder.Field highlightTitle = new HighlightBuilder.Field("title.keyword");
|
||||||
hiBuilder.field(highlightTitle);
|
hiBuilder.field(highlightTitle);
|
||||||
hiBuilder.preTags("<span class='highlight-Es-class'>");
|
hiBuilder.preTags("<span class='highlight-Es-class'>");
|
||||||
hiBuilder.postTags("</span>");
|
hiBuilder.postTags("</span>");
|
||||||
@@ -1409,37 +1420,124 @@ public class SearchCenterServiceImpl implements SearchCenterService {
|
|||||||
for (SearchHit searchHit : response.getHits().getHits()) {
|
for (SearchHit searchHit : response.getHits().getHits()) {
|
||||||
searchHit.getSourceAsMap().put("id", searchHit.getId());
|
searchHit.getSourceAsMap().put("id", searchHit.getId());
|
||||||
Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();
|
Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();
|
||||||
|
// String textContent = sourceAsMap.getOrDefault("textContent","").toString();
|
||||||
|
|
||||||
String textStatusColor = "";
|
String textStatusColor = "";
|
||||||
if(StringUtils.isNotBlank(sourceAsMap.getOrDefault("textStatusFull","").toString())){
|
// if(StringUtils.isNotBlank(textContent) && StringUtils.isNotBlank(searchInfoEO.getSelectValue())){
|
||||||
String textStatus = sourceAsMap.getOrDefault("textStatusFull","").toString();
|
// String[] standStr = new String[]{"废止","被代替","作废","参考"};
|
||||||
if("废止".equals(textStatus) || "被代替".equals(textStatus) || "作废".equals(textStatus) ){
|
// for (String textStatus : standStr) {
|
||||||
textStatusColor = "redClass";
|
// int i = indexOfToKMP(textContent, "文本状态:"+textStatus, 0, getNextValInstance());
|
||||||
}else if("参考".equals(textStatus)){
|
// if(i > 0 && ("废止".equals(textStatus) || "被代替".equals(textStatus) || "作废".equals(textStatus) )){
|
||||||
textStatusColor = "yellowClass";
|
// textStatusColor = "redClass";
|
||||||
|
// break;
|
||||||
|
// }else if("参考".equals(textStatus)){
|
||||||
|
// textStatusColor = "yellowClass";
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
if(StringUtils.isNotBlank(searchInfoEO.getSelectValue())){
|
||||||
|
|
||||||
|
if(StringUtils.isNotBlank(sourceAsMap.getOrDefault("textStatusFull","").toString())){
|
||||||
|
String textStatus = sourceAsMap.getOrDefault("textStatusFull","").toString();
|
||||||
|
if("废止".equals(textStatus) || "被代替".equals(textStatus) || "作废".equals(textStatus) ){
|
||||||
|
textStatusColor = "redClass";
|
||||||
|
}else if("参考".equals(textStatus)){
|
||||||
|
textStatusColor = "yellowClass";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//高亮标题覆盖原标题
|
||||||
|
String titleStr = sourceAsMap.get("title").toString();
|
||||||
|
titleStr = titleStr.replace(searchInfoEO.getSelectValue(),"<span class='highlight-Es-class'>"+searchInfoEO.getSelectValue()+"</span>");
|
||||||
|
if(StringUtils.isNotBlank(textStatusColor)){
|
||||||
|
sourceAsMap.put("title", "<span class='"+textStatusColor+"'>"+titleStr+"</span>");
|
||||||
|
}else {
|
||||||
|
sourceAsMap.put("title", titleStr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//解析高亮字段
|
//解析高亮字段
|
||||||
Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
|
// Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
|
||||||
HighlightField field= highlightFields.get("title");
|
// HighlightField field= highlightFields.get("title.keyword");
|
||||||
if(field!= null){
|
// if(field!= null){
|
||||||
Text[] fragments = field.fragments();
|
// Text[] fragments = field.fragments();
|
||||||
StringBuilder n_field = new StringBuilder();
|
// StringBuilder n_field = new StringBuilder();
|
||||||
for (Text fragment : fragments) {
|
// for (Text fragment : fragments) {
|
||||||
n_field.append(fragment);
|
// n_field.append(fragment);
|
||||||
}
|
// }
|
||||||
//高亮标题覆盖原标题
|
// //高亮标题覆盖原标题
|
||||||
if(StringUtils.isNotBlank(textStatusColor)){
|
// if(StringUtils.isNotBlank(textStatusColor)){
|
||||||
sourceAsMap.put("title", "<span class='"+textStatusColor+"'>"+n_field.toString()+"</span>");
|
// sourceAsMap.put("title", "<span class='"+textStatusColor+"'>"+n_field.toString()+"</span>");
|
||||||
}else {
|
// }else {
|
||||||
sourceAsMap.put("title", n_field.toString());
|
// sourceAsMap.put("title", n_field.toString());
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
result.add(sourceAsMap);
|
result.add(sourceAsMap);
|
||||||
}
|
}
|
||||||
searchInfoEO.getPager().setRowCount((int) response.getHits().getTotalHits().value);
|
searchInfoEO.getPager().setRowCount((int) response.getHits().getTotalHits().value);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 改进版的nextVal数组
|
||||||
|
public NextArray getNextValInstance() {
|
||||||
|
return target -> {
|
||||||
|
// 初始化数组大小
|
||||||
|
int[] nextVal = new int[target.length()];
|
||||||
|
// 0 位置默认为-1
|
||||||
|
nextVal[0] = -1;
|
||||||
|
// 遍历字符串每一位,计算每个位置上的值
|
||||||
|
for (int i = 0, k = -1; i < target.length() - 1; ) {
|
||||||
|
if (k == -1 || target.charAt(i) == target.charAt(k)) {
|
||||||
|
i++;
|
||||||
|
k++;
|
||||||
|
// 判断当前字符和求的k位置的字符是否相等
|
||||||
|
if (target.charAt(i) == target.charAt(k)) {
|
||||||
|
// 若相等,则继承k位置的值
|
||||||
|
nextVal[i] = nextVal[k];
|
||||||
|
} else {
|
||||||
|
// 不等,则还是使用原来next数组的值
|
||||||
|
nextVal[i] = k;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
k = nextVal[k];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nextVal;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 采用KMP算法,查找字符串子串的位置
|
||||||
|
*
|
||||||
|
* @param source 源字符串
|
||||||
|
* @param target 目标(子)字符串
|
||||||
|
* @param pos 源字符串的起始索引
|
||||||
|
* @param nextArray 函数式接口,传入获取next数组的方法(因为next数组上面定义了两种获取方式)
|
||||||
|
* @return 目标字符串在源字符串中第一次出现的索引位置
|
||||||
|
*/
|
||||||
|
public int indexOfToKMP(String source, String target, int pos, NextArray nextArray) {
|
||||||
|
int i, j;
|
||||||
|
// 调用接口中的方法,获取next数组
|
||||||
|
int[] next = nextArray.getNext(target);
|
||||||
|
// 初始化遍历
|
||||||
|
i = pos;
|
||||||
|
j = 0;
|
||||||
|
// 判断i和j的索引都不能大于等于字符串长度,否则说明比较完成
|
||||||
|
while (i < source.length() && j < target.length()) {
|
||||||
|
// 如果j==-1,说明需要从头开始比较;或者由公共元素相等,继续比较
|
||||||
|
if (j == -1 || source.charAt(i) == target.charAt(j)) {
|
||||||
|
i++;
|
||||||
|
j++;
|
||||||
|
} else {
|
||||||
|
// 需要按照数组回溯j
|
||||||
|
j = next[j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 判断子字符的索引是否大于等于子字符串,如果为true说明查找成功,返回源字符串当前位置-子字符串长度
|
||||||
|
return j >= target.length() ? i - target.length() : -1;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Map<String, Object>> searchSarBykeyAndHighLightNumber(SeniorSearchInfoEO searchInfoEO) throws Exception {
|
public List<Map<String, Object>> searchSarBykeyAndHighLightNumber(SeniorSearchInfoEO searchInfoEO) throws Exception {
|
||||||
String real = searchInfoEO.getSelectValue();
|
String real = searchInfoEO.getSelectValue();
|
||||||
|
|||||||
Reference in New Issue
Block a user