`

lucene2.4源码学习9 搜索 norm

 
阅读更多


 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
  }


计算得分的时候要用到norm。这个norm是怎么来的呢

 public Scorer scorer(IndexReader reader) throws IOException {
      TermDocs termDocs = reader.termDocs(term);

      if (termDocs == null)
        return null;

      return new TermScorer(this, termDocs, similarity,
                            reader.norms(term.field()));
    }


看到score是从reader中来的。


norm是在SegmentReader的openNorms设置的。

 private void openNorms(Directory cfsDir, int readBufferSize) throws IOException {
    long nextNormSeek = SegmentMerger.NORMS_HEADER.length; //skip header (header unused for now)
    int maxDoc = maxDoc();
    for (int i = 0; i < fieldInfos.size(); i++) {
      FieldInfo fi = fieldInfos.fieldInfo(i);
      if (norms.containsKey(fi.name)) {
        // in case this SegmentReader is being re-opened, we might be able to
        // reuse some norm instances and skip loading them here
        continue;
      }
      if (fi.isIndexed && !fi.omitNorms) {
        Directory d = directory();
        String fileName = si.getNormFileName(fi.number);
        if (!si.hasSeparateNorms(fi.number)) {
          d = cfsDir;
        }
        
        // singleNormFile means multiple norms share this file
        boolean singleNormFile = fileName.endsWith("." + IndexFileNames.NORMS_EXTENSION);
        IndexInput normInput = null;
        long normSeek;

        if (singleNormFile) {
          normSeek = nextNormSeek;
          if (singleNormStream==null) {
            singleNormStream = d.openInput(fileName, readBufferSize);
          }
          // All norms in the .nrm file can share a single IndexInput since
          // they are only used in a synchronized context.
          // If this were to change in the future, a clone could be done here.
          normInput = singleNormStream;
        } else {
          normSeek = 0;
          normInput = d.openInput(fileName);
        }

        norms.put(fi.name, new Norm(normInput, singleNormFile, fi.number, normSeek));
        nextNormSeek += maxDoc; // increment also if some norms are separate
      }
    }
  }


IndexReader:
 public void setNorm(int doc, String field, float value)
          throws StaleReaderException, CorruptIndexException, LockObtainFailedException, IOException {
    ensureOpen();
    setNorm(doc, field, Similarity.encodeNorm(value));
  }


是在这里设置norm的,但是没看到有调用这个方法的地方。

分享到:
评论

相关推荐

    庖丁解牛 源码 for Lucene 2.4

    《庖丁解牛 源码 for Lucene 2.4》是一份针对开源全文搜索引擎Lucene 2.4版本的深度解析资料。这个压缩包包含的文件名为"paoding-for-lucene-2.4",很可能是针对中文处理的Paoding Lucene库的源代码分析或扩展。...

    java拼车网雏形(Ext2.0+SSH+oracle10g+lucene2.4)

    涉及的核心技术是Java Web开发中的几个关键组件,包括ExtJS 2.0前端框架,Spring、Struts2和Hibernate(SSH)后端框架,Oracle 10g数据库以及Lucene 2.4全文搜索引擎。 **ExtJS 2.0** 是一个用于构建富互联网应用...

    Lucene 2.4 入门例子

    doc.add(new TextField("content", "Lucene搜索示例", Field.Store.YES)); indexWriter.addDocument(doc); // 关闭IndexWriter indexWriter.close(); // 创建QueryParser QueryParser parser = new QueryParser(...

    lucene2.4+nutch学习笔记三:lucene 在多个文本文档里找出包含一些关键字的文档

    《Lucene 2.4与Nutch学习笔记:在多文本文档中搜索关键词》 Lucene是一个高性能、全文本搜索引擎库,它为开发者提供了在Java应用程序中实现全文搜索功能的基本工具。Nutch则是一个开源的网络爬虫项目,用于抓取...

    Lucene2.4入门总结

    **Lucene 2.4 入门指南** Lucene 是一个高性能、全文本搜索库,由 Apache 软件...随着对 Lucene 更深入的学习,你将能够探索更多的高级特性,如近实时搜索、分布式索引和更复杂的查询语法,以满足更复杂的应用场景。

    lucene 2.4 jar

    lucene 2.4 jar lucene2.4版本的JAR包

    ictclas4j for lucene 2.4

    ictclas4j for lucene 2.4 任何人不得将此用于商业用途,仅限个人学习研究之用.该开源项目遵循Apache License 2.0

    Lucene2.4完美样例+中文文档

    通过学习样例代码和阅读中文文档,你将能熟练掌握 Lucene 的基本操作,从而在自己的项目中实现高效的全文搜索功能。无论是初学者还是经验丰富的开发者,Lucene 都能提供丰富的工具和资源,帮助你提升搜索体验。

    struts2 + spring2.5 + hibernate 3.2 + lucene 2.4 + compass 2.0产品搜索

    struts2 + spring2.5 + hibernate 3.2 + lucene 2.4 + compass 2.0 包含所有jar包,按readme.txt导入并运行即可 开始不用分了................

    Lucene学习源码.rar

    本文将主要围绕Java Lucene进行深入探讨,并基于提供的“Lucene学习源码.rar”文件中的“Lucene视频教程_讲解部分源码”展开讨论。 一、Lucene核心概念 1. 文档(Document):Lucene中的基本单位,用于存储待检索...

    lucene3源码分析

    ### Lucene3源码分析知识点概述 #### 一、全文检索的基本原理 ##### 1. 总论 全文检索系统是一种高效的信息检索技术,能够帮助用户在海量文档中快速找到包含特定关键词的信息。Lucene是Java领域内最受欢迎的全文...

    Lucene_2.4.CHM

    lucene2.4手册,是开发搜索引擎的好帮手.

    Lucene3.5源码jar包

    本压缩包包含的是Lucene 3.5.0版本的全部源码,对于想要深入理解Lucene工作原理、进行二次开发或者进行搜索引擎相关研究的开发者来说,是一份非常宝贵的学习资源。 Lucene 3.5.0是Lucene的一个重要版本,它在3.x...

    Lucene2.4.1

    总结来说,Lucene 2.4.1是搜索引擎开发的重要工具,其源码的分析与学习对于提升对全文检索技术的理解至关重要。无论是熟悉核心包的类与接口,还是实践demos包中的示例,都将有助于开发者更好地利用Lucene构建高效、...

    lucene5.0源码包

    在本文中,我们将深入探讨Lucene 5.0的源码,揭示其核心设计思想与工作原理,帮助读者更好地理解和运用这一强大的搜索引擎库。 1. **Lucene 5.0概述** Lucene 5.0是Lucene的重大更新版本,引入了许多优化和新特性...

    Lucene.net3.0+PanGu2.4.zip

    支持net4.0环境下运行,Lucene.net版本为3.0,PanGu版本为2.4

    lucene.net 2.9.1 源码

    《深入剖析Lucene.NET 2.9.1:源码解析与应用...总结,Lucene.NET 2.9.1的源码不仅是一份学习资料,也是实践中的宝贵工具。深入理解其工作机制,将有助于提升.NET平台上的搜索技术能力,实现高效、精准的全文检索功能。

    lunence2.4例题

    9. **分布式搜索**:如果涉及到大型数据集,学习者还需要了解如何利用Lucene的分布式搜索能力,例如Solr或Elasticsearch。 总之,通过这份"lunence2.4例题",学习者可以系统地学习和实践Lucene 2.4的各项功能,从而...

    Lucene.Net源码与说明文档

    通过深入研究 Lucene.Net 源码,开发者不仅可以掌握搜索引擎的基本原理,还能了解 .NET 平台上的高性能数据处理技巧。同时,结合文档,开发者可以更好地应用 Lucene.Net 到实际项目中,提升应用程序的搜索体验。

Global site tag (gtag.js) - Google Analytics