??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲自拍偷拍网址,fc2人成共享视频在线观看,99久久精品免费看国产小宝寻花http://www.aygfsteel.com/csusky/category/29489.htmlzh-cnFri, 30 May 2008 06:55:50 GMTFri, 30 May 2008 06:55:50 GMT60Lucene的切?analysis?/title><link>http://www.aygfsteel.com/csusky/archive/2008/05/30/204087.html</link><dc:creator>晓宇</dc:creator><author>晓宇</author><pubDate>Fri, 30 May 2008 06:47:00 GMT</pubDate><guid>http://www.aygfsteel.com/csusky/archive/2008/05/30/204087.html</guid><wfw:comment>http://www.aygfsteel.com/csusky/comments/204087.html</wfw:comment><comments>http://www.aygfsteel.com/csusky/archive/2008/05/30/204087.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/csusky/comments/commentRss/204087.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/csusky/services/trackbacks/204087.html</trackback:ping><description><![CDATA[<p style="font-size: 10pt">在搜索引擎中Q切词语是一个重要的部分Q其中包括专有名词的提取、词的分剌Ӏ词的格式化{等?br /> TokenStream cd乎是所有这些类的基c?br /> 有两个需要被子类实现的方法Token next() ?nbsp;close()<br /> 首先来看analysis包,q个包主要是提供一些简单的词汇化处?br /> ?span style="color: #339966">Tokenizerl尾的类</span>是将要处理的字符串进行分割成Token,而根据分割的依据的又产生了以下几个Tokenizerc?br /> 首先TokenizercL所?span style="color: #000000"><span style="color: #008080">以Tokenizerl尾的类</span>的基<span style="color: #000000">c?br /> 然后是CharTokenizerQ所有的?span style="color: #339966">Tokenizerl尾的类都是从这个类l承?br /> <span style="color: #000000">q个cM有一个抽象方?br /> <span style="color: #ff0000">  protected abstract boolean isTokenChar(char c);</span><br /> 另外一个需要被子类覆写的方?br />  <span style="color: #ff0000"> protected char normalize(char c) {}Q?/span><br /> 是对单个字符q行处理的方法譬如说英文字母全部{化ؓ写<br /> <br /> q有一个变?br /> <span style="color: #ff0000">protected Reader input;<br /> </span><span style="color: #0000ff">q个d器是q些cL处理的数据的   数据?br /> 输入一个Reader Q生一个Token?/span><br /> <br /> q个Ҏ(gu)是是否进行切分的依据Q依ơ读取char,然后用这个方法对每个charq行,如果q回false则将预先存储?br /> 词汇~冲Z的char数组作ؓ一个Tokenq回<br /> <span style="color: #ff0000">LetterTokenizer Q?/span><br />     <span style="color: #ff99cc"> <span style="color: #333399"> protected boolean isTokenChar(char c) {<br />               return Character.isLetter(c);<br />       }<br /> </span></span><span style="color: #ff0000">WhitespaceTokenizerQ?/span><br />      <span style="color: #333399"> protected boolean isTokenChar(char c) {<br />               return !Character.isWhitespace(c);<br />       } <br /> </span><span style="color: #ff0000">LowerCaseTokenizer extends LetterTokenizerQ?/span><br /> <span style="color: #333399">protected char normalize(char c) {<br />       return Character.toLowerCase(c);<br />    }</span><br />    在构造函C调用super(in);q行?nbsp;LetterTokenizer同样的操作,但是在词汇化之前所有的词都转化为小写了<br />  <br /> 然后是以Filterl尾的类Q这个类主要是对已l词汇化的Token进行进一步的处理<br />  输入是Token?, 输出仍然是Token?br /> TokenFilter extends TokenStream  是所有这些类的父c?br /> protected TokenStream input;<br /> 在TokenFilter 中有一个TokenStream 变量Q是Filtercȝ处理的数据源Q而Filtercȝ又是l承了TokenStream cȝ<br /> 有一个public final Token next()Ҏ(gu),q个Ҏ(gu)以TokenStream.next()产生的Token?为处理源Q生的仍然是Token?br /> 只不q中间有一些处理的q程<br /> <span style="color: #ff0000">LowerCaseFilterQ将所有的Token的转化为小?br /> </span>    <span style="color: #333399"> t.termText = t.termText.toLowerCase();</span><br /> <span style="color: #ff0000">StopFilterQ过滤掉一些停止词Q这些停止词由构造函数指?/span><br />  <span style="color: #333399">    for (Token token = input.next(); token != null; token = input.next())<br />       if (!stopWords.contains(token.termText))<br />         return token;<br /> </span><br /> <br /> <span style="color: #800080">比较一下Tokenizercȝ和FiltercȝQ可以知?br /> Tokenizercȝ主要是对输入的Reader,实际上是字符按照一定的规则q行分割Q生出Token?br /> 其输入是字符串的ReaderŞ式,输出是Token?br /> <br /> Filtercȝ主要是对输入的Token进行更q一步的处理Q如去除停止词,转化为小?br /> 主要Z些格式化操作?br /> ׃Filtercȝ的输入输出相同,所以可以嵌套几个不同的Filterc,以达到预期的处理目的?br /> 前一个Filtercȝ输出作ؓ后一个Filtercȝ输入<br /> 而Tokenizercȝ׃输入输出不同Q所以不能嵌?br /> <br /> <br /> </span><br /> <br /> <br /> <br /> <br /> </span></span></span></span></p> <img src ="http://www.aygfsteel.com/csusky/aggbug/204087.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/csusky/" target="_blank">晓宇</a> 2008-05-30 14:47 <a href="http://www.aygfsteel.com/csusky/archive/2008/05/30/204087.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于IndexWriter中的3个性能参数http://www.aygfsteel.com/csusky/archive/2008/05/15/200706.html晓宇晓宇Thu, 15 May 2008 11:27:00 GMThttp://www.aygfsteel.com/csusky/archive/2008/05/15/200706.htmlhttp://www.aygfsteel.com/csusky/comments/200706.htmlhttp://www.aygfsteel.com/csusky/archive/2008/05/15/200706.html#Feedback0http://www.aygfsteel.com/csusky/comments/commentRss/200706.htmlhttp://www.aygfsteel.com/csusky/services/trackbacks/200706.html?font size="2">IndexWriter中有3个重要的性能参数
mergeFactor           默认?0
minMergeDocs      默认?0
maxMergeDocs     默认为Integer.maxValue

