In this case, you might need to look at an ngram type solution.
Ngram does something like this:
Given the text abcd and analyzed with ngram you might get the tokens:
a
ab
abc
abcd
b
bc
bcd
c
cd
d
below is a setting that might work for you.
You might need to tinker with the filter portion. This particular filter creates grams up to 12 units long and a minimum of two tokens.
Now, if you need it to do further analysis that snowball gives you (like water, waters, watering all matching the token water) you will need to tinker yet further.
"filter": {
"ngram_filter": {
"type": "nGram",
"min_gram": 2,
"max_gram": 12
}
},
"analyzer": {
"ngram_index": {
"filter": [
"lowercase",
"ngram_filter"
],
"tokenizer": "keyword"
},
"ngram_search": {
"filter": [
"lowercase"
],
"tokenizer": "keyword"
}
}
},
The idea here is at indextime you want to create the right tokens to be available at searchtime. But, all you need to do at searchtime is make those tokens available. You don't need to reapply the ngram analyzer again.
EDIT:
One last thing I just noticed, this requirement: "ExxonMobil" should match "exxon mobil"
Probably means you will need do something like this:
"ngram_search": {
"filter": [
"lowercase"
],
"tokenizer": "whitespace"
}
Note the addition of the "whitespace" tokenizer instead of keyword. This allows the search to split on whitespace.