in core/src/main/java/org/apache/sdap/mudrod/ssearch/Searcher.java [103:245]
private List<SResult> searchByQuery(String index, String type, String query, String queryOperator, String rankOption) {
boolean exists = es.getClient()
.admin()
.indices()
.prepareExists(index)
.execute()
.actionGet()
.isExists();
if (!exists) {
return new ArrayList<>();
}
SortOrder order = null;
String sortField;
switch (rankOption) {
case "Rank-AllTimePopularity":
sortField = "Dataset-AllTimePopularity";
order = SortOrder.DESC;
break;
case "Rank-MonthlyPopularity":
sortField = "Dataset-MonthlyPopularity";
order = SortOrder.DESC;
break;
case "Rank-UserPopularity":
sortField = "Dataset-UserPopularity";
order = SortOrder.DESC;
break;
case "Rank-LongName-Full":
sortField = "Dataset-LongName";
order = SortOrder.ASC;
break;
case "Rank-ShortName-Full":
sortField = "Dataset-ShortName";
order = SortOrder.ASC;
break;
case "Rank-GridSpatialResolution":
sortField = "Dataset-GridSpatialResolution";
order = SortOrder.DESC;
break;
case "Rank-SatelliteSpatialResolution":
sortField = "Dataset-SatelliteSpatialResolution";
order = SortOrder.DESC;
break;
case "Rank-StartTimeLong-Long":
sortField = "DatasetCoverage-StartTimeLong-Long";
order = SortOrder.ASC;
break;
case "Rank-StopTimeLong-Long":
sortField = "DatasetCoverage-StopTimeLong-Long";
order = SortOrder.DESC;
break;
default:
sortField = "Dataset-ShortName";
order = SortOrder.ASC;
break;
}
Dispatcher dp = new Dispatcher(this.getConfig(), this.getES(), null);
BoolQueryBuilder qb = dp.createSemQuery(query, 1.0, queryOperator);
List<SResult> resultList = new ArrayList<>();
SearchRequestBuilder builder = es.getClient()
.prepareSearch(index)
.setTypes(type)
.setQuery(qb)
.addSort(sortField, order)
.setSize(500)
.setTrackScores(true);
SearchResponse response = builder.execute().actionGet();
for (SearchHit hit : response.getHits().getHits()) {
Map<String, Object> result = hit.getSource();
Double relevance = Double.valueOf(ndForm.format(hit.getScore()));
String shortName = (String) result.get("Dataset-ShortName");
String longName = (String) result.get("Dataset-LongName");
ArrayList<String> topicList = (ArrayList<String>) result.get("DatasetParameter-Variable");
String topic = "";
if (null != topicList) {
topic = String.join(", ", topicList);
}
String content = (String) result.get("Dataset-Description");
if (!"".equals(content)) {
int maxLength = (content.length() < MAX_CHAR) ? content.length() : MAX_CHAR;
content = content.trim().substring(0, maxLength - 1) + "...";
}
ArrayList<String> longdate = (ArrayList<String>) result.get("DatasetCitation-ReleaseDateLong");
Date date = new Date(Long.valueOf(longdate.get(0)));
SimpleDateFormat df2 = new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH);
String dateText = df2.format(date);
// start date
Long start = (Long) result.get("DatasetCoverage-StartTimeLong-Long");
Date startDate = new Date(start);
String startDateTxt = df2.format(startDate);
// end date
String end = (String) result.get("Dataset-DatasetCoverage-StopTimeLong");
String endDateTxt = "";
if ("".equals(end)) {
endDateTxt = "Present";
} else {
Date endDate = new Date(Long.valueOf(end));
endDateTxt = df2.format(endDate);
}
String processingLevel = (String) result.get("Dataset-ProcessingLevel");
Double proNum = getProLevelNum(processingLevel);
Double userPop = getPop(((Integer) result.get("Dataset-UserPopularity")).doubleValue());
Double allPop = getPop(((Integer) result.get("Dataset-AllTimePopularity")).doubleValue());
Double monthPop = getPop(((Integer) result.get("Dataset-MonthlyPopularity")).doubleValue());
List<String> sensors = (List<String>) result.get("DatasetSource-Sensor-ShortName");
SResult re = new SResult(shortName, longName, topic, content, dateText);
SResult.set(re, "term", relevance);
SResult.set(re, "releaseDate", Long.valueOf(longdate.get(0)).doubleValue());
SResult.set(re, "processingLevel", processingLevel);
SResult.set(re, "processingL", proNum);
SResult.set(re, "userPop", userPop);
SResult.set(re, "allPop", allPop);
SResult.set(re, "monthPop", monthPop);
SResult.set(re, "startDate", startDateTxt);
SResult.set(re, "endDate", endDateTxt);
SResult.set(re, "sensors", String.join(", ", sensors));
QueryBuilder queryLabelSearch = QueryBuilders.boolQuery().must(QueryBuilders.termQuery("query", query)).must(QueryBuilders.termQuery("dataID", shortName));
SearchResponse labelRes = es.getClient().prepareSearch(index).setTypes("trainingranking").setQuery(queryLabelSearch).setSize(5).execute().actionGet();
String labelString = null;
for (SearchHit label : labelRes.getHits().getHits()) {
Map<String, Object> labelItem = label.getSource();
labelString = (String) labelItem.get("label");
}
SResult.set(re, "label", labelString);
resultList.add(re);
}
return resultList;
}