maxMergeDocs     一个段中所能包含的最大的doc敎ͼ辑ֈq个数目即不再将D进行合q?一般不改变q个?br /> minMergeDocs      是指在RAMDirectory中保存的Doc的个敎ͼ辑ֈminMergeDocs 个即要合q到盘上去Q在盘上新Z个段Q?br /> mergeFactor           合ƈ因子Q是控制盘上的D늚合ƈ的,每次在硬盘上新徏一个段之后x?br />                                  targetMergeDocs*=mergeFactorQ一开?font size="2">targetMergeDocs=minMergeDocsQ?nbsp;如果盘上的doc数目大于{于                            targetMergeDocs则将盘上最后徏立的mergeFactor个段q行合ƈ成一个段

拉K认的参数举例Q?br /> 如果盘上面已经?个段  每个D分别存储了10个Document,共(90个DOCQ,q时候如果程序再向硬盘合q一个新的段Q含10个DOCQ,合ƈ完之?font size="2">targetMergeDocs=10*10  E序查已l合q的最后(按照创徏的时间先后顺序)mergeFactor个段的document的d100是否大于{于targetMergeDocsQ这里是100Q刚好满求)于是E序又将盘上面的后10个段合ƈZ个新的段?br />
另外一个例子:
doc数目            D|?br />   1000---------------9?br />   100-----------------9?br />   10   ----------------9?br /> q时如果再象盘中新Z个新的包含了10个doc的段
    doc数目            D|?br />   (1) 1000----------------9?br />
  (2)  100-----------------9?br />
  (3)   10  ----------------9?br />                                      
  (4)    10 ----------------1?br /> q时?3)(4)首先合ƈ成一个新的段(3-4)包含100个doc
 然后(2)(3-4)和ƈ成一个新D(2-3-4Q包?000个doc
然后(1)(2-3-4)合ƈ成一个新的段  包含10000个doc
最后合q成一个段


private final void maybeMergeSegments() throws IOException {
    
long targetMergeDocs = minMergeDocs;
    
while (targetMergeDocs <= maxMergeDocs) {
      
// find segments smaller than current target size
      int minSegment = segmentInfos.size();
      
int mergeDocs = 0;
      
while (--minSegment >= 0{
        SegmentInfo si 
= segmentInfos.info(minSegment);
        
if (si.docCount >= targetMergeDocs)
          
break;
        mergeDocs 
+= si.docCount;
      }


      
if (mergeDocs >= targetMergeDocs)          // found a merge to do
        mergeSegments(minSegment+1);
      
else
        
break;

      targetMergeDocs 
*= mergeFactor;        // increase target size
      System.out.println("- -- - -targetMergeDocs:"+targetMergeDocs);
      
try {Thread.sleep(5000);} catch(Exception e) {};
    }

  }


晓宇 2008-05-15 19:27 发表评论
]]>
Lucene索引文g的格?/title><link>http://www.aygfsteel.com/csusky/archive/2008/04/21/194564.html</link><dc:creator>晓宇</dc:creator><author>晓宇</author><pubDate>Mon, 21 Apr 2008 09:52:00 GMT</pubDate><guid>http://www.aygfsteel.com/csusky/archive/2008/04/21/194564.html</guid><wfw:comment>http://www.aygfsteel.com/csusky/comments/194564.html</wfw:comment><comments>http://www.aygfsteel.com/csusky/archive/2008/04/21/194564.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/csusky/comments/commentRss/194564.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/csusky/services/trackbacks/194564.html</trackback:ping><description><![CDATA[<p><span style="font-size: 10pt"><span style="color: #ccffcc"><span style="color: #ccffcc"><span style="color: #99ccff"><span style="color: #3366ff">segments文g的格式: Q段的信息)<br /> int:  =-1    查看文g是否是Lucene合法的文件格?br /> long:        版本P每更Cơ该文g会版本号?<br /> int:         用来命名新段<br /> int:         D늚数目<br /> String + int D늚信息 String是段的名U?nbsp; int是段中所含的doc数目<br /> String + int 同上</span></span></span></span></span></p> <p><br /> <span style="font-size: 10pt"><span style="color: #99cc00"><span style="color: #ccffcc"><span style="color: #ccffcc"><span style="color: #99ccff"><span style="color: #3366ff">.fnm的文件格式:   QField的信息)<br /> int:               Field的个敎ͼ最ؓ1Q最有一个Field("",false)Q在初始化的时候写?暂时不知道原?; 名称为空字符Ԍ未烦引,        ?nbsp;              ?nbsp;          量化。readVInt()d<br /> String: byte      String?nbsp;Field的名U?nbsp; byte指示该Field 是否被烦引,是否向量?Q值有Q?1Q?0Q?1Q第一?代表被烦引,W二个代表被向量?br /> String: byte Field 同上</span></span></span></span></span></span>      </p> <p><span style="color: #3366ff"> <br /> </span></p> <p><span style="font-size: 10pt"><span style="color: #3366ff">.fdx的文件格式:主要是提供对.fdt中存储的document的随卌?br /> long :       W一个document?fdt文g中的位置<br /> long:        W二个document?fdt文g中的位置</span></span><span style="color: #3366ff"> <p><span style="color: #3366ff"><br /> </span></p> </span></p> <p><span style="font-size: 10pt"><span style="color: #3366ff">.fdt的文件格式:  .fdt文g存储了一pddocument的信?br /> VInt:        该document中的isStored属性ؓtrue的域的个?br /> (VInt:)      如果该field的isStored属性ؓtrue则得到该field的fieldNumberQ暂时不知道q个fieldNumber是怎么产生的,有什么用Q初步估计是按照field创徏的顺序生的Q每ơ再上一个field的fieldNumber基础上加1?br /> byte:        如果该field的isTokenized属性ؓtrue写入1否则写入false?br /> String:      该field的stringValue()倹{?br /> 一个documentl束Q下面的数据会开始一个新的documentQ每个新的document的开始点的文件位|都会在.fdx中有记蝲Q便于随卌?/span></span></p> <p> </p> <img src ="http://www.aygfsteel.com/csusky/aggbug/194564.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/csusky/" target="_blank">晓宇</a> 2008-04-21 17:52 <a href="http://www.aygfsteel.com/csusky/archive/2008/04/21/194564.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>org.apache.lucene.index.SegmentInfoshttp://www.aygfsteel.com/csusky/archive/2008/04/18/194072.html晓宇晓宇Fri, 18 Apr 2008 09:02:00 GMThttp://www.aygfsteel.com/csusky/archive/2008/04/18/194072.htmlhttp://www.aygfsteel.com/csusky/comments/194072.htmlhttp://www.aygfsteel.com/csusky/archive/2008/04/18/194072.html#Feedback0http://www.aygfsteel.com/csusky/comments/commentRss/194072.htmlhttp://www.aygfsteel.com/csusky/services/trackbacks/194072.htmlfinal class SegmentInfos extends Vector
可以看出该类实际上是一个Vector   以及装了对该Vevtor的一些操?br /> 实际上封装的是对segments文g的一些读写操?br /> 先来看下segments文g的格?br />
segments文g的格式:
int:  =-1         文g是否是Lucene合法的文件格式正常情况下?-1
long:             版本P每更Cơ该文g会版本号?
int:                用来命名新段
int:                D늚数目
String + int  D늚信息 String是段的名U?nbsp; int是段中所含的doc数目
String + int  同上

所以用Lucene的APIQ我们可以简单的打印出其segments的所有信?br />

try {
   //DataInputStream fis = new DataInputStream(new FileInputStream("C:\\sf\\snow\\segments"));
   FSDirectory dir=FSDirectory.getDirectory("C:/sf/snow", false);
    InputStream input = dir.openFile("segments");
   System.out.println("Format:"+input.readInt());             //得到文g标志Q是否ؓ正常的segments文g
   System.out.println("version:"+input.readLong());        //得到版本?br />    System.out.println("name:"+input.readInt());                //得到用来重命名新D늚intQ暂时不知道有什么用
   int n=input.readInt();                                                          //D늚数目
   System.out.println("SegmentNum:"+n);                          
   for(int i=0;i<n;i++) {                                                           //用@环打印出所有段的信?名称和长?br />     System.out.println("segment "+i+" - name:"+input.readString()+" num:"+input.readInt());
   }
  } catch (Exception e) {

  }
当然,该类提供了更为复杂的讉K和更新segments文g的方?br />  final void read(Directory directory)    所有的D信息保存在本vector?br /> final void write(Directory directory)    跟新该segment文g的内容,主要是ؓ了添加段Q?br /> 主要是更?版本?D늚数目Q跟新完q些后即可往segment文g后添加新D늚信息?br />



晓宇 2008-04-18 17:02 发表评论
]]>
org.apache.lucene.index.SegmentInfohttp://www.aygfsteel.com/csusky/archive/2008/04/18/194062.html晓宇晓宇Fri, 18 Apr 2008 08:45:00 GMThttp://www.aygfsteel.com/csusky/archive/2008/04/18/194062.htmlhttp://www.aygfsteel.com/csusky/comments/194062.htmlhttp://www.aygfsteel.com/csusky/archive/2008/04/18/194062.html#Feedback0http://www.aygfsteel.com/csusky/comments/commentRss/194062.htmlhttp://www.aygfsteel.com/csusky/services/trackbacks/194062.htmlsegment(D?的信?br /> 该类比较单,贴出其全部代?/p>

