What's causing this behavior is using a combination of the stop and shingle filters. Take a look at the first token in the response of your _analyze request:
"token": "_ hilton",
"start_offset": 8,
"end_offset": 14,
"type": "shingle",
"position": 0,
"positionLength": 2
The underscore in that token is the "filler token": the string that gets inserted wherever a stop word was removed. Because your documents do not have those stop words, there is no token _ hilton in the index for your documents, and because you are using an and operator, you're not matching any documents as a result.
One way to resolve this would be to define the filler_token to be "" in the shingle filter and move the strip filter to the end of the chain:
PUT test
{
"settings": {
"index": {
"number_of_shards": 1,
"analysis": {
"analyzer": {
"english": {
"tokenizer": "standard",
"filter": ["lowercase", "english_possessive_stemmer", "my_stop", "light_english_stemmer","my_shingle", "trim"]
}
},
"filter": {
"english_possessive_stemmer":{
"type" : "stemmer",
"language" : "possessive_english"
},
"light_english_stemmer":{
"type" : "stemmer",
"language" : "light_english"
},
"my_stop":{
"type" : "stop",
"stopwords" : ["what", "is"],
"remove_trailing" : "false"
},
"my_shingle":{
"type": "shingle",
"filler_token": ""
}
}
}
}
},
"mappings": {
"test": {
"properties": {
"title": {
"type": "text",
"analyzer": "english"
}
}
}
}
}