Merge branch 'develop_master' into develop_sync_es

This commit is contained in:
super_liu
2022-04-28 19:14:10 +08:00
90 changed files with 2651 additions and 292 deletions
@@ -84,9 +84,13 @@ public class SearchCenterController extends BaseController<Map<String, Object>>
if (StringUtils.isAlphanumericSpace(searchInfoEO.getSelectIndex())) {
if(elasticsearchService.isIndexExist(searchInfoEO.getSelectIndex())){
if("fulltextserch".equals(searchInfoEO.getSelectIndex()) || "fulltextserch"== searchInfoEO.getSelectIndex()){
Pattern pattern = Pattern.compile("^[0-9a-zA-Z\\.\\(\\\\\\)\\s\\/\\-]+$");
Pattern pattern = Pattern.compile("^[0-9a-zA-Z\\.\\(\\\\\\)\\s\\/\\-\\:]+$");
if (null != searchInfoEO.getSelectValue() && StringUtils.isNotBlank(searchInfoEO.getSelectValue())) {
result = searchCenterService.searchSarBykeyAndHighLight(searchInfoEO);
if (pattern.matcher(searchInfoEO.getSelectValue()).matches()) {
result = searchCenterService.searchSarBykeyAndHighLightNumber(searchInfoEO);
}else {
result = searchCenterService.searchSarBykeyAndHighLight(searchInfoEO);
}
} else {
result = searchCenterService.searchSarBykeyAndHighLight(searchInfoEO);
}
@@ -14,8 +14,10 @@ import org.apache.poi.ss.formula.functions.T;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.collect.HppcMaps;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
@@ -28,6 +30,7 @@ import org.elasticsearch.search.aggregations.bucket.terms.StringTerms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.json.JSONTokener;
import org.slf4j.LoggerFactory;
@@ -760,7 +763,7 @@ public class SearchCenterServiceImpl implements SearchCenterService {
String[] standStr = {"content","standSort","standNumber","standYear","stand_name","standEnName","standNatureName",
"textStatusName","isRelateAccessName","numbershow","standSystem","NYLXCLASS","CLLX"};
String[] lawsStr = {"content","lawsType","lawsNumber","lawsName","lawsEnName","lawsNo","issueCompany","lawsTextState","lawsSyqy","lawsSycx","isRelateAccess","lawsYear","lawsNotisyncNum","lawsBulletin","lawsLabel","lawsRemark"};
String[] bussstandStr = {"content","standSort","stand_code","standYear","stand_name","standEnName","nameshow","standstateshow","numbershow","textStatusBuss","NYLXCLASS","CLLX"};
String[] bussstandStr = {"content","standSort","stand_code","standYear","stand_name","standEnName","nameshow","standstateshow","numbershow","textStatusBuss","textStatusBussName","NYLXCLASS","CLLX"};
for (String field : fieldList) {
// 关键字查询属性字段
String keyWordField2 = field + "Name";
@@ -1214,6 +1217,7 @@ public class SearchCenterServiceImpl implements SearchCenterService {
hiBuilder.field(highlightDate);
hiBuilder.preTags("<span class='highlight-class'>");
hiBuilder.postTags("</span>");
updateIndex("fulltextserch",99999999,2);
searchRequestBuilder = client.prepareSearch("fulltextserch")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.highlighter(hiBuilder)
@@ -1287,17 +1291,70 @@ public class SearchCenterServiceImpl implements SearchCenterService {
@Override
public List<Map<String, Object>> searchSarBykeyAndHighLightNumber(SeniorSearchInfoEO searchInfoEO) throws Exception {
String real = searchInfoEO.getSelectValue();
String[] values = searchInfoEO.getSelectValue().split(" ");
boolean isReal = false;
int num = searchInfoEO.getSelectValue().indexOf(" ");
String value = "";
String select = "";
int i = 0;
for (String v: values){
if(i==0) {
value = v;
}else{
select = select + " " + v;
if (-1 != num) {
value = searchInfoEO.getSelectValue().substring(0, num).trim().toUpperCase();
select = searchInfoEO.getSelectValue().substring(num + 1).trim();
real = value + " " + select;
}else{
String reg = ".*[0-9].*";
if("-".contains(real)){
String content = real.split("-")[0];
value = content.replaceAll("[^(A-Za-z\\/)]", "");
String[] valArr = value.split("\\/");
if (valArr.length > 2) {
value = valArr[0] + "/" + valArr[1];
select = content.replaceAll("[^(0-9a-zA-Z\\.\\(\\\\\\)\\s\\/\\-\\:)]", "").replace(value,"");
// 如果类别小写 转 大写
Pattern pattern = Pattern.compile("^[a-zA-Z\\/]+$");
if (pattern.matcher(value).matches()) {
value = value.toUpperCase();
}
}else{
value = valArr[0];
select = real.replaceAll("[^(0-9a-zA-Z\\.\\(\\\\\\)\\s\\/\\-\\:)]", "").replace(value,"");
// 如果类别小写 转 大写
Pattern pattern = Pattern.compile("^[a-zA-Z\\/]+$");
if (pattern.matcher(value).matches()) {
value = value.toUpperCase();
}
}
real = value + " " + select;
}else if(real.matches(reg)){
value = real.replaceAll("[^(A-Za-z\\/)]", "");
String[] valArr = value.split("\\/");
if (valArr.length > 2) {
value = valArr[0] + "/" + valArr[1];
String[] str = real.split(value);
String sel = str[1].replaceAll("[^(0-9\\.\\(\\\\\\)\\s\\/\\-\\:)]", "");
String[] valArr2 = sel.split("\\/");
if(valArr2.length > 2){
select = valArr2[0] + '/' + valArr[3] + valArr2[1];
}else {
select = sel;
}
}else{
select = real.replaceAll("[^(0-9a-zA-Z\\.\\(\\\\\\)\\s\\/\\-\\:)]", "").replace(value,"");
// 如果类别小写 转 大写
Pattern pattern = Pattern.compile("^[a-zA-Z\\/]+$");
if (pattern.matcher(value).matches()) {
value = value.toUpperCase();
}
}
real = value + " " + select;
}else {
value = real;
select = "";
// 如果类别小写 转 大写
Pattern pattern = Pattern.compile("^[a-zA-Z\\/]+$");
if (pattern.matcher(value).matches()) {
value = value.toUpperCase();
}
}
i++;
}
searchInfoEO.setSelectValue(select);
List<Map<String, Object>> result = new ArrayList<>();
@@ -1306,14 +1363,97 @@ public class SearchCenterServiceImpl implements SearchCenterService {
// 记录搜索记录到数据库中
BoolQueryBuilder boolQueryShould = QueryBuilders.boolQuery();
BoolQueryBuilder boolQueryMust = QueryBuilders.boolQuery();
BoolQueryBuilder boolSelectValue = new BoolQueryBuilder();
QueryBuilder multiQueryBuilder;
multiQueryBuilder = QueryBuilders.multiMatchQuery(value,
"title.keyword","textContent.keyword").minimumShouldMatch("100%").field("title.keyword",1f);
boolQueryMust.must(multiQueryBuilder);
boolQueryShould.should(QueryBuilders.wildcardQuery("title.keyword", "*"+searchInfoEO.getSelectValue()+"*").boost(10f))
.should(QueryBuilders.wildcardQuery("textContent.keyword", "*"+searchInfoEO.getSelectValue()+"*"))
.should(multiQueryBuilder);
boolQueryBuilder.should(boolQueryShould);
String[] selects = null;
if (StringUtils.isNotBlank(select)) {
//判断标准号是否企标SMTC ,标准列别 (),/,字母
Pattern pattern = Pattern.compile("^[a-zA-Z\\/\\(\\)\\\\]+$");
if (pattern.matcher(value).matches()) {
Pattern patternbianhao = Pattern.compile("^[0-9a-zA-Z\\.\\(\\\\\\)\\-\\s]+$");
if (patternbianhao.matcher(select).matches()) {
//符合标准编号
selects = select.replace(" ","-").split("-");
} else {
//不符合标准编号 使用wildcard查询 编号
selects = select.replace(" ","-").split("-");
}
} else {
//不符合标准类别,wildcard 查询整体 real 6/23 解决搜索DRE的问题
selects = null;
value = real;
// isReal = true;
}
}else{
//没有空格,存在问题,使用wildcard查询 real
selects = null;
value = real;
// isReal = true;
}
if (isReal){
//查询real
value = null;
selects = null;
}
if(null != value || null != selects){
if (null != value && selects == null) {
boolSelectValue.should(QueryBuilders.multiMatchQuery(value,
"title"
).minimumShouldMatch("100%"));
boolSelectValue.should(QueryBuilders.multiMatchQuery(value,
"textContent"
).minimumShouldMatch("100%"));
boolSelectValue.should(QueryBuilders.multiMatchQuery(value,
"textItems"
).minimumShouldMatch("100%"));
boolSelectValue.should(QueryBuilders.wildcardQuery("title.keyword","*"+value+"*"));
// multiQueryBuilder = QueryBuilders.multiMatchQuery("*"+value+"*",
// "title.keyword", "textContent", "issue_time").minimumShouldMatch("100%").field("title.keyword", 1000f).field("textContent.keyword", 0.0000000000000000000000000000000001f);
//// boolQueryMust.must(multiQueryBuilder);
// boolQueryShould.should(multiQueryBuilder);
}
// searchInfoEO.setSelectValue(searchInfoEO.getSelectValue().replace("-","\\-"));
if (null != selects) {
boolSelectValue
.should(QueryBuilders.wildcardQuery("title.keyword", "*" + real + "*"))
.should(QueryBuilders.wildcardQuery("textContent.keyword", "*" + real + "*"))
.should(QueryBuilders.wildcardQuery("issue_time", "*" + real + "*"));
// for (String se : selects) {
// if (StringUtils.isNotBlank(se)) {
// boolSelectValue
// .should(QueryBuilders.wildcardQuery("title.keyword", "*" + real + "*").boost(10f))
// .should(QueryBuilders.wildcardQuery("textContent.keyword", "*" + se + "*").boost(0.0000000000000000000000000000000001f))
// .should(QueryBuilders.wildcardQuery("issue_time", "*" + se + "*"));
// }
// }
}
// if (isReal){
// boolSelectValue.should(QueryBuilders.wildcardQuery("title.keyword", "*" + real + "*").boost(1000f))
// .should(QueryBuilders.wildcardQuery("textContent.keyword", "*" + real + "*").boost(0.0000000000000000000000000000000001f))
// .should(QueryBuilders.wildcardQuery("issue_time", "*" + real + "*"));
// boolQueryShould.must(boolSelectValue);
// }
boolQueryShould.must(boolSelectValue);
}
BoolQueryBuilder queryBuilder = new BoolQueryBuilder();
if(StringUtils.isNotBlank(searchInfoEO.getNYLXCLASS()) || StringUtils.isNotBlank(searchInfoEO.getCLLX())){
if(StringUtils.isNotBlank(searchInfoEO.getNYLXCLASS())){
queryBuilder.should(QueryBuilders.multiMatchQuery(searchInfoEO.getNYLXCLASS(),
"textContent"
).minimumShouldMatch("100%").field("title",10f));
}
if(StringUtils.isNotBlank(searchInfoEO.getCLLX())){
queryBuilder.should(QueryBuilders.multiMatchQuery(searchInfoEO.getCLLX(),
"textContent"
).minimumShouldMatch("100%").field("title",10f));
}
boolQueryShould.must(queryBuilder);
}
//在结果中检索
// boolQueryBuilder.must(multiQueryBuilder);
HighlightBuilder hiBuilder=new HighlightBuilder();
@@ -1325,13 +1465,17 @@ public class SearchCenterServiceImpl implements SearchCenterService {
hiBuilder.field(highlightDate);
hiBuilder.preTags("<span class='highlight-class'>");
hiBuilder.postTags("</span>");
updateIndex("fulltextserch",99999999,2);
searchRequestBuilder = client.prepareSearch("fulltextserch")
.addSort(SortBuilders.fieldSort("issue_time").unmappedType("String").order(SortOrder.DESC))
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.highlighter(hiBuilder)
.setFrom((searchInfoEO.getPage()-1)*searchInfoEO.getPageSize())
.setSize(searchInfoEO.getPageSize());
searchRequestBuilder.setQuery(boolQueryBuilder);
searchRequestBuilder.setQuery(boolQueryShould).setTrackTotalHits(true);
searchRequestBuilder.addSort(SortBuilders.fieldSort("issue_time").unmappedType("String").order(SortOrder.DESC));
// 获取查询到的结果
SearchResponse response = searchRequestBuilder.get();
for (SearchHit searchHit : response.getHits().getHits()) {
@@ -1347,11 +1491,11 @@ public class SearchCenterServiceImpl implements SearchCenterService {
n_field += fragment;
}
//高亮标题覆盖原标题
sourceAsMap.put("title.keyword",n_field);
sourceAsMap.put("title",n_field);
}
Map<String, HighlightField> highlightFieldsnameshowStr = searchHit.getHighlightFields();
HighlightField fieldnameshowStr= highlightFieldsnameshowStr.get("textContent.keyword");
HighlightField fieldnameshowStr= highlightFieldsnameshowStr.get("textContent");
if(fieldnameshowStr!= null){
Text[] fragments = fieldnameshowStr.fragments();
String n_field = "";
@@ -1359,14 +1503,45 @@ public class SearchCenterServiceImpl implements SearchCenterService {
n_field += fragment;
}
//高亮标题覆盖原标题
sourceAsMap.put("textContent.keyword",n_field);
sourceAsMap.put("textContent",n_field);
}
result.add(sourceAsMap);
}
searchInfoEO.getPager().setRowCount((int) response.getHits().getTotalHits().value);
// result.sort((o1, o2) -> {
// if (o1.get("issue_time") != null && o2.get("issue_time") != null) {
// return o2.get("issue_time").toString().compareTo(o1.get("issue_time").toString());
// } else {
// return o1.get("issue_time") == null ? 1 : -1;
// }
// });
return result;
}
private String getValue(String real) {
String value = real.replaceAll("[^(A-Za-z\\/)]", "");
String[] valArr = value.split("\\/");
if (valArr.length > 2) {
value = valArr[0] + "/" + valArr[1];
}else{
value = valArr[0];
}
return value;
}
//更新索引的max_result_window参数
private boolean updateIndex(String indices, int from,int size) {
int records = from * size + size;
if (records <= 10000) return true;
AcknowledgedResponse indexResponse = client.admin().indices()
.prepareUpdateSettings(indices)
.setSettings(Settings.builder()
.put("highlight.max_analyzed_offset", records)
.build()
).get();
return indexResponse.isAcknowledged();
}
@Override
public void searchByKey(CommonSearchInfoEO commonSearchInfoEO) {