Multi-"match-phrase" query in Elastic Search

It turns out you can do this by enabling phrase semantics for multi_match.

To do this you add a type: attribute to the multi_match syntax as below:

GET /_search
{
  "query": {
    "multi_match" : {
      "query":      "quick brown fox",
      "type":       "phrase",
      "fields":     [ "subject", "message" ]
    }
  }
}

Once you think of it that way (vs. enabling "multi" support on other search clauses) it fits in where you'd expect.

ref: https://www.elastic.co/guide/en/elasticsearch/reference/6.5/query-dsl-multi-match-query.html#type-phrase


Your first query is not really a valid JSON object because you use the same field name twice.

You can use a bool must or should query to match both OR one of the phrases:

    PUT phrase/doc/1
    {
      "text": "St Peter Fm some other text Cape Basin"
    }

    //Match BOTH
    GET phrase/_search
    {
      "query": {
        "bool": {
          "must": [
             {"match_phrase": {"text":  "St Peter Fm"}},
             {"match_phrase": {"text":  "Cape Basin"}}
          ]
        }
     }
    }

    //Match EITHER ONE
    GET phrase/_search
    {
      "query": {
        "bool": {
          "should": [
             {"match_phrase": {"text":  "St Peter Fm"}},
             {"match_phrase": {"text":  "Cape Basin"}}
          ]
        }
     }
    }