弹性搜索中的多 "match-phrase" 查询

Multi-"match-phrase" query in Elastic Search

这对我来说应该是显而易见的,但事实并非如此。下面的双赛只是第二阶段(本例为Cape Basin

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

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

而下面的错误提示

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

我想匹配所有包含 either 个短语的所有文档,与输入的完全相同。

您的第一个查询实际上不是有效的 JSON 对象,因为您两次使用相同的字段名称。

您可以使用 bool must or should query 来匹配两个或其中一个短语:

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

事实证明,您可以通过为 multi_match 启用短语语义来做到这一点。

为此,您将 type: 属性添加到 multi_match 语法中,如下所示:

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

一旦您这样想(相对于启用 "multi" 对其他搜索子句的支持),它就符合您的预期。

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