执行多 - "匹配短语"在弹性搜索中查询

时间:2015-05-03 22:35:42

标签: elasticsearch match-phrase

这对我来说应该是显而易见的,但事实并非如此。以下两个仅匹配第二个短语(在这种情况下," 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"
    }
  }
}

我希望将所有包含 短语的文档与输入完全匹配。

更新:请参阅上面的更新

2 个答案:

答案 0 :(得分:20)

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

您可以使用bool must query来匹配这两个词组:

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

答案 1 :(得分:5)

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

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

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

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

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