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刪除
鎖定規則:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章