private List searchByQuery()

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;
  }