分类:
2006-05-21 15:50:13
开始学习Lucene,今天先了解一下索引建立
主要步骤:提取文本 -> 构建Document –> 分析 -> 建立索引
任何需要进行索引的文件都必须被转化成Document对象才能被索引和搜索.可以将Document对象看成一种虚拟的文件,带有多个数据源(key/value键值对)
建立Document的方法:
import. Org.apache.lucene.document.Document;
import. Org.apache.lucene.document.Field;
import. Org.apache.lucene.document.DateField;
Document doc = new Document();
//加入path关键字到document对象
Doc.add(Field.Keyword(“path”,”内容”));
对于每个Field,有四种类形:
Field.Text :需分词,需索引,可被搜索
Field.Keyword:不分词,需索引,完整储存
Field.UnIndexed:不分词,不索引
Field.UnStored :被分词,被索引,不存储
索引类IndexWriter的三个参数
存放路径:可为String path,java.io.File,Directory
1指定路径:c:\\index
2 FSDirectory对象:FSDirectory.getDirectory(path,true);//true表示清空重建
3 RAMDirectory:存于内存,new RAMDirectory();
分析器: 继承自org.apache.lucene.analysis.Analyzer类
是否重建索引,为false时则为增量建立
例子:
//创建文档 Document doc = new Document();
Doc.add(Field.Keyword(“name”,”java”));
//建立索引
IndexWriter writer = new IndexWriter(“c:\\index”,new StandardAnalyzer(),true);
//加入文档
writer.addDocument(doc);
writer.close();//必须关闭,执行此行后,索引才将内存中的内容写入磁盘
在IndexWriter中有一个方法setUserCompoundFile(boolean),可以设置是否使用复合索引
合并内存索引和文件系统索引
FSDirectory fsDir = FSDirectory.getDirectory(“c:\\index”,true);
RAMDirectory ramDir = new RAMDirectory();
IndexWriter fsWriter = new IndexWriter(fsDir,new StandardAnalyzer(),true);
IndexWriter ramWriter = new IndexWriter(ramDir,new StandardAnalyzer(),true);
//创建Document对象并加入IndexWriter;过程略
//关闭内存索引
ramWriter.close();
//合并 fsWriter.addIndexes(new Directory[]{fsDir});/
//关闭文件系统索引
fsWriter.close();
删除索引
IndexReader reader = ndexReader.open(“c:\\index”);
reader.deleter(0);
reader.close();
//按field删除
reader.delete(new Term(“name”,”word”));
//删除field name中含有word的字段
恢复被删除的索引
reader.undeleteAll()
索引优化:
IndexWriter.optimize();//一般应在大批量索引建立完成后再行调用
性能调整参数:IndexWriter实例的属性
mergeFactor:控制把索引从内存写入磁盘时内存最大的Document数,同时控制内存中最大的Segment数,默认为10
maxMergeDocs:限制一个Segment中最大的文档数,大批量建立索引时应该设大,增量时应设小值
maxFieldLength:对field的长度(term的数量)进行限制
Segment:lucene索引文件最基本的一个单位