ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

lucene核心代码分析报告14

2021-12-27 10:02:16  阅读:213  来源: 互联网

标签:14 删除 int 代码 lucene 文档 reader true any


2021SC@SDUSC

生成新的段信息对象

代码如下:

newSegment = new SegmentInfo(segment, flushedDocCount, directory, false, true, docStoreOffset, 
docStoreSegment, docStoreIsCompoundFile, docWriter.hasProx()); 
segmentInfos.add(newSegment);

准备删除文档

代码:

docWriter.pushDeletes(); 
 --> deletesFlushed.update(deletesInRAM); 

此处将 deletesInRAM 全部加到 deletesFlushed 中,并把 deletesInRAM 清空。原因上面已经阐明。

生成 cfs 段

代码:

docWriter.createCompoundFile(segment); 
newSegment.setUseCompoundFile(true); 
DocumentsWriter.createCompoundFile(String segment) { 
 CompoundFileWriter cfsWriter = new CompoundFileWriter(directory, segment + "." + 
IndexFileNames.COMPOUND_FILE_EXTENSION); 
 //将上述中记录的文档名全部加入 cfs 段的写对象。
 for (final String flushedFile : flushState.flushedFiles) 
 cfsWriter.addFile(flushedFile); 
 cfsWriter.close(); 
 } 

删除文档

代码:

applyDeletes(); 
boolean applyDeletes(SegmentInfos infos) { 
 if (!hasDeletes()) 
 return false; 
 final int infosEnd = infos.size(); 
 int docStart = 0; 
 boolean any = false; 
 for (int i = 0; i < infosEnd; i++) { 
 assert infos.info(i).dir == directory; 
 SegmentReader reader = writer.readerPool.get(infos.info(i), false); 
 try { 
 any |= applyDeletes(reader, docStart); 
 docStart += reader.maxDoc(); 
 } finally { 
 writer.readerPool.release(reader); 
 } 
 } 
 deletesFlushed.clear(); 
 return any; 
} 

Lucene 删除文档可以用 reader,也可以用 writer,但是归根结底还是用 reader 来删除的。

reader 的删除有以下三种方式:
按照词删除,删除所有包含此词的文档。
按照文档号删除。
按照查询对象删除,删除所有满足此查询的文档。
但是这三种方式归根结底还是按照文档号删除,也就是写.del 文件的过程。

private final synchronized boolean applyDeletes(IndexReader reader, int docIDStart) 
 throws CorruptIndexException, IOException { 
 final int docEnd = docIDStart + reader.maxDoc(); 
 boolean any = false; 
 //按照词删除,删除所有包৿此词的文档。
 TermDocs docs = reader.termDocs(); 
 try { 
 for (Entry<Term, BufferedDeletes.Num> entry: deletesFlushed.terms.entrySet()) { 
 Term term = entry.getKey(); 
 docs.seek(term); 
 int limit = entry.getValue().getNum(); 
 while (docs.next()) { 
 int docID = docs.doc(); 
 if (docIDStart+docID >= limit) 
 break; 
 reader.deleteDocument(docID); 
 any = true; 
 } 
 } 
 } finally { 
 docs.close(); 
 } 
 //按照文档号删除。
 for (Integer docIdInt : deletesFlushed.docIDs) { 
 int docID = docIdInt.intValue(); 
 if (docID >= docIDStart && docID < docEnd) { 
 reader.deleteDocument(docID-docIDStart); 
 any = true; 
 } 
 } 
 //按照查询对象删除,删除所有满足此查询的文档。
 IndexSearcher searcher = new IndexSearcher(reader); 
 for (Entry<Query, Integer> entry : deletesFlushed.queries.entrySet()) { 
 Query query = entry.getKey(); 
 int limit = entry.getValue().intValue(); 
 Weight weight = query.weight(searcher); 
 Scorer scorer = weight.scorer(reader, true, false); 
 if (scorer != null) { 
 while(true) { 
 int doc = scorer.nextDoc(); 
 if (((long) docIDStart) + doc >= limit) 
 break; 
 reader.deleteDocument(doc); 
 any = true; 
 } 
 } 
 } 
 searcher.close(); 
 return any; 
}

标签:14,删除,int,代码,lucene,文档,reader,true,any
来源: https://blog.csdn.net/Embers_Young/article/details/121598434

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有