import org.apache.lucene.store.Directory;

final class SegmentInfo {
  public String name;        //在烦引目录中唯一的名U?nbsp;
  public int docCount;      // 该段中doc的数?br />   public Directory dir;      // 该段所存在的Dirrectory

  public SegmentInfo(String name, int docCount, Directory dir) {
    this.name = name;
    this.docCount = docCount;
    this.dir = dir;
  }
}



晓宇 2008-04-18 16:45 发表评论
]]>
org.apache.lucene.store.RAMInputStreamhttp://www.aygfsteel.com/csusky/archive/2008/04/18/193996.html晓宇晓宇Fri, 18 Apr 2008 03:45:00 GMThttp://www.aygfsteel.com/csusky/archive/2008/04/18/193996.htmlhttp://www.aygfsteel.com/csusky/comments/193996.htmlhttp://www.aygfsteel.com/csusky/archive/2008/04/18/193996.html#Feedback0http://www.aygfsteel.com/csusky/comments/commentRss/193996.htmlhttp://www.aygfsteel.com/csusky/services/trackbacks/193996.html该类是从RAMFile中读数据用的
最重要的一个方法:
该方法存在着从RAMFile的多个byte[1024]中读取数据的情况Q所以应该在循环中进行处?br />
 public void readInternal(byte[] dest, int destOffset, int len) {
    int remainder = len;
    int start = pointer;
    while (remainder != 0) {
      int bufferNumber = start/BUFFER_SIZE; //  buffer的序?br />       int bufferOffset = start%BUFFER_SIZE; //    buffer偏移?br />       int bytesInBuffer = BUFFER_SIZE - bufferOffset;// 在当前buffer中剩下的字节?br />       //如果~冲Z剩余的字节大于lenQ则dlen长度的字节,如果不够则读出剩余的字节?
      // bytesToCopy表示实际d的字节数
      int bytesToCopy = bytesInBuffer >= remainder ? remainder : bytesInBuffer;
      byte[] buffer = (byte[])file.buffers.elementAt(bufferNumber);
      System.arraycopy(buffer, bufferOffset, dest, destOffset, bytesToCopy);
      destOffset += bytesToCopy;       //增加已经复制的byte数据长度 ?nbsp; dest中的偏移?br />       start += bytesToCopy;                 //RAMFile文g指针Q用来确定bufferNumber 和bytesInBuffer   相当于内存中的分?br />       remainder -= bytesToCopy;       //剩余的还未复制的字节?br />     }
    pointer += len;//文g指针位置
  }



晓宇 2008-04-18 11:45 发表评论
]]>
org.apache.lucene.store.RAMOutputStreamhttp://www.aygfsteel.com/csusky/archive/2008/04/18/193988.html晓宇晓宇Fri, 18 Apr 2008 03:38:00 GMThttp://www.aygfsteel.com/csusky/archive/2008/04/18/193988.htmlhttp://www.aygfsteel.com/csusky/comments/193988.htmlhttp://www.aygfsteel.com/csusky/archive/2008/04/18/193988.html#Feedback0http://www.aygfsteel.com/csusky/comments/commentRss/193988.htmlhttp://www.aygfsteel.com/csusky/services/trackbacks/193988.htmlq是OutputStream的一个子c,其输备是内存Q准来说是RAMFileQ即数据写入到RAMFile的Vector中去?br /> 该类有一个最重要的方法,现在把它整个贴出?/p>

