For question two, could you instead write a script that would give another metadata value containing a list or sequence of multiple values, equal to the integers between and including the lower and upper bounds of the range.
e.g. for the results you mentioned, they would have a corresponding field with the following values:
2-2 = 2
1-2 = 1|2
3-6 = 3|4|5|6
3-4 = 3|4
And then you just need to use numeric range facets as @plevan mentioned.
My knowledge of groovy isn't that great, so I don't know the actual code to produce those values, but I'm sure it's possible with simple loops.