lucene 源码分析

12 篇文章 0 订阅
    1. //org.apache.lucene.index => DocumentsWriter.java
    2.       /* Invert one occurrence of one field in the document */
    3.       public void invertField(Fieldable field, Analyzer analyzer, final int maxFieldLength) throws IOException, AbortException {
    4.         if (length>0)
    5.           position += analyzer.getPositionIncrementGap(fieldInfo.name);
    6.         if (!field.isTokenized()) {  // un-tokenized field 不用分成的field
    7.           String stringValue = field.stringValue();
    8.           final int valueLength = stringValue.length();
    9.           Token token = localToken;
    10.           token.clear();
    11.           char[] termBuffer = token.termBuffer();
    12.           if (termBuffer.length < valueLength)
    13.             termBuffer = token.resizeTermBuffer(valueLength);
    14.           stringValue.getChars(0, valueLength, termBuffer, 0);
    15.           token.setTermLength(valueLength);
    16.           token.setStartOffset(offset);
    17.           token.setEndOffset(offset + stringValue.length());
    18.           addPosition(token);
    19.           offset += stringValue.length();
    20.           length++;
    21.         } else {                                  // tokenized field 要分词的
    22.           final TokenStream stream;
    23.           final TokenStream streamValue = field.tokenStreamValue();
    24.           if (streamValue != null
    25.             stream = streamValue;
    26.           else {
    27.             // the field does not have a TokenStream,
    28.             // so we have to obtain one from the analyzer
    29.             final Reader reader;  // find or make Reader
    30.             final Reader readerValue = field.readerValue();
    31.             if (readerValue != null)
    32.               reader = readerValue;
    33.             else {
    34.               String stringValue = field.stringValue();
    35.               if (stringValue == null)
    36.                 throw new IllegalArgumentException("field must have either TokenStream, String or Reader value");
    37.               stringReader.init(stringValue);
    38.               reader = stringReader;
    39.             }
    40.           
    41.             // Tokenize field and add to postingTable
    42.             stream = analyzer.reusableTokenStream(fieldInfo.name, reader);
    43.           }
    44.           // reset the TokenStream to the first token
    45.           stream.reset();
    46.           try {
    47.             offsetEnd = offset-1;
    48.             for(;;) {
    49.               Token token = stream.next(localToken);  //在这里分词
    50.               if (token == nullbreak;
    51.               position += (token.getPositionIncrement() - 1);
    52.               addPosition(token);
    53.               if (++length >= maxFieldLength) {
    54.                 if (infoStream != null)
    55.                   infoStream.println("maxFieldLength " +maxFieldLength+ " reached for field " + fieldInfo.name + ", ignoring following tokens");
    56.                 break;
    57.               }
    58.             }
    59.             offset = offsetEnd+1;
    60.           } finally {
    61.             stream.close();
    62.           }
    63.         }
    64.         boost *= field.getBoost();
    65.       }
    //DirectoryIndexReader.java
  1.   static DirectoryIndexReader open(final Directory directory, final boolean closeDirectory, final IndexDeletionPolicy deletionPolicy) throws CorruptIndexException, IOException {
  2.     return (DirectoryIndexReader) new SegmentInfos.FindSegmentsFile(directory) { //具体化FindSegmentsFile这个抽象类,它是SegmentInfos的子类
  3.       protected Object doBody(String segmentFileName) throws CorruptIndexException, IOException {
  4.         SegmentInfos infos = new SegmentInfos();
  5.         infos.read(directory, segmentFileName);
  6.         DirectoryIndexReader reader;
  7.         if (infos.size() == 1) {          // index is optimized
  8.           reader = SegmentReader.get(infos, infos.info(0), closeDirectory);
  9.         } else {
  10.           reader = new MultiSegmentReader(directory, infos, closeDirectory);
  11.         }
  12.         reader.setDeletionPolicy(deletionPolicy);
  13.         return reader;    
  14.       }
  15.     }.run();//具体化后就new了个对象,然后立即调用run(), run()里面会调用这个具体化了的doBody().
  16.   }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值