public void flushBuffer(byte[] src, int len) {
    int bufferNumber = pointer/BUFFER_SIZE;   //buffer序列Q即当前所写Buffer在RAMFile中的Vector中的序列?br />     int bufferOffset = pointer%BUFFER_SIZE;   //偏移量,卛_前所写字节在当前Buffer中的偏移量?br />     int bytesInBuffer = BUFFER_SIZE - bufferOffset; //当前Buffer的剩余可写字节数
   //bytesToCopy是实际写入的字节敎ͼ如果当前Bufer的剩余字节数大于需要写的字节的L则写入所有字?br />    //否则Q将当前Buffer写满卛_Q剩余的字节写入下一个Buffer
    int bytesToCopy = bytesInBuffer >= len ? len : bytesInBuffer;

    if (bufferNumber == file.buffers.size())
      file.buffers.addElement(new byte[BUFFER_SIZE]); //在RAMFile中添加新的byte[1024]元素

    byte[] buffer = (byte[])file.buffers.elementAt(bufferNumber);
    System.arraycopy(src, 0, buffer, bufferOffset, bytesToCopy);

    if (bytesToCopy < len) {     // not all in one buffer,
      int srcOffset = bytesToCopy;
      bytesToCopy = len - bytesToCopy;    // remaining bytes 剩余的未写入的字节数
      bufferNumber++;                         //buffer数增?
      if (bufferNumber == file.buffers.size()) 
        file.buffers.addElement(new byte[BUFFER_SIZE]);
      buffer = (byte[])file.buffers.elementAt(bufferNumber); //剩余字节写入下一个Buffer
      System.arraycopy(src, srcOffset, buffer, 0, bytesToCopy);
    }
    pointer += len;
    if (pointer > file.length)
      file.length = pointer;        //UM文g指针          在原有的基础上加上实际写入的字节L

    file.lastModified = System.currentTimeMillis(); //修改文g的最后修Ҏ(gu)间ؓ当前旉
  }

