public void process()

in solr/core/src/java/org/apache/solr/handler/component/TermVectorComponent.java [128:303]


  public void process(ResponseBuilder rb) throws IOException {
    SolrParams params = rb.req.getParams();
    if (!params.getBool(COMPONENT_NAME, false)) {
      return;
    }

    NamedList<Object> termVectorsNL = new NamedList<>();
    rb.rsp.add(TERM_VECTORS, termVectorsNL);

    IndexSchema schema = rb.req.getSchema();
    SchemaField keyField = schema.getUniqueKeyField();
    String uniqFieldName = null;
    if (keyField != null) {
      uniqFieldName = keyField.getName();
    }

    FieldOptions allFields = new FieldOptions();
    // figure out what options we have, and try to get the appropriate vector
    allFields.termFreq = params.getBool(TermVectorParams.TF, false);
    allFields.positions = params.getBool(TermVectorParams.POSITIONS, false);
    allFields.offsets = params.getBool(TermVectorParams.OFFSETS, false);
    allFields.payloads = params.getBool(TermVectorParams.PAYLOADS, false);
    allFields.docFreq = params.getBool(TermVectorParams.DF, false);
    allFields.tfIdf = params.getBool(TermVectorParams.TF_IDF, false);
    // boolean cacheIdf = params.getBool(TermVectorParams.IDF, false);
    // short cut to all values.
    if (params.getBool(TermVectorParams.ALL, false)) {
      allFields.termFreq = true;
      allFields.positions = true;
      allFields.offsets = true;
      allFields.payloads = true;
      allFields.docFreq = true;
      allFields.tfIdf = true;
    }

    // Build up our per field mapping
    Map<String, FieldOptions> fieldOptions = new HashMap<>();
    NamedList<List<String>> warnings = new NamedList<>();
    List<String> noTV = new ArrayList<>();
    List<String> noPos = new ArrayList<>();
    List<String> noOff = new ArrayList<>();
    List<String> noPay = new ArrayList<>();

    Set<String> fields = getFields(rb);
    if (null != fields) {
      // we have specific fields to retrieve, or no fields
      for (String field : fields) {

        // workaround SOLR-3523
        if (null == field || "score".equals(field)) continue;

        // we don't want to issue warnings about the uniqueKey field
        // since it can cause lots of confusion in distributed requests
        // where the uniqueKey field is injected into the fl for merging
        final boolean fieldIsUniqueKey = field.equals(uniqFieldName);

        SchemaField sf = schema.getFieldOrNull(field);
        if (sf != null) {
          if (sf.storeTermVector()) {
            FieldOptions option = fieldOptions.get(field);
            if (option == null) {
              option = new FieldOptions();
              option.fieldName = field;
              fieldOptions.put(field, option);
            }
            // get the per field mappings
            option.termFreq = params.getFieldBool(field, TermVectorParams.TF, allFields.termFreq);
            option.docFreq = params.getFieldBool(field, TermVectorParams.DF, allFields.docFreq);
            option.tfIdf = params.getFieldBool(field, TermVectorParams.TF_IDF, allFields.tfIdf);
            // Validate these are even an option
            option.positions =
                params.getFieldBool(field, TermVectorParams.POSITIONS, allFields.positions);
            if (option.positions && !sf.storeTermPositions() && !fieldIsUniqueKey) {
              noPos.add(field);
            }
            option.offsets =
                params.getFieldBool(field, TermVectorParams.OFFSETS, allFields.offsets);
            if (option.offsets && !sf.storeTermOffsets() && !fieldIsUniqueKey) {
              noOff.add(field);
            }
            option.payloads =
                params.getFieldBool(field, TermVectorParams.PAYLOADS, allFields.payloads);
            if (option.payloads && !sf.storeTermPayloads() && !fieldIsUniqueKey) {
              noPay.add(field);
            }
          } else { // field doesn't have term vectors
            if (!fieldIsUniqueKey) noTV.add(field);
          }
        } else {
          // field doesn't exist
          throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "undefined field: " + field);
        }
      }
    } // else, deal with all fields

    // NOTE: currently all types of warnings are schema driven, and guaranteed
    // to be consistent across all shards - if additional types of warnings
    // are added that might be different between shards, finishStage() needs
    // to be changed to account for that.
    if (!noTV.isEmpty()) {
      warnings.add("noTermVectors", noTV);
    }
    if (!noPos.isEmpty()) {
      warnings.add("noPositions", noPos);
    }
    if (!noOff.isEmpty()) {
      warnings.add("noOffsets", noOff);
    }
    if (!noPay.isEmpty()) {
      warnings.add("noPayloads", noPay);
    }
    if (warnings.size() > 0) {
      termVectorsNL.add(TV_KEY_WARNINGS, warnings);
    }

    DocListAndSet listAndSet = rb.getResults();
    List<Integer> docIds = getInts(params.getParams(TermVectorParams.DOC_IDS));
    Iterator<Integer> iter;
    if (docIds != null && !docIds.isEmpty()) {
      iter = docIds.iterator();
    } else {
      DocList list = listAndSet.docList;
      iter = list.iterator();
    }
    SolrIndexSearcher searcher = rb.req.getSearcher();

    IndexReader reader = searcher.getIndexReader();
    TermVectors termVectors = reader.termVectors();
    // the TVMapper is a TermVectorMapper which can be used to optimize loading of Term Vectors

    // Only load the id field to get the uniqueKey of that
    // field
    SolrDocumentFetcher docFetcher = searcher.getDocFetcher();
    SolrReturnFields srf = new SolrReturnFields(uniqFieldName, rb.req);

    while (iter.hasNext()) {
      Integer docId = iter.next();
      NamedList<Object> docNL = new NamedList<>();

      if (keyField != null) {
        // guaranteed to be one and only one since this is uniqueKey!
        SolrDocument solrDoc = docFetcher.solrDoc(docId, srf);
        String uKey = schema.printableUniqueKey(solrDoc);
        assert null != uKey;
        docNL.add("uniqueKey", uKey);
        termVectorsNL.add(uKey, docNL);
      } else {
        // support for schemas w/o a unique key,
        termVectorsNL.add("doc-" + docId, docNL);
      }

      if (null != fields) {
        for (Map.Entry<String, FieldOptions> entry : fieldOptions.entrySet()) {
          final String field = entry.getKey();
          final Terms vector = termVectors.get(docId, field);
          if (vector != null) {
            TermsEnum termsEnum = vector.iterator();
            mapOneVector(docNL, entry.getValue(), reader, docId, termsEnum, field);
          }
        }
      } else {
        // extract all fields
        final Fields vectors = termVectors.get(docId);
        // There can be no documents with vectors
        if (vectors != null) {
          for (String field : vectors) {
            Terms terms = vectors.terms(field);
            if (terms != null) {
              TermsEnum termsEnum = terms.iterator();
              mapOneVector(docNL, allFields, reader, docId, termsEnum, field);
            }
          }
        }
      }
    }
  }