索引的优化
lucene的优化其实做起来是很简单的,只需要调用一个方法就行了:optimize()
他会将磁盘上的多个segment进行合并,它并不会加快创建索引的速度,相反会降低。
如果一次性为很多数据建立索引的话,建议等索引建立完之后再进行优化。
Lucene
的同步机制
为了保证索引文件不被误操破坏,lucene增加了锁机制
主要有两种;
Write.lock
用于防止多个线程同时访问一个索引文件而设置,当在IndexWriter初始化时获得,在关闭时释放,当IndexReader删除或反删除索引时也会获得锁。
Commit.lock
主要是在Segment被建立、合并、读取时生成。
这两个所我们是不用管理的。
下面是in action 中关于同步的讲解:
只读的任何操作均可以同时运行,例如可以使用多线程同时进行查询
任何只读的操作均可以在一个索引被修改的时候被执行(索引优化,增加、修改、删除Document,)
每一时刻只能由一个索引修改操作在运行
一个索引同一时刻只能被一个
IndexWriter
或
IndexReader
操作
下面是in action 的一些知识总结,关于创建索引部分的:
2 如何增加多个查询单元到一个Field
String baseWord = "fast";
String synonyms[] = String {"quick", "rapid", "speedy"};
Document doc = new Document();
doc.add(Field.Text("word", baseWord));
for (int i = 0; i < synonyms.length; i++) {
doc.add(Field.Text("word", synonyms[i]));
}
4 撤销对索引删除进行的操作
对索引进行更新操作
删掉旧的,再加新的:
public class DocumentUpdateTest extends BaseIndexingTestCase {
public void testUpdate() throws IOException {
assertEquals(1, getHitCount("city", "Amsterdam"));
IndexReader reader = IndexReader.open(dir);
reader.delete(new Term("city", "Amsterdam"));
reader.close();
assertEquals(0, getHitCount("city", "Amsterdam"));
IndexWriter writer = new IndexWriter(dir, getAnalyzer(),
false);
Document doc = new Document();
doc.add(Field.Keyword("id", "1"));
L
doc.add(Field.UnIndexed("country", "Netherlands"));
doc.add(Field.UnStored("contents",
"Amsterdam has lots of bridges"));
doc.add(Field.Text("city", "Haag"));
writer.addDocument(doc);
writer.optimize();
writer.close();
assertEquals(1, getHitCount("city", "Haag"));
}
protected Analyzer getAnalyzer() {
return new WhitespaceAnalyzer();
}
private int getHitCount(String fieldName, String searchString)
throws IOException {
IndexSearcher searcher = new IndexSearcher(dir);
Term t = new Term(fieldName, searchString);
Query query = new TermQuery(t);
Hits hits = searcher.search(query);
int hitCount = hits.length();
searcher.close();
return hitCount;
}
}
进行批量更新的方法
Open
IndexReader.
2 Delete all the
Documents you need to delete.
3 Close
IndexReader.
4 Open
IndexWriter.
5 Add all the
Documents you need to add.
6 Close
IndexWriter.