Start by applying EdgeNgramFilter with min = 1 and max = 1000 (we want the whole source token to be enabled). Example:
hello => 'h', 'he', 'hel', 'hell', 'hello'
Secondly, use NGramFilter with min = 2. (I just use 2 as max in the example for simplicity)
'h', 'he', 'hel', 'hell', 'hello' => 'h', 'he', 'he', 'el', 'he', 'el', 'll', ' he ',' el ',' ll ',' lo '
You will now have several identical tokens, since you applied NGramFilter on all the “partial” tokens from EdgeNGramFilter, but just use RemoveDuplicatesTokensFilter to remove them.
'h', 'he', 'he', 'el', 'he', 'el', 'll', 'he', 'el', 'll', 'lo' => 'h', ' he ',' el ',' ll ',' lo '
Now your field will support one char request "startsWith", and several characters "contain" the request.