feat: There is no way the, 优化ES 权重 全文搜索

This commit is contained in:
super_liu
2022-04-28 21:24:03 +08:00
parent 27a04f7c1b
commit a50b18728d
2 changed files with 37 additions and 17 deletions
@@ -4,6 +4,8 @@ import com.adc.da.search.entity.*;
import com.adc.da.search.service.SearchCenterService; import com.adc.da.search.service.SearchCenterService;
import com.adc.da.search.util.DateUtil; import com.adc.da.search.util.DateUtil;
import com.adc.da.search.util.InitStandAttrSearchUtil; import com.adc.da.search.util.InitStandAttrSearchUtil;
import com.adc.da.sys.dao.DicTypeEODao;
import com.adc.da.sys.entity.DicTypeEO;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
@@ -30,7 +32,6 @@ import org.elasticsearch.search.aggregations.bucket.terms.StringTerms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder; import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField; import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder; import org.elasticsearch.search.sort.SortOrder;
import org.json.JSONTokener; import org.json.JSONTokener;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -57,6 +58,9 @@ public class SearchCenterServiceImpl implements SearchCenterService {
private TransportClient client; private TransportClient client;
@Autowired
private DicTypeEODao dicTypeEODao;
@PostConstruct @PostConstruct
public void init() { public void init() {
client = this.transportClient; client = this.transportClient;
@@ -1293,12 +1297,22 @@ public class SearchCenterServiceImpl implements SearchCenterService {
String real = searchInfoEO.getSelectValue(); String real = searchInfoEO.getSelectValue();
boolean isReal = false; boolean isReal = false;
int num = searchInfoEO.getSelectValue().indexOf(" "); int num = searchInfoEO.getSelectValue().indexOf(" ");
//查询字典表,形成Hash映射提升速度
List<DicTypeEO> dicInfo = dicTypeEODao.getDicInfo("dic_id","dic_type_code", "dic_type_name");
Map<String, String> dicMap = dicInfo.stream()
.filter(item-> ("JKSADFH564S".equals(item.getDicId()) || "NGETEMDJDI".equals(item.getDicId()) || "sg9gb7liywkrnv3pa5uh".equals(item.getDicId())) && !item.getDicTypeCode().isEmpty())
.collect(Collectors.toMap(DicTypeEO::getDicTypeCode,DicTypeEO::getDicTypeName,(value1, value2 )->value2));
String value = ""; String value = "";
String select = ""; String select = "";
if (-1 != num) { if (-1 != num) {
value = searchInfoEO.getSelectValue().substring(0, num).trim().toUpperCase(); value = searchInfoEO.getSelectValue().substring(0, num).trim().toUpperCase();
select = searchInfoEO.getSelectValue().substring(num + 1).trim(); if (dicMap.containsKey(value) && dicMap.get(value) != null && !"".equals(dicMap.get(value))){
real = value + " " + select; select = searchInfoEO.getSelectValue().substring(num + 1).trim();
real = value + " " + select;
}else {
select = null;
value = real;
}
}else{ }else{
String reg = ".*[0-9].*"; String reg = ".*[0-9].*";
if("-".contains(real)){ if("-".contains(real)){
@@ -1322,7 +1336,12 @@ public class SearchCenterServiceImpl implements SearchCenterService {
value = value.toUpperCase(); value = value.toUpperCase();
} }
} }
real = value + " " + select; if (dicMap.containsKey(value) && dicMap.get(value) != null && !"".equals(dicMap.get(value))){
real = value + " " + select;
}else {
select = null;
value = real;
}
}else if(real.matches(reg)){ }else if(real.matches(reg)){
value = real.replaceAll("[^(A-Za-z\\/)]", ""); value = real.replaceAll("[^(A-Za-z\\/)]", "");
String[] valArr = value.split("\\/"); String[] valArr = value.split("\\/");
@@ -1345,7 +1364,13 @@ public class SearchCenterServiceImpl implements SearchCenterService {
value = value.toUpperCase(); value = value.toUpperCase();
} }
} }
real = value + " " + select; System.out.println(dicMap.get(value));
if (dicMap.containsKey(value) && dicMap.get(value) != null && !"".equals(dicMap.get(value))){
real = value + " " + select;
}else {
select = null;
value = real;
}
}else { }else {
value = real; value = real;
select = ""; select = "";
@@ -1399,16 +1424,10 @@ public class SearchCenterServiceImpl implements SearchCenterService {
if(null != value || null != selects){ if(null != value || null != selects){
if (null != value && selects == null) { if (null != value && selects == null) {
boolSelectValue.should(QueryBuilders.multiMatchQuery(value, boolSelectValue
"title" .should(QueryBuilders.wildcardQuery("title.keyword", "*" + value + "*").boost(1000f))
).minimumShouldMatch("100%").field("title",1000f)); .should(QueryBuilders.wildcardQuery("textContent.keyword", "*" + value + "*").boost(0.0000000000000000000000000000000001f))
boolSelectValue.should(QueryBuilders.multiMatchQuery(value, .should(QueryBuilders.wildcardQuery("issue_time", "*" + value + "*"));
"textContent"
).minimumShouldMatch("100%").field("title",1000f));
boolSelectValue.should(QueryBuilders.multiMatchQuery(value,
"textItems"
).minimumShouldMatch("100%").field("title",1000f));
boolSelectValue.should(QueryBuilders.wildcardQuery("title.keyword","*"+value+"*"));
// multiQueryBuilder = QueryBuilders.multiMatchQuery("*"+value+"*", // multiQueryBuilder = QueryBuilders.multiMatchQuery("*"+value+"*",
// "title.keyword", "textContent", "issue_time").minimumShouldMatch("100%").field("title.keyword", 1000f).field("textContent.keyword", 0.0000000000000000000000000000000001f); // "title.keyword", "textContent", "issue_time").minimumShouldMatch("100%").field("title.keyword", 1000f).field("textContent.keyword", 0.0000000000000000000000000000000001f);
//// boolQueryMust.must(multiQueryBuilder); //// boolQueryMust.must(multiQueryBuilder);
@@ -1468,14 +1487,13 @@ public class SearchCenterServiceImpl implements SearchCenterService {
updateIndex("fulltextserch",99999999,2); updateIndex("fulltextserch",99999999,2);
searchRequestBuilder = client.prepareSearch("fulltextserch") searchRequestBuilder = client.prepareSearch("fulltextserch")
.addSort(SortBuilders.fieldSort("issue_time").unmappedType("String").order(SortOrder.DESC))
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH) .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.highlighter(hiBuilder) .highlighter(hiBuilder)
.setFrom((searchInfoEO.getPage()-1)*searchInfoEO.getPageSize()) .setFrom((searchInfoEO.getPage()-1)*searchInfoEO.getPageSize())
.setSize(searchInfoEO.getPageSize()); .setSize(searchInfoEO.getPageSize());
searchRequestBuilder.setQuery(boolQueryShould).setTrackTotalHits(true); searchRequestBuilder.setQuery(boolQueryShould).setTrackTotalHits(true);
searchRequestBuilder.addSort(SortBuilders.fieldSort("issue_time").unmappedType("String").order(SortOrder.DESC));
// 获取查询到的结果 // 获取查询到的结果
SearchResponse response = searchRequestBuilder.get(); SearchResponse response = searchRequestBuilder.get();
for (SearchHit searchHit : response.getHits().getHits()) { for (SearchHit searchHit : response.getHits().getHits()) {
@@ -1508,6 +1526,7 @@ public class SearchCenterServiceImpl implements SearchCenterService {
result.add(sourceAsMap); result.add(sourceAsMap);
} }
searchInfoEO.getPager().setRowCount((int) response.getHits().getTotalHits().value); searchInfoEO.getPager().setRowCount((int) response.getHits().getTotalHits().value);
//给aqi升序排,null放到最后
// result.sort((o1, o2) -> { // result.sort((o1, o2) -> {
// if (o1.get("issue_time") != null && o2.get("issue_time") != null) { // if (o1.get("issue_time") != null && o2.get("issue_time") != null) {
// return o2.get("issue_time").toString().compareTo(o1.get("issue_time").toString()); // return o2.get("issue_time").toString().compareTo(o1.get("issue_time").toString());
@@ -609,6 +609,7 @@
<foreach collection="filed" index="index" item="item" separator=" and " > <foreach collection="filed" index="index" item="item" separator=" and " >
${item} is not NULL ${item} is not NULL
</foreach> </foreach>
and TS_DICTYPE.VALID_FLAG= '0'
</where> </where>
</select> </select>