从指定的字节数组复制指定长度的字节到RAMFile中去。由于RAMFile中Vector的元素是byte[1024]所以可能存在做一ơ该操作
要操作两个Vector元素的情c即先将当前byte[1024]数组填满Q再新徏一个元素装载剩余的字节?br />
另外q有一个writeTo(OutputStream out)Ҏ(gu)Q将RAMFile中的数据输出到另一个输出流





晓宇 2008-04-18 11:38 发表评论
]]>
org.apache.lucene.store.RAMFilehttp://www.aygfsteel.com/csusky/archive/2008/04/18/193982.html晓宇晓宇Fri, 18 Apr 2008 03:23:00 GMThttp://www.aygfsteel.com/csusky/archive/2008/04/18/193982.htmlhttp://www.aygfsteel.com/csusky/comments/193982.htmlhttp://www.aygfsteel.com/csusky/archive/2008/04/18/193982.html#Feedback0http://www.aygfsteel.com/csusky/comments/commentRss/193982.htmlhttp://www.aygfsteel.com/csusky/services/trackbacks/193982.htmlq个cL较简?br /> import java.util.Vector;
class RAMFile {
  Vector buffers = new Vector();
  long length;
  long lastModified = System.currentTimeMillis();
}

可以理解Z个存储在内存中的文gQbuffers是存储数据的容器Qlength是容器中数据的ȝ字节?br /> lastModified 是最后修Ҏ(gu)间?br />
在实际用过E中容器buffers存放的对象是一个byte[1024]数组?br />



晓宇 2008-04-18 11:23 发表评论
]]>
org.apache.lucene.store.OutputStreamhttp://www.aygfsteel.com/csusky/archive/2008/04/16/193574.html晓宇晓宇Wed, 16 Apr 2008 13:24:00 GMThttp://www.aygfsteel.com/csusky/archive/2008/04/16/193574.htmlhttp://www.aygfsteel.com/csusky/comments/193574.htmlhttp://www.aygfsteel.com/csusky/archive/2008/04/16/193574.html#Feedback0http://www.aygfsteel.com/csusky/comments/commentRss/193574.htmlhttp://www.aygfsteel.com/csusky/services/trackbacks/193574.htmlOutputStream
q是一个Abstractc,是Lucene自己的一个文件输出流的基c?br /> BUFFER_SIZE = 1024  ~冲?大小?1024bit
bufferStart = 0 文g位置指针
bufferPosition = 0 内存~冲区指?br />
 public final void writeByte(byte b) throws IOException {
    if (bufferPosition >= BUFFER_SIZE)
      flush();
    buffer[bufferPosition++] = b;
  }
几乎所有的写入函数都要调用q个函数Q如果缓冲区的当前容量已l等于他的最大容量,则将~冲Z的数据写入文件?br />
public final void writeBytes(byte[] b, int length) throws IOException
扚w写byteq入内存~冲

public final void writeInt(int i) throws IOException
写入整Ş数据

public final void writeLong(long i) throws IOException
写入长整型数据,即结合移位运调用两ơwriteInt(int i)

另外Q最值得注意的是在该cM有两个最Ҏ(gu)的函?br /> writeVIntQint iQ?/   writeVLong(long i),
先说
writeVInt(int  i )   {
 while ((i & ~0x7F) != 0) {                               
      writeByte((byte)((i & 0x7f) | 0x80));
      i >>>= 7;
    }
    writeByte((byte)i);
}
~0x7F==~(0111 1111)==(1000 0000)==0x80
((i & ~0x7F) != 0) q一句判断i是否大于0x80Q如果不是则说明该int只有一个字节的有效数据Q其他字节都?Q直接{化ؓByte写入?br /> 如果大于0x80?br /> (i & 0x7f) | 0x80
i&0x7f 只对?位进行处理,|0x80第8位置1Q与前面?个bit构成一个字节,|?的原因是说明该字节ƈ不是一个完整的整Ş敎ͼ需要与其他的字节合h才能构成一个整形数字?br /> q个法相当于将一?2bit的整形数字按照每7位编码成一个字节进行存储,按照整形数的大存?-5个字节?/span>
writeVLong(long i)Ҏ(gu)大致与其相同?br />
final void writeChars(String s, int start, int length)
字W串转化成UTF-8~码的格式进行存储?br /> 附:

UNICODE?UTF-8~码
U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx

可见对于?0x00-0x7F范围内的UNICODE|最大有效数位:7位)Q将会编码成单字节的Q会大大节约存储I间?br /> 对于?nbsp;          0x80-0x7FF范围内的UNICODEQ最大有效数位:11位)Q会~码成双字节的。先存储原字节低5位的CQ且最高位和次高位都置1Q再ơ高位置0QwriteByte((byte)(0xC0 | (code >> 6)));Q。然后存储后6位的字节Q将前两位置10QwriteByte((byte)(0x80 | (code & 0x3F)));Q?br /> 对于其他的UNICODE值则
writeByte((byte)(0xE0 | (code >>> 12)));               4?br />  writeByte((byte)(0x80 | ((code >> 6) & 0x3F)));   5?br />  writeByte((byte)(0x80 | (code & 0x3F)));            3- 5?br />
final void writeString(String s) throws IOException
该函数首先用s.length()判断该Stringd有多个字符
然后首先调用writeVInt写入q个字符长度
再调用writeChars(s,s.length())写入字符


