elasticsearchelasticsearch-querymatch-phrase

Multi-"match-phrase" query in Elastic Search


this should be obvious to me but is not. The following two-match only the second phase (in this case, Cape Basin)

    "query": {
      "match_phrase": {
        "contents": {
          "query": "St Peter Fm",
          "query": "Cape Basin"
        }
      }
    }

    "query": {
      "match_phrase": {
        "contents": {
          "query": ["St Peter Fm", "Cape Basin"]
        }
      }
    }

while the following croaks with an error

    "query": {
      "match_phrase": {
        "contents": {
          "query": "St Peter Fm"
        },
        "contents": {
          "query": "Cape Basin"
        }
      }
    }

I want to match all documents that contain either phrases exactly as entered.


Solution

  • 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"}}
              ]
            }
         }
        }