Пример #1
0
  public static SearchSourceBuilder parseSearchSource(RestRequest request) {
    SearchSourceBuilder searchSourceBuilder = null;

    QuerySourceBuilder querySourceBuilder = RestActions.parseQuerySource(request);
    if (querySourceBuilder != null) {
      searchSourceBuilder = new SearchSourceBuilder();
      searchSourceBuilder.query(querySourceBuilder);
    }

    int from = request.paramAsInt("from", -1);
    if (from != -1) {
      if (searchSourceBuilder == null) {
        searchSourceBuilder = new SearchSourceBuilder();
      }
      searchSourceBuilder.from(from);
    }
    int size = request.paramAsInt("size", -1);
    if (size != -1) {
      if (searchSourceBuilder == null) {
        searchSourceBuilder = new SearchSourceBuilder();
      }
      searchSourceBuilder.size(size);
    }

    if (request.hasParam("explain")) {
      if (searchSourceBuilder == null) {
        searchSourceBuilder = new SearchSourceBuilder();
      }
      searchSourceBuilder.explain(request.paramAsBoolean("explain", null));
    }
    if (request.hasParam("version")) {
      if (searchSourceBuilder == null) {
        searchSourceBuilder = new SearchSourceBuilder();
      }
      searchSourceBuilder.version(request.paramAsBoolean("version", null));
    }
    if (request.hasParam("timeout")) {
      if (searchSourceBuilder == null) {
        searchSourceBuilder = new SearchSourceBuilder();
      }
      searchSourceBuilder.timeout(request.paramAsTime("timeout", null));
    }
    if (request.hasParam("terminate_after")) {
      if (searchSourceBuilder == null) {
        searchSourceBuilder = new SearchSourceBuilder();
      }
      int terminateAfter =
          request.paramAsInt("terminate_after", SearchContext.DEFAULT_TERMINATE_AFTER);
      if (terminateAfter < 0) {
        throw new IllegalArgumentException("terminateAfter must be > 0");
      } else if (terminateAfter > 0) {
        searchSourceBuilder.terminateAfter(terminateAfter);
      }
    }

    String sField = request.param("fields");
    if (sField != null) {
      if (searchSourceBuilder == null) {
        searchSourceBuilder = new SearchSourceBuilder();
      }
      if (!Strings.hasText(sField)) {
        searchSourceBuilder.noFields();
      } else {
        String[] sFields = Strings.splitStringByCommaToArray(sField);
        if (sFields != null) {
          for (String field : sFields) {
            searchSourceBuilder.field(field);
          }
        }
      }
    }
    String sFieldDataFields = request.param("fielddata_fields");
    if (sFieldDataFields != null) {
      if (searchSourceBuilder == null) {
        searchSourceBuilder = new SearchSourceBuilder();
      }
      if (Strings.hasText(sFieldDataFields)) {
        String[] sFields = Strings.splitStringByCommaToArray(sFieldDataFields);
        if (sFields != null) {
          for (String field : sFields) {
            searchSourceBuilder.fieldDataField(field);
          }
        }
      }
    }
    FetchSourceContext fetchSourceContext = FetchSourceContext.parseFromRestRequest(request);
    if (fetchSourceContext != null) {
      if (searchSourceBuilder == null) {
        searchSourceBuilder = new SearchSourceBuilder();
      }
      searchSourceBuilder.fetchSource(fetchSourceContext);
    }

    if (request.hasParam("track_scores")) {
      if (searchSourceBuilder == null) {
        searchSourceBuilder = new SearchSourceBuilder();
      }
      searchSourceBuilder.trackScores(request.paramAsBoolean("track_scores", false));
    }

    String sSorts = request.param("sort");
    if (sSorts != null) {
      if (searchSourceBuilder == null) {
        searchSourceBuilder = new SearchSourceBuilder();
      }
      String[] sorts = Strings.splitStringByCommaToArray(sSorts);
      for (String sort : sorts) {
        int delimiter = sort.lastIndexOf(":");
        if (delimiter != -1) {
          String sortField = sort.substring(0, delimiter);
          String reverse = sort.substring(delimiter + 1);
          if ("asc".equals(reverse)) {
            searchSourceBuilder.sort(sortField, SortOrder.ASC);
          } else if ("desc".equals(reverse)) {
            searchSourceBuilder.sort(sortField, SortOrder.DESC);
          }
        } else {
          searchSourceBuilder.sort(sort);
        }
      }
    }

    String sStats = request.param("stats");
    if (sStats != null) {
      if (searchSourceBuilder == null) {
        searchSourceBuilder = new SearchSourceBuilder();
      }
      searchSourceBuilder.stats(Strings.splitStringByCommaToArray(sStats));
    }

    String suggestField = request.param("suggest_field");
    if (suggestField != null) {
      String suggestText = request.param("suggest_text", request.param("q"));
      int suggestSize = request.paramAsInt("suggest_size", 5);
      if (searchSourceBuilder == null) {
        searchSourceBuilder = new SearchSourceBuilder();
      }
      String suggestMode = request.param("suggest_mode");
      searchSourceBuilder
          .suggest()
          .addSuggestion(
              termSuggestion(suggestField)
                  .field(suggestField)
                  .text(suggestText)
                  .size(suggestSize)
                  .suggestMode(suggestMode));
    }

    return searchSourceBuilder;
  }