zoukankan      html  css  js  c++  java
  • lucene .doc里存储的skiplist跳表

    http://forfuture1978.iteye.com/blog/546841

    见图:

    lucene-6.5.1-src/lucene-6.5.1
    $ grep "skiplistwriter" * -ril
    core/src/java/org/apache/lucene/codecs/lucene50/Lucene50PostingsFormat.java
    core/src/java/org/apache/lucene/codecs/lucene50/Lucene50SkipWriter.java
    core/src/java/org/apache/lucene/codecs/MultiLevelSkipListReader.java
    core/src/java/org/apache/lucene/codecs/MultiLevelSkipListWriter.java

    测试代码位置:

    lucene-6.5.1-src/lucene-6.5.1
    $ vim core/src/test/org/apache/lucene/codecs/lucene50/TestBlockPostingsFormat3.java

      /**
       * checks advancing docs
       */
      public void assertDocsSkipping(int docFreq, PostingsEnum leftDocs, PostingsEnum rightDocs) throws Exception {
        if (leftDocs == null) {
          assertNull(rightDocs);
          return;
        }
        int docid = -1;
        int averageGap = MAXDOC / (1+docFreq);
        int skipInterval = 16;
    
        while (true) {
          if (random().nextBoolean()) {
            // nextDoc()
            docid = leftDocs.nextDoc();
            assertEquals(docid, rightDocs.nextDoc());
          } else {
            // advance()
            int skip = docid + (int) Math.ceil(Math.abs(skipInterval + random().nextGaussian() * averageGap));
            docid = leftDocs.advance(skip);
            assertEquals(docid, rightDocs.advance(skip));
          }
    
          if (docid == DocIdSetIterator.NO_MORE_DOCS) {
            return;
          }
          // we don't assert freqs, they are allowed to be different
        }
      }
      /**
       * checks advancing docs + positions
       */
      public void assertPositionsSkipping(int docFreq, PostingsEnum leftDocs, PostingsEnum rightDocs) throws Exception {
        if (leftDocs == null || rightDocs == null) {
          assertNull(leftDocs);
          assertNull(rightDocs);
          return;
        }
    
        int docid = -1;
        int averageGap = MAXDOC / (1+docFreq);
        int skipInterval = 16;
    
        while (true) {
          if (random().nextBoolean()) {
            // nextDoc()
            docid = leftDocs.nextDoc();
            assertEquals(docid, rightDocs.nextDoc());
          } else {
            // advance()
            int skip = docid + (int) Math.ceil(Math.abs(skipInterval + random().nextGaussian() * averageGap));
            docid = leftDocs.advance(skip);
            assertEquals(docid, rightDocs.advance(skip));
          }
    
          if (docid == DocIdSetIterator.NO_MORE_DOCS) {
            return;
          }
          int freq = leftDocs.freq();
          assertEquals(freq, rightDocs.freq());
          for (int i = 0; i < freq; i++) {
            assertEquals(leftDocs.nextPosition(), rightDocs.nextPosition());
            // we don't compare the payloads, it's allowed that one is empty etc
          }
        }
      }
  • 相关阅读:
    golang以服务方式运行
    nginx重写规则配置
    PHP的 parse_ini_file 解析配置文件
    在Yii2中集成Markdown编辑器
    理解 is_callable
    Composer安装yii2-imagine 压缩,剪切,旋转,水印
    Yii2 基于header 实现接口版本控制
    (1) laravel php artisan list make
    php 阿里云国内短信实例
    php 云片国外短信实例
  • 原文地址:https://www.cnblogs.com/bonelee/p/6808500.html
Copyright © 2011-2022 走看看