Die Lucene Performanz in ε·ο·s entäuschte. Heute habe ich Daniel um Rat gefragt. Er wies mich auch den Lucene FieldCache hin und eine Diskussion über die Implementierung. Ich habe es in ε·ο·s implementiert. Bei Tests habe ich festgestellt, dass der Cache volllief, weil ich den IndexReader wieder verwendet habe. Der Reader wird jetzt jedesmal neu initialisiert. Der Performanzgewinn ist erstaunlich. Benötigte eine Abfrage vorher schon mal 30 Sekunden ist die Zeit jetzt fast immer deutlich unter 1 Sekunde.
Alter Code (Groovy)
def searcher = new IndexSearcher(reader)
def hits = searcher.search(query)
def retval = []
for (int i = 0; i < hits.length() && i < COUNT; i++) {
def Document doc = hits.doc(i)
def id = doc.get(FIELD_ID)
def year = doc.get(FIELD_YEAR)
def idYear = new IdYear();
idYear.id = id
idYear.year = year
retval.add(idYear)
}
searcher.close()
Neuer Code (Groovy)
def reader = IndexReader.open(directory)
def searcher = new IndexSearcher(reader)
def hits = searcher.search(query, (Filter) null, COUNT);
def idsCache = FieldCache.DEFAULT.getStrings(reader, FIELD_ID);
def yearsCache = FieldCache.DEFAULT.getStrings(reader, FIELD_YEAR);
def retval = []
if (hits.scoreDocs.length != 0) {
for (i in 0..(hits.scoreDocs.length - 1)) {
def id = idsCache[hits.scoreDocs[i].doc];
def year = yearsCache[hits.scoreDocs[i].doc];
def idYear = new IdYear();
idYear.id = id
idYear.year = year
retval.add(idYear)
}
}
searcher.close()
reader.close()
Geschrieben von sascha am 19. Februar 2008 22:17:19 CET
