Lucence学习笔记

来源:转载


《Lucence in Action》学习笔记

索引和搜索
创建索引

public class Indexer { if (args.length != 2) { throw new Exception("Usage: java " + Indexer) }}

理解索引的处理过程-》分解-》写入索引
转换成文本

基本的索引操作
1.增加document到索引
用到下面api方法

FSDirectory.getDirectory()new IndexWriter().optmize()new IndexWriter().close()new Document().add(Field.Keyword("", ""))new Document().add(Field.UnIndexed("", ""))new Document().add(Field.UnStored("", ""))new Document().add(Field.Text("", ""))//增加搜索的字段

2.从一个索引删除document
删除用的是IndexReader而不是IndexWriter,像这样:
IndexReader reader = IndexReader.open(dir)reader.delete()//参数是idreader.maxDoc()//返回下一个document数目reader.numDocs()//返回索引中document的数目reader.isDeleted()reader.hasDeletions()

还有一种删除document的方法
IndexReader reader = new IndexReader(dir);reader.delete(new Term("city", "Amsterdam"));reader.close();

3.反删除document
因为docuemnt的删除只有close()被调用的时候才执行,所以可以在delete之后,close之前执行undelete.使用undeleteAll()可以回退所有之前的delete操作。


4.更新docuemnt
处理方法是先删除再增加

IndexReader reader = IndexReader(dir);reader.delete(new Term("city"j, "liuzhou"));reader.close()IndexWriter writer = IndexWriter.open(dir);Document doc = new Document();doc.add(Field.KeyWord("", ""));doc.add(Field.UnIndex("", ""));doc.add(Field.UnStored("", ""));doc.add(Field.Text("", ""));writer.addDocument(doc);

批量更新
1.打开IndexReader
2.删除所有Document
3.关闭IndexReader
4.打开IndexWriter
5.添加所有Document
6.关闭IndexWriter


Boosting Document and Fields
添加factor去决定那些Document更重要
Document doc = new Docment();...doc.add(Field.Text("", ""));...if (...) {doc.setBoost(1.5);}else {doc.setBoost(1.0);}

当有多个Text的时候,这样写:
Field field1 = Field.Text("", "");Field field2 = Field.Text("", "");field1.setBoost(1.2);

索引特殊类型
1.日期类型
使用Field.Keyword(String, Date),例如
Docuemnt doc = new Document();doc.add(Field.Keyword("indexDate", new Date());

如果仅仅是索引YYYYMMDD,这样写
Field.Keyword("date", "YYYYMMDD");
如果要用时间戳
Field.Keyword("timestamp", <java.util.Date>);
2.索引数字
Lucene内部将数字按字符串处理,注意必须使用不忽略数字的分解器,如WhitespaceAnalyzer和StandardAnalyzer,不能用SimpleAnalyzer和StopAnalyzer


控制索引处理过程
当需要索引的Document集很大的时,需要修改设置,使得lucene能充分利用资源来提高搜索效率
1.tuning indexing performance
mergeFactor
默认是10,作用:当硬盘中的分片达到10后,将会合并这些分片
maxMergeDocs
默认是Integer.MAX_VALUE,作用:限制每个分片的documents
minMergeDocs
默认是10,作用:控制索引的时候对内存的使用
使用:
IndexWriter writer = IndexWriter(dir, analyzer, true);writer.mergeFactor = writer.maxMergeDocs = writer.minMergeDocs = 

注意:使用上面3个参数后可能会报错“Too many open files”异常,可以使用optimiz()优化


2.内存索引RAMDirectory
使用
Directory doc = new RAMDirectory();
使用RAMDirectory作为缓存批量索引
(1)创建基于FSDirectory的索引
(2)创建基于RAMDirectory的索引
(3)增加Document到基于RAMDirectory的索引
(4)每个一段时间,刷新RAMDirectory到FSDirectory
(5)回到(3)
FSDirectory fsDir = FSDirectory.getDirectory("/tmp/index", true);RAMDirectory ramDir = new RAMDirectory();IndexWriter fsWriter = IndexWriter(fsDir, new SimpleAnalyzer(), true);IndexWriter ramWriter = new IndexWriter(ramDir, new SimpleAnalyzer(), true);while (there are documents to index) {...create document...ramWriter.addDocument(doc);if (condition for flushing memory to disk has been met) { fsWriter.addIndexes(Directory[] {ramDir}); ramWriter.close(); ramWriter = new IndexWriter(ramDir, new SimpleAnalyzer(), true);}}

3.通过多索引来并行索引


4.限制文件大小maxFieldLength

writer.maxFieldLength = 


5.优化索引
使用IndexWriter.optimize()将分散的分片合起来


6.并发地、线程安全地、锁定地
需要遵循以下规则:
并发规则:
(1)任何数量的只读操作在并发的情况下都可以执行
(2)任何数量的只读操作在并发的、有一个索引正被修改的情况下都可以执行
(3)只能有一个修改索引的操作在某个时间被执行。
线程安全规则:
(1)当一个document正被删除的时候一个document不能通过IndexWriter被增加
(2)当一个index不能被optimize()时,一个document不能通过IndexReader被删除
(3)当一个index正在合并时,一个document不能通过IndexReader删除
锁定规则:




分享给朋友:
您可能感兴趣的文章:
随机阅读: