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()//参数是id
reader.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删除
锁定规则:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值