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