31

这对我来说应该很明显,但不是。以下两个匹配仅第二阶段(在这种情况下,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"
    }
  }
}

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

4

2 回答 2

36

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

您可以使用bool must 查询来匹配这两个短语:

PUT phrase/doc/1
{
  "text": "St Peter Fm some other text Cape Basin"
}
GET phrase/_search
{
  "query": {
    "bool": {
      "must": [
         {"match_phrase": {"text":  "St Peter Fm"}},
         {"match_phrase": {"text":  "Cape Basin"}}
      ]
    }
 }
}
于 2015-05-03T23:06:29.683 回答
25

事实证明,您可以通过为multi_match.

为此,您向语法中添加一个type:属性,如下所示:multi_match

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

一旦您以这种方式考虑它(相对于在其他搜索子句上启用“多”支持),它就符合您的期望。

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

于 2019-01-14T17:52:06.317 回答