Wildcard with exact phrase search using query_string

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