在inputStream中的readString()Ҏ(gu)则与其相反,首先用readVInt()Ҏ(gu)d字符长度len 然后dlen长度的字W?br />
protected final void flush() throws IOException
该方法调用另外一个方法flushBuffer缓冲区中的数据输出Q然后清I缓冲区Q?br />
abstract void flushBuffer(byte[] b, int len) throws IOException
可见flushBufferҎ(gu)是abstract的,即需要其子类对该Ҏ(gu)q行覆写Q以定位该输出流的输出方式?br />
final long getFilePointer() throws IOException
得到文g指针的位|,卛_到输出流已经输出的字节数?br />
public void seek(long pos) throws IOException
输出~冲区的内容Q然后将文g指针定位到l(f)ong所指示的文件位|?br />
abstract long length() throws IOException
q回文g中已有的字节数。需要子cd现?br />


















晓宇 2008-04-16 21:24 发表评论
]]>
org.apache.lucene.store.FSDirectoryhttp://www.aygfsteel.com/csusky/archive/2008/04/10/191977.html晓宇晓宇Thu, 10 Apr 2008 13:35:00 GMThttp://www.aygfsteel.com/csusky/archive/2008/04/10/191977.htmlhttp://www.aygfsteel.com/csusky/comments/191977.htmlhttp://www.aygfsteel.com/csusky/archive/2008/04/10/191977.html#Feedback0http://www.aygfsteel.com/csusky/comments/commentRss/191977.htmlhttp://www.aygfsteel.com/csusky/services/trackbacks/191977.htmlFSDirectoryl承了abstractcDirectory
在该cM既有该类的一些初始化操作Q又有对FSDirectory对象本n的一些操作,q是Z么把其构造函数设|ؓU有的一部分原因

static final Hashtable DIRECTORIES = new Hashtable();
每新Z个FSDirectory都会其加入到该Hashtable中来。名U是FSDirectory对应的File   值是该FSDirectory?br /> 注意Qfinal对象q是不可更改的

static final String LOCK_DIR =
    System.getProperty("org.apache.lucene.lockdir",
      System.getProperty("java.io.tmpdir"));
首先看用h否注册了"org.apache.lucene.lockdir"属性,如果没有则用JAVA虚拟机固有的"java.io.tmpdir"属?br /> q个属性是一个\径,代表lucene的锁文g锁放的位|?br />
static final boolean DISABLE_LOCKS =
      Boolean.getBoolean("disableLuceneLocks") || Constants.JAVA_1_1;
如果用户注册?disableLuceneLocks"属性且为falseQ?span style="color: red">或?/span>JAVA的版本是1.1则无法用锁?br />
static FSDirectory getDirectory(String path, boolean create)
static FSDirectory getDirectory(File file, boolean create)
从得C个指定\径或者文件的FSDirectory如果在则取出Q如果不存在则用其私有的构造函数构造一?br /> 该类q有3个非static的类变量
  private File directory = null;      索引目录
  private int refCount;                   锁目?br />   private File lockDir;                    索引目录数目
实际上,初始化一个FSDirectory只需要初始化q?个变量即?br /> 如果create的gؓtrue 则:如果索引目录是已l存在的目录Q则会遍历该目录然后删除每一个文Ӟ如果锁目录是已存在的也会用listq回所有的文g然后调用file.delete() 删除?如果目录不存在则创徏一个新的?br />
注意Qlist()Ҏ(gu)   会先用文件名q行排序然后q回Qa.txt会比b.txt先返回)    且deleteҎ(gu)删除文gҎ(gu)Q只能删除空文g夏V如果失败则跛_E序Q不会删除在该文件夹之后q回的文件。(如果有aa.txt , ab/b.txt , b.txt Q?则删除时候由于a文g多wI删除失败,则b.txt׃前面删除p|跛_E序Q也不会被删?但是aa.txt被正常删除)

private FSDirectory(File path, boolean create) throws IOException
U有的构造函?br />
private synchronized void create() throws IOException
创徏新的directory /lockDir目录Q当目录已存在时xI目录Q不存在卛_建新的目录?br />
final String[] list() throws IOException
以字W串文g名的形式q回索引目录的所有文?br />
final boolean fileExists(String name) throws IOException
在烦引目录是否存在指定文件名的文?br />
final long fileModified(String name) throws IOException
static final long fileModified(File directory, String name)
q回该文件的最后修Ҏ(gu)_directory参数为相对\径,W一个函数的相对路径为烦引目?br />
void touchFile(String name) throws IOException
该文g的最后修Ҏ(gu)间设|ؓ当前旉

final long fileLength(String name) throws IOException
q回该文件的长度

