1. lucene中主要的类
1.1. Document文档类
1.1.1.常用方法
方法 |
描述 |
void add(Field field) |
往Document对象中添加字段 |
void removeField(String name) |
删除字段。若多个字段以同一个字段名存在,则删除首先添加的字段;若不存在,则Document保持不变 |
void removeFields(String name) |
删除所有字段。若字段不存在,则Document保持不变 |
Field getField(String name) |
若多个字段以同一个字段名存在,则返回首先添加的字段;若字段不存在,则Document保持不变 |
Enumeration fields() |
返回Document对象的所有字段,以枚举类型返回 |
Field [] getFields(String name) |
根据名称得到一个Field的数组 |
String [] getValues(String name) |
根据名称得到一个Field的值的数组 |
1.1.2.示例
Document doc1 = new Document();
doc1.add(new Field("name", "word1 word2 word3",
Field.Store.NO,Field.Index.TOKENIZED));
Document doc2 = new Document();
doc2.add(new Field("name", "word1 word2 word3",
Field.Store.NO,Field.Index.TOKENIZED));
1.2. Field字段类
1.2.1.构造方法
1) public Field(String name,String value,Store store,Index index);//直接的字符串方式
2) public Field(String name,String value,Store store,Index index,TermVector termVector);
3) public Field(String name,String value,Reader reader);//使用Reader从外部传入
4) public Field(String name,String value,Reader reader,TermVector termVector);
5) public Field(String name,byte[] value,Store store)//使用直接的二进制byte传入
当Field值为二进制时,可以使用Lucene的压缩功能将其值进行压缩。
1.2.2.Store类
静态属性 |
描述 |
Store.NO |
表示该Field不需要存储 |
Store.YES |
表示该Field需要存储 |
Store.COMPRESS |
表示用压缩方式来保存这个Field的值 |
1.2.3.Index类
静态属性 |
描述 |
Index.NO |
不需要索引 |
Index.TOKENIZED |
先被分词再被索引 |
Index.UN_TOKENIZED |
不对该Field进行分词,但会对它进行索引 |
Index.NO_NORMS |
对该Field进行索引,但是不使用Analyzer,同时禁止它参加评分,主要是为了减少内存的消耗。 |
1.2.4.示例
new Field("name", "word1 word2 word3",Field.Store.YES,Field.Index.TOKENIZED)
1.3. IndexWriter类
1.3.1.构造方法
1) public IndexWriter(String path,Analyzer a,Boolean create)
2) public IndexWriter(File path,Analyzer a,Boolean create)
3) public IndexWriter(Directory d,Analyzer a,Boolean create)
第一个参数:索引存放在什么地方
第二个参数:分析器,继承自org.apache.lucene.analysis.Analyzer类
第三个参数:为true时,IndexWriter不管目录内是否已经有索引了,一律清空,重新建立;当为false时,则IndexWriter会在原有基础上增量添加索引。所以在更新的过程中,需要设置该值为false。
1.3.2.添加文档
public void addDocument(Document doc)
public void addDocument(Document doc,Analyzer analyzer)//使用一个开发者自定义的,而非事先在构建IndexWriter时声明的Analyzer来进行分析
writer.addDocument(doc1);
1.3.3.性能参数
1) mergeFactor控制Lucene在把索引从内存写入磁盘上的文件系统时内存中最大的Document数量,同时它还控制内存中最大的Segment数量。默认为10.
writer.setMergeFactor(10);
2) maxMergeDocs限制一个Segment中最大的文档数量。一个较大的maxMergeDocs适用于对大批量的文档建立索引,增量式的索引则应使用较小的maxMergeDocs。
writer.setMaxMergeDocs(1000);
3) minMergeDocs用于控制内存中持有的文档数量的,它对磁盘上的Segment大小没有任何影响。
1.3.4.限制Field的长度
maxFieldLength限制Field的长度,默认值为10000.最大值100000个。
public void setMaxFieldLength(int maxFieldLength)
writer.addDocument(doc1);
writer.setMaxFieldLength(100000);
writer.addDocument(doc2);
1.3.5.复合索引格式
setUseCompoundFile(Boolean) 默认true
writer.setUseCompoundFile(true);//复合索引
writer.setUseCompoundFile(false);
1.3.6.优化索引
writer.optimize();
将磁盘上的多个segment进行合并,组成一个全新的segment。这种方法并不会增加建索时的速度,反而会降低建索的速度。所以应该在建完索引后在调用这个函数
1.3.7.示例
IndexWriter writer = new IndexWriter(path, new StandardAnalyzer(), true);
writer.addDocument(doc1);
writer.addDocument(doc2);
Sytem.out.println(writer.docCount());
writer.close();
IndexSearcher searcher = new IndexSearcher(path);
Hits hits = null;
Query query = null;
QueryParser parser =new QueryParser("name", new StandardAnalyzer());
query =parser.parse("word1");
hits = searcher.search(query);
System.out.println("查找 word1 共" + hits.length() + "个结果");
1.4. Directory类
Directory:用于索引的存放位置
a) FSDirectory.getDirectory(path, true)第二个参数表示删除掉目录内原有内容
IndexWriter writer = new IndexWriter(FSDirectory.getDirectory(path, true), new StandardAnalyzer(), true);//删除原有索引
或
FSDirectory fsDir=FSDirectory.getDirectory(path,true);
IndexWriter writer = new IndexWriter(fsDir, new StandardAnalyzer(), true);
b) RAMDirectory在内存中存放,读取速度快,但程序一运行结束,它的内容就不存在了
RAMDirectory ramDir=new RAMDirectory();
IndexWriter writer = new IndexWriter(ramDir, new StandardAnalyzer(), true);
或
IndexWriter writer = new IndexWriter(new RAMDirectory(), new StandardAnalyzer(), true);