`

lucene2.4源码学习11 查询 tf

 
阅读更多


在termscore中计算得分的时候,用到tf的。tf就是这个term在这个文档出现的次数。

怎么用到的呢:
 public float score() {
    int f = freqs[pointer];
    float raw =                                   // compute tf(f)*weight
      f < SCORE_CACHE_SIZE                        // check cache
      ? scoreCache[f]                             // cache hit
      : getSimilarity().tf(f)*weightValue;        // cache miss

    return raw * Similarity.decodeNorm(norms[doc]); // normalize for field
  }


 public float tf(float freq) {
    return (float)Math.sqrt(freq);
  }


tf的计算很简单,就是对文档的这个term出现的次数开平方

那term出现的次数怎么得来的呢。

pointer是第n个document,
搜索初始化的时候,就会遍历所有的文档频率信息,由freqStream指向。term开始查询时,通过read方法,保存到一个数组中,int[] freqs 。下表为文档的id。

public int read(final int[] docs, final int[] freqs)
          throws IOException {
    final int length = docs.length;
    if (currentFieldOmitTf) {
      return readNoTf(docs, freqs, length);
    } else {
      int i = 0;
      while (i < length && count < df) {
        // manually inlined call to next() for speed
        final int docCode = freqStream.readVInt();
        doc += docCode >>> 1;       // shift off low bit
        if ((docCode & 1) != 0)       // if low bit is set
          freq = 1;         // freq is one
        else
          freq = freqStream.readVInt();     // else read freq
        count++;

        if (deletedDocs == null || !deletedDocs.get(doc)) {
          docs[i] = doc;
          freqs[i] = freq;
          ++i;
        }
      }
      return i;
    }
  }


这样就取到了term在某个document的出现次数。


  • 大小: 88.1 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics