From 4113d76904cc264e53838baacd7dc1bbd9cb20f3 Mon Sep 17 00:00:00 2001 From: Claude Brisson Date: Sat, 29 Nov 2025 10:21:31 +0100 Subject: [PATCH] Fix stale Lucene reader after ratings index rebuild The reader and searcher were lazily initialized once, so after rebuild() created a new index, searches still used the old reader pointing to outdated document IDs. When those IDs were used to index into the new players array, wrong entries were returned. Now reader/searcher are refreshed after each build(). --- .../kotlin/org/jeudego/pairgoth/ratings/PlayerIndex.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/view-webapp/src/main/kotlin/org/jeudego/pairgoth/ratings/PlayerIndex.kt b/view-webapp/src/main/kotlin/org/jeudego/pairgoth/ratings/PlayerIndex.kt index 65c991f..ad28e3a 100644 --- a/view-webapp/src/main/kotlin/org/jeudego/pairgoth/ratings/PlayerIndex.kt +++ b/view-webapp/src/main/kotlin/org/jeudego/pairgoth/ratings/PlayerIndex.kt @@ -39,8 +39,8 @@ class PlayerIndex { val stopChars = Regex("[_-]") } private final val directory: Directory = ByteBuffersDirectory(NoLockFactory.INSTANCE) - private val reader by lazy { DirectoryReader.open(directory) } - private val searcher by lazy { IndexSearcher(reader) } + private lateinit var reader: DirectoryReader + private lateinit var searcher: IndexSearcher // helper functions fun Json.Object.field(key: String) = getString(key) ?: throw Error("missing $key") @@ -68,6 +68,9 @@ class PlayerIndex { ++count } } + // Refresh reader and searcher to see the new index + reader = DirectoryReader.open(directory) + searcher = IndexSearcher(reader) logger.info("indexed $count players") }