Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4478065
  • 博文数量: 192
  • 博客积分: 10014
  • 博客等级: 上将
  • 技术积分: 8232
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-21 00:22
文章分类

全部博文(192)

文章存档

2011年(4)

2009年(14)

2008年(174)

我的朋友

分类:

2008-06-20 19:37:49

 
 
Lucene-2.3.1 源代码阅读学习(2)
 
 

IndexWriter是一个非常重要的工具。建立索引必须从它开始。而且,从它的构造函数开始。

Document和Field是Lucene中两个最重要的概念。在建立索引的时候,也就是实例化一个索引器IndexWriter的之前,必须通过已经建立好的Document逻辑文件,将Document的对象添加到IndexWriter实例中,才能算是建立索引。

Document汇集数据源,这个数据源是通过Field来构造的。构造好Field之后,将每个Field对象加入到Document之中,可以通过Document来管理Field,然后将聚集的Document加入到IndexWriter中,建立索引,写入指定的Directory,为检索做准备。

写一个建立索引,然后读取索引的例子,代码如下:

package org.shirdrn.lucene;

import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.LockObtainFailedException;

public class MyIndexWriter {
public static void main(String[] args){
   File myFile = new File("E:\\Lucene\\myindex");
   try {
    Document myDoc = new Document();
    Field myFieldNo = new Field("myNo","SN-BH-19830119",Field.Store.YES,Field.Index.UN_TOKENIZED);
    Field myFieldName = new Field("myName","家园使者",Field.Store.YES,Field.Index.UN_TOKENIZED);
    Field myFieldGender = new Field("myGender","男",Field.Store.YES,Field.Index.UN_TOKENIZED);
    Field myFieldDescb = new Field("myDescb","家园族长",Field.Store.YES,Field.Index.UN_TOKENIZED);
    myDoc.add(myFieldNo);
    myDoc.add(myFieldName);
    myDoc.add(myFieldGender);
    myDoc.add(myFieldDescb);
    Field hisFieldNo = new Field("hisNo","SN-BH-19860101",Field.Store.YES,Field.Index.UN_TOKENIZED);
    Field hisFieldName = new Field("hisName","爱刮的风",Field.Store.YES,Field.Index.UN_TOKENIZED);
    Field hisFieldGender = new Field("hisGender","女",Field.Store.YES,Field.Index.UN_TOKENIZED);
    Field hisFieldDescb = new Field("hisDescb","风尘族长",Field.Store.YES,Field.Index.UN_TOKENIZED);
    myDoc.add(hisFieldNo);
    myDoc.add(hisFieldName);
    myDoc.add(hisFieldGender);
    myDoc.add(hisFieldDescb);
    IndexWriter myWriter = new IndexWriter(myFile,new StandardAnalyzer(),true);    //   构造一个索引器,true指定了:向已经存在的索引中追加索引
    myWriter.addDocument(myDoc);
    myWriter.close();    // 关闭索引器,将追加的索引文件写入到索引目录中
    IndexReader myReader = IndexReader.open(myFile);    // 读取索引
    for(int i=0;i     System.out.println(myReader.document(i));    //   输出索引文件的信息
    }
   } catch (CorruptIndexException e) {
    e.printStackTrace();
   } catch (LockObtainFailedException e) {
    e.printStackTrace();
   } catch (IOException e) {
    e.printStackTrace();
   }
}

}

这里,使用File myFile = new File("E:\\Lucene\\myindex");作为一个参数来构造一个索引器。

运行程序,可以在目录E:\Lucene\myindex下看到生成的索引文件,一共有三个文件:

_0.cfs

segments.gen

segments_3

第一个是.cfs格式的,成为复合索引格式;第三个segments_3是一个索引段。

因为上面程序中使用了IndexReader,先打开索引文件,然后通过IndexReader的document()来读取索引文件的内容。

Field是由Document来管理维护的,上面的那个构造方法,第一个参数是Field的名称,如果没有这样一个标识,Document怎么找到它从而对它维护呢。

第二个参数是该Field的内容(一般来说是文本),可能在建立索引的时候对其处理,比如分词就是很重要的一项(是否分词要看第三、四个参数如何设置)。

后面的参数数关于该Field是否存储,以及是否分词。

现在只是将Field添加到Document中进行预处理,离建立索引还很远。真正建立索引是从一个Document添加到IndexWriter中开始的,即在此基础上IndexWriter初始化,这时,便调用了它的init方法,在init方法中调用了DocumentWiter类的addDocument()方法,才开始建立索引了。

Lucene建立索引的过程是相当复杂的,它要把已经添加到Document中的Field在内存中调出来,通过FieldInfos来实现进一步的处理。

阅读(1206) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~