Looks simpler. I am still hoping we can remove the map, but lets do this for now.
Can we make SpanWeight.buildSimWeight private final? its only used by its ctor.
Can both rewrite methods currently in SpanMultiTermQuery be fixed to avoid re-seeking? Maybe TopTermsSpanBooleanQueryRewrite was forgotten.
What would be nice would be to try and write an asserting TermsEnum that could check how many times seekExact(BytesRef) was called, to ensure that the various queries are re-using their term states properly.
TermQuery/Weight has checks around this that can help. Look for stuff like assertTermNotInReader check. This was missing from spans because of its previous leniency.