Gabi und Sascha
Tags - Kategorien : Alle | Berlin | Bücher | Fotografie | Java | Linkhalde | Weichware | Verfassung

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()