IndexSort

排序函数获取

/** We cannot use the {@link FieldComparator} API because that API requires that you send it docIDs in order.  Note that this API
   *  allocates arrays[maxDoc] to hold the native values needed for comparison, but 1) they are transient (only alive while sorting this one
   *  segment), and 2) in the typical index sorting case, they are only used to sort newly flushed segments, which will be smaller than
   *  merged segments.  */
  static DocComparator getDocComparator(int maxDoc,
                                        SortField sortField,
                                        SortedDocValuesSupplier sortedProvider,
                                        NumericDocValuesSupplier numericProvider) throws IOException {

    final int reverseMul = sortField.getReverse() ? -1 : 1;
    final SortField.Type sortType = getSortFieldType(sortField);

    switch(sortType) {

      case STRING:
      {
        final SortedDocValues sorted = sortedProvider.get();
        final int missingOrd;
        if (sortField.getMissingValue() == SortField.STRING_LAST) {
          missingOrd = Integer.MAX_VALUE;
        } else {
          missingOrd = Integer.MIN_VALUE;
        }

        final int[] ords = new int[maxDoc];
        Arrays.fill(ords, missingOrd);
        int docID;
        while ((docID = sorted.nextDoc()) != NO_MORE_DOCS) {
          ords[docID] = sorted.ordValue();
        }

        return new DocComparator() {
          @Override
          public int compare(int docID1, int docID2) {
            return reverseMul * Integer.compare(ords[docID1], ords[docID2]);
          }
        };
      }

      case LONG:
      {
        final NumericDocValues dvs = numericProvider.get();
        long[] values = new long[maxDoc];
        if (sortField.getMissingValue() != null) {
          Arrays.fill(values, (Long) sortField.getMissingValue());
        }
        while (true) {
          int docID = dvs.nextDoc();
          if (docID == NO_MORE_DOCS) {
            break;
          }
          values[docID] = dvs.longValue();
        }

        return new DocComparator() {
          @Override
          public int compare(int docID1, int docID2) {
            return reverseMul * Long.compare(values[docID1], values[docID2]);
          }
        };
      }

      case INT:
      {
        final NumericDocValues dvs = numericProvider.get();
        int[] values = new int[maxDoc];
        if (sortField.getMissingValue() != null) {
          Arrays.fill(values, (Integer) sortField.getMissingValue());
        }

        while (true) {
          int docID = dvs.nextDoc();
          if (docID == NO_MORE_DOCS) {
            break;
          }
          values[docID] = (int) dvs.longValue();
        }

        return new DocComparator() {
          @Override
          public int compare(int docID1, int docID2) {
            return reverseMul * Integer.compare(values[docID1], values[docID2]);
          }
        };
      }

      case DOUBLE:
      {
        final NumericDocValues dvs = numericProvider.get();
        double[] values = new double[maxDoc];
        if (sortField.getMissingValue() != null) {
          Arrays.fill(values, (Double) sortField.getMissingValue());
        }
        while (true) {
          int docID = dvs.nextDoc();
          if (docID == NO_MORE_DOCS) {
            break;
          }
          values[docID] = Double.longBitsToDouble(dvs.longValue());
        }

        return new DocComparator() {
          @Override
          public int compare(int docID1, int docID2) {
            return reverseMul * Double.compare(values[docID1], values[docID2]);
          }
        };
      }

      case FLOAT:
      {
        final NumericDocValues dvs = numericProvider.get();
        float[] values = new float[maxDoc];
        if (sortField.getMissingValue() != null) {
          Arrays.fill(values, (Float) sortField.getMissingValue());
        }
        while (true) {
          int docID = dvs.nextDoc();
          if (docID == NO_MORE_DOCS) {
            break;
          }
          values[docID] = Float.intBitsToFloat((int) dvs.longValue());
        }

        return new DocComparator() {
          @Override
          public int compare(int docID1, int docID2) {
            return reverseMul * Float.compare(values[docID1], values[docID2]);
          }
        };
      }

      default:
        throw new IllegalArgumentException("unhandled SortField.getType()=" + sortField.getType());
    }
  }

是否可以快速结束。 判断searchSort和indexSort是否是一致的。

org.apache.lucene.search.TopFieldCollector canEarlyTerminate

LeafMetaData 中包含了indexSort信息

this.metaData = new LeafMetaData(createdVersionMajor, si.info.getMinVersion(), si.info.getIndexSort());

  static boolean canEarlyTerminate(Sort searchSort, Sort indexSort) {
    final SortField[] fields1 = searchSort.getSort();
    final SortField[] fields2 = indexSort.getSort();
    // early termination is possible if fields1 is a prefix of fields2
    if (fields1.length > fields2.length) {
      return false;
    }
    return Arrays.asList(fields1).equals(Arrays.asList(fields2).subList(0, fields1.length));
  }

### 回答1: 这行代码是一段MATLAB代码,将一个名为Fitness的向量进行排序,返回排序后的结果和排序后原始位置的索引值。 具体来说,中括号中第一个输出变量SortFitness是经过排序后得到的Fitness向量,第二个输出变量IndexSort则是排序后原始位置的索引值。 sort函数默认升序排序,如果要进行降序排序,可以在sort函数后面添加'descend'参数,如下所示: [SortFitness,IndexSort]=sort(Fitness,'descend'); ### 回答2: 中文,[SortFitness, IndexSort]=sort(Fitness); 是一行MATLAB代码,用于对一组健身数据进行排序。 其中,Fitness是一个包含多个健身数据的向量或矩阵。健身数据可以是人们的体重、身高、体脂率等等。 这行代码的作用是将Fitness中的健身数据进行排序,并将排序后的结果保存在SortFitness变量中。IndexSort变量则保存了原始健身数据在排序后的位置索引。 在排序过程中,如果Fitness是一个向量,那么SortFitness将按照数据的大小从小到大进行排序。如果Fitness是一个矩阵,那么则按照每列数据的大小进行排序。 通过这行代码,我们可以得到排序后的健身数据,并且可以根据IndexSort的索引,知道原始健身数据在排序后的位置。例如,如果需要知道某个健身数据在排序后的第几位,可以通过IndexSort找到对应的位置。 总之,这行代码的功能是对健身数据进行排序,并保存排序结果和原始数据的位置索引。这样可以方便我们分析健身数据的大小关系或者进行进一步的数据处理。 ### 回答3: 这段代码使用MATLAB中的sort函数对Fitness进行排序,并将排序后的结果保存在SortFitness和IndexSort两个变量中。 sort函数是用来对一个数组进行排序的,它有两个输出参数,第一个是排序后的数组,第二个是排序后的数组中每个元素在原数组中的索引位置。 在这段代码中,Fitness是一个数组,它包含了一组代表适应度的数值。SortFitness和IndexSort是两个变量,用来保存排序后的结果。 当执行sort(Fitness)时,sort函数会默认按照升序的方式对Fitness进行排序,并将排序后的结果保存在SortFitness中。 同时,IndexSort会保存每个元素在排序后的数组SortFitness中的位置索引。也就是说,如果排序后的数组中第一个元素在原数组中的位置是第3个,那么IndexSort的第一个元素就是3,依次类推。 这样,通过使用sort函数,我们可以获取到按照适应度排序后的Fitness数组,并且可以知道每个元素在排序后的数组中的位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值