You're using a match_phrase query so the quotes are not needed. This query does not handle wildcard so ? is treated as any other character.
If you want to perform a wildcard in a phrase query you'll have to use the span queries:
{
"query": {
"span_near" : {
"clauses" : [
{ "span_term" : { "field" : "imperial" } },
{ "span_term" : { "field" : "college" } },
{ "span_multi" : { "match": { "wildcard": { "field" : "lo?don" } } } }
],
"slop" : 0,
"in_order" : true
}
}
}
The query above is the equivalent of a phrase query, except that the last term contain a wildcard:
https://www.elastic.co/guide/en/elasticsearch/reference/current/span-queries.html