final void deleteFile(String name) throws IOException
删除该文?br />
final synchronized void renameFile(String from, String to) throws IOException
重命名该文g
该方法会首先新的文件名命名的文件是否已l存在如果存在即删除该文Ӟ然后再将文g重新命名为新的文件名?br /> doug cutting在该Ҏ(gu)的注释上写到Q?br /> 1.删除操作和重命名的操作不是原子的?br /> 2.重命名操作在有些虚拟Z面不能正的工作Q如果重命名p|则会采用手动copy的方法。用输入输出流旧的文件的内容写入到新的文件中去,然后删除旧的文g?br /> 注意Q该Ҏ(gu)必须是同步的?br />
final OutputStream createFile(String name) throws IOException
用指定的文g名创Z个新的可写的I文?nbsp; 实际上返回的是FSOutputStream,注意q里的OutputStreamq不是java的基cR而是doug cutting自己写的一个文仉卌问类。同理FSInputStream和InputStream也是Lucene自己的类?br />
final InputStream openFile(String name) throws IOException
从一个存在的文g打开一个输入流

getLockPrefix()
在FSDirectory中还?br />  private static MessageDigest DIGESTER;q个静态变量是提供加密功能?br /> DIGESTER=MessageDigest.getInstance("MD5"),-----MD5加密法
或者可以DIGESTER=MessageDigest.getInstance("SHA"),-----SHA加密法
用于寚w目录?nbsp;  文g名的加密
用法如下Q?br /> digest = DIGESTER.digest(dirName.getBytes());  dirName是需要被加密的字W串Q这里是索引文g的目录名Q?br /> 在FSContext中,其应用在 getLockPrefix() 该方法是为某个烦引目录创建其对应的锁目录文g名?br /> 首先q回l过加密后的byte[] 数组digestQ然后将digest按照?个bit转化Z?6q制的字W,存进一个StringBuffer?br /> 其{化类gBase64~码方式Q不q要单得多?br />
Ҏ(gu)
Lockl  makeLockQString nameQ?br /> 是从Directory中扩展而来的,该方法返回一个Lock对象Q该对象会在介l完Lucene的输入输出流之后介绍?br /> 该方法比较简单,首先是调用了getLockPrefix() Ҏ(gu)Q返回文仉的部分对象名Q然后在该名U后面加上锁的特征名
譬如说读写锁 事务?
其名U类g下:
lucene-12c90c2c381bc7acbc4846b4ce97593b-write.lock
lucene-12c90c2c381bc7acbc4846b4ce97593b-commit.lock
q两U锁机制会在后面介l?br /> 最后通过一个匿名的内部c返回一个经q重载的Lock对象Q该内部cM的方法有锁的创徏Q得刎ͼ释放Q以及检,另外q有一个toString()Ҏ(gu)q回锁的名称?br />


在FSDirectorycM有OutputStream和InputStream的实现类Q这两个虚类只是定义了一些操作,q没有定义输入或者输出的讑֤?br /> Lucene在输入输出的设计上,会由子cd义输入输出的讑֤?br /> FSOutputStream
在FSOutputStream中有一?RandomAccess File=new RandomAccessFile(path, "rw");
在对该输出流的操作将用调用该file的相应方法实?br /> 最重要?br />   public final void flushBuffer(byte[] b, int size) throws IOException {
    file.write(b, 0, size);
  }
flushBuffer的调用将会将byte中的0--size范围的数据写入到文gpath中去?br />

FSInputStream
最重要?br /> protected final void readInternal(byte[] b, int offset, int len)
       throws IOException {
    synchronized (file) {
      long position = getFilePointer();     //得到该当前文件指?br />       if (position != file.position) {
        file.seek(position);
        file.position = position;
      }
      int total = 0;
      do {

   //从文件中d指定长度的字节到字节数组
   // 在其基类InputStream中的refill()Ҏ(gu)  会调用  readInternal(buffer, 0, bufferLength);首先从文件中d字节到缓冲数l?br />   //  在InputStream中每ơ读取操作都会调用readInternalҎ(gu)Q或者通过refill()Ҏ(gu)间接调用该方法?br />         int i = file.read(b, offset+total, len-total);       //文件中的数据读到缓冲区
        if (i == -1)
          throw new IOException("read past EOF");
        file.position += i;
        total += i;
      } while (total < len);
    }
  }























