lucene搜索引擎技术的分析与整理(lucene代码分析)

来源:互联网 发布:制作手机视频短片软件 编辑:程序博客网 时间:2024/05/01 02:33

5. Lucene 代码分析

应用情景分析

 

Query query = parser.parse(queries[j]);

 

获得布尔查询

 

hits = searcher.search(query);

 

 

return new Hits(this, query, filter);

 

getMoreDocs(50)

 

TopDocs topDocs = searcher.search(query, filter, n)

 

IndexSearcher:public TopDocs search(Query query, Filter filter, final int nDocs)

² IndexSearcher 开始时已经打开了该目录

² IndexSearcher 中初始化了 IndexReader

² IndexReader 中读取了 SegmentInfos

² IndexReader = SegmentReader

² SegmentReader ::initialize(SegmentInfo si)

n 1 。读入域信息,只有域的名字

n 2. 打开保存域、保存域索引的文件

 

Scorer scorer = query.weight(this).scorer(reader)

u 这里 query = PhraseQuery

u query.weight(this) 获得 PhraseWeight ( IndexSearcher )

u PhraseWeight :: scorer(IndexReader reader)

u PhraseQuery :: TermPositions p = reader.termPositions((Term)terms.elementAt(i));

u public TermPositions termPositions(Term term) throws IOException {

IndexReader :: TermPositions termPositions = termPositions();

SegmentTermDocs :: SegmentTermDocs(SegmentReader parent)

throws IOException {

this.parent = parent;

this.freqStream = (InputStream) parent.freqStream.clone();// 频率文件

this.deletedDocs = parent.deletedDocs;

this.skipInterval = parent.tis.getSkipInterval();

}

SegmentTermPositions :: SegmentTermPositions(SegmentReader p) throws IOException {

super(p);

this.proxStream = (InputStream)parent.proxStream.clone();// 位置文件

}

 

IndexReader = SegmentReader, IndexSearcher

termPositions.seek(term);

SegmentTermDocs :: public void seek(Term term) throws IOException {

TermInfo ti = parent.tis.get(term);// parent = SegmentReader

// tis = TermInfosReader

// 在初始化 SegmentTermDocs 的时候读取文件并创建了

// tis = new TermInfosReader(cfsDir, segment, fieldInfos);

/**

* 1 。从 .tis 文件中读取相关的信息 到 项的迭代对象

* 2 。得到项的迭代对象

* 3 。该项读取器 的 size = 该项迭代对象的 size

* 4 。读取索引,初始化了 索引指针,索引

* */

seek(ti);

}

 

return termPositions;

² SegmentReader. termPositions() :: return SegmentTermPositions(this)`

 

<p> 一个权重由 query 创建,并给查询器 ({@link Query#createWeight(Searcher)}) 使用,方法 {@link #sumOfSquaredWeights()} ,然后被最高级的查询 api 调用

用来计算查询规范化因子 (@link Similarity#queryNorm(float)}) ,然后该因子传给 {@link #normalize(float)} 然后被 {@link #scorer(IndexReader)} 调用

 

 

原创粉丝点击