lucene核心代码分析8

lucene核心代码分析8,第1张

lucene核心代码分析8

2021SC@SDUSC
之前我们讲解了创建索引对象,接下来就是创建文档对象了。
直接上代码:

document doc = new document(); 
doc.add(new Field("path", f.getPath(), Field.Store.YES, Field.Index.NOT_ANALYZED)); 
doc.add(new Field("modified",DateTools.timeToString(f.lastModified(), 
DateTools.Resolution.MINUTE), Field.Store.YES, Field.Index.NOT_ANALYZED)); 
doc.add(new Field("contents", new FileReader(f)));

document 对象主要包括以下部分:
1、此文档的 boost,默认为 1,大于一说明比一般的文档更加重要,小于一说明更不重要。
2、一个 ArrayList 保存此文档所有的域
3、每一个域包括域名,域值,和一些标志位,和 fnm,fdx,fdt 中的描述相对应。
那么此时的结果为:

doc document (id=42) 
 boost 1.0 
 fields ArrayList (id=44) 
 elementData Object[10] (id=46) 
 [0] Field (id=48) 
 binaryLength 0 
 binaryOffset 0 
 boost 1.0 
 fieldsData "exampledocs\file01.txt" 
 isBinary false 
 isIndexed true 
 isStored true 
 isTokenized false 
 lazy false 
 name "path" 
 omitNorms false 
 omitTermFreqAndPositions false 
 storeOffsetWithTermVector false 
 storePositionWithTermVector false 
 storeTermVector false 
 tokenStream null 
 [1] Field (id=50) 
 binaryLength 0 
 binaryOffset 0 
 boost 1.0 
 fieldsData "200910240957" 
 isBinary false 
 isIndexed true 
 isStored true 
 isTokenized false 
 lazy false 
 name "modified" 
 omitNorms false 
 omitTermFreqAndPositions false 
 storeOffsetWithTermVector false 
 storePositionWithTermVector false 
 storeTermVector false 
 tokenStream null 
 [2] Field (id=52) 
 binaryLength 0 
 binaryOffset 0 
 boost 1.0 
 fieldsData FileReader (id=58) 
 isBinary false 
 isIndexed true 
 isStored false 
 isTokenized true 
 lazy false 
 name "contents" 
 omitNorms false 
 omitTermFreqAndPositions false 
 storeOffsetWithTermVector false 
 storePositionWithTermVector false 
 storeTermVector false 
 tokenStream null 
 modCount 3 
 size 3 

接下来是将文档加入 IndexWriter
代码如下:

writer.adddocument(doc); 
-->IndexWriter.adddocument(document doc, Analyzer analyzer) 
 -->doFlush = docWriter.adddocument(doc, analyzer); 
 --> documentsWriter.updatedocument(document, Analyzer, Term)

IndexWriter 继而调用 documentsWriter.adddocument,其又调用
documentsWriter.updatedocument

之后将文档加入 documentsWriter

documentsWriter.updatedocument(document doc, Analyzer analyzer, Term delTerm) 
-->(1) documentsWriterThreadState state = getThreadState(doc, delTerm); 
104 
-->(2) DocWriter perDoc = state.consumer.processdocument(); 
-->(3) finishdocument(state, perDoc);

documentsWriter 对象主要包含以下几部分:
1、用于写索引文件
IndexWriter writer;
Directory directory;
Similarity similarity:分词器
String segment:当前的段名,每当 flush 的时候,将索引写入以此为名称的段。

IndexWriter.doFlushInternal() 
--> String segment = docWriter.getSegment();//return segment 
--> newSegment = new SegmentInfo(segment,……); 
--> docWriter.createCompoundFile(segment);//根据 segment 创建 cfs 文件。

String docStoreSegment:存储域所要写入的目标段。(在索引文件格式一文中已经详细描述)
int docStoreOffset:存储域在目标段中的偏移量。
int nextDocID:下一篇添加到此索引的文档 ID 号,对于同一个索引文件夹,此变量唯一,且同步访问。
DocConsumer consumer; 这是整个索引过程的核心,是 IndexChain 整个索引链的源头。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5574130.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存