晓宇 2008-04-10 21:35 发表评论
]]>
org.apache.lucene.document.DateFieldhttp://www.aygfsteel.com/csusky/archive/2008/04/10/191963.html晓宇晓宇Thu, 10 Apr 2008 11:26:00 GMThttp://www.aygfsteel.com/csusky/archive/2008/04/10/191963.htmlhttp://www.aygfsteel.com/csusky/comments/191963.htmlhttp://www.aygfsteel.com/csusky/archive/2008/04/10/191963.html#Feedback0http://www.aygfsteel.com/csusky/comments/commentRss/191963.htmlhttp://www.aygfsteel.com/csusky/services/trackbacks/191963.html该类提供了日期和字符串之间的怺转化Q实际上?long型和String型的怺转化Q{化时用到了一个不常用?br /> Long.toString(long,int);Ҏ(gu)。是按指定的方式对long型进行{?br /> W一个参数是要{化的long,W二个参数是转化时候的基数Q如果基数是10q当于Ҏ(gu)Long.toString(long);
q里使用的参数是最大|?6== 10个数?26个英文字母。这栯{化出来的字符串长度比较短Q占用比较少的空_
另外Q在转化Ӟl一了{化后的字W串长度Q如果不?位(日期的long转化后最高ؓ9位,1970之后的日期可正确转换Q,
l一长度后的字符串可以通过比较字符串来比较日期的大?br />

日期转化成的字符串类g
0fev8eza3
本来应该是fev8eza3 采取了不?位补0的方法?br />
  private static int DATE_LEN = Long.toString(1000L*365*24*60*60*1000,
            Character.MAX_RADIX).length();
计算Z1970q开始后1000q的旉转化为字W串后的长度Q所有{化后的时间都不应过q个长度Q如果不_在前面补0

可以通过字符串{化ؓ日期的函数计出能表C的最大日期ؓ
stringToTime("zzzzzzzzz");
打印出来?Fri Apr 22 19:04:28 CST 5188  
所以该函数能{化的日期范围?1970-1-1~~5188-4-22


日期转化为字W串
public static String timeToString(long time)

字符串{化ؓ日期
public static long stringToTime(String s)


实际?函数 LongToString(long i,int radix) 相当?nbsp; 先将i转化为radixq制的整敎ͼ然后再用函数
LongToString(i)转化为字W串。所以radix的值应该在2--36之间如果不是 则按?0q制计算?br />



晓宇 2008-04-10 19:26 发表评论
]]>
org.apache.lucene.document.Documenthttp://www.aygfsteel.com/csusky/archive/2008/04/08/191555.html晓宇晓宇Tue, 08 Apr 2008 12:27:00 GMThttp://www.aygfsteel.com/csusky/archive/2008/04/08/191555.htmlhttp://www.aygfsteel.com/csusky/comments/191555.htmlhttp://www.aygfsteel.com/csusky/archive/2008/04/08/191555.html#Feedback0http://www.aygfsteel.com/csusky/comments/commentRss/191555.htmlhttp://www.aygfsteel.com/csusky/services/trackbacks/191555.htmlDocument是一些Field的集合,每个Field有一个名字和文本|当中的某些Field可能会随着Documnet被存储。这P每个Document应该臛_包含一个可以唯一标示它的被存储的Field

//Field集合
List fields = new Vector();
//增强因子Q作用于该Document的所有Field
private float boost = 1.0f;
//向Document中添加Field
public final void add(Field field) {
    fields.add(field);
  }
//删除指定名称的第一个Field
public final void removeField(String name)
//删除所有拥有指定名U的Field
public final void removeFields(String name)
//得到指定名称的第一个Field
public final Field getField(String name)
//以数l的形式q回指定名称的所有Field
public final Field[] getFields(String name)
//得到所有Field的一个枚?br /> public final Enumeration fields()

该类也重载了toString()Ҏ(gu)
打印出所有Field的信?br />





晓宇 2008-04-08 20:27 发表评论
]]>
org.apache.lucene.document.Fieldc?/title><link>http://www.aygfsteel.com/csusky/archive/2008/04/08/191550.html</link><dc:creator>晓宇</dc:creator><author>晓宇</author><pubDate>Tue, 08 Apr 2008 12:07:00 GMT</pubDate><guid>http://www.aygfsteel.com/csusky/archive/2008/04/08/191550.html</guid><wfw:comment>http://www.aygfsteel.com/csusky/comments/191550.html</wfw:comment><comments>http://www.aygfsteel.com/csusky/archive/2008/04/08/191550.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/csusky/comments/commentRss/191550.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/csusky/services/trackbacks/191550.html</trackback:ping><description><![CDATA[package org.apache.lucene.document;   <br /> Field<br /> 是Document的一部分Q每个Field有两个部分组?名字-??名字是String ?可以是String ?ReaderQ如果是KeyWordcd的FieldQ那么值将不会被进一步处理,像URLQDate{等。Field被存储在Index中,以便于能以Hits的Ş式返回原有的Document<br /> Field? 个Boolean形的标识<br />   private boolean isStored = false;     被存?nbsp;  <br />   private boolean isIndexed = true;    被烦?br />   private boolean isTokenized = true  被分?br /> 通过调整q?个boolean的|可以定该Field的类?br />   Keyword      true, true, false           一般存?URL DATE {关键字<br />   UnIndexed    true, false, false          一般是随HITS查询l果一赯回的信息<br />   Text              true, true, true            <br />   UnStored      false, true, true<br /> <br /> 另外Q还有一个重载的toStringҎ(gu) 可以打印Field的类?br /> <br /> float boost = 1.0f;    增强因子Q用于排序的评分Q作用于拥有该域(field)的所有文?document)<br /> <br />   <br />   <br /> <br /> <img src ="http://www.aygfsteel.com/csusky/aggbug/191550.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/csusky/" target="_blank">晓宇</a> 2008-04-08 20:07 <a href="http://www.aygfsteel.com/csusky/archive/2008/04/08/191550.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">֦</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">û</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˳</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˫</a>| <a href="http://" target="_blank">޳</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ľ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ϲ</a>| <a href="http://" target="_blank">е</a>| <a href="http://" target="_blank">ī񹤿</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">տ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">־</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ǩ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʯɽ</a>| <a href="http://" target="_blank">ɾ</a>| <a href="http://" target="_blank">з</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">廪</a>| <a href="http://" target="_blank">ӥ̶</a>| <a href="http://" target="_blank">˳</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>