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

pun*_*ish 17 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"]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

而以下呱呱叫错了

"query": {
  "match_phrase": {
    "contents": {
      "query": "St Peter Fm"
    },
    "contents": {
      "query": "Cape Basin"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我想匹配包含的所有文件 要么 完全相同短语输入.

更新:请参阅上面的更新

Jak*_*ski 23

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

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

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"}}
      ]
    }
 }
}
Run Code Online (Sandbox Code Playgroud)


Jim*_* K. 6

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

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

GET /_search
{
  "query": {
    "multi_match" : {
      "query":      "quick brown fox",
      "type":       "phrase",
      "fields":     [ "subject", "message" ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

一旦您以这种方式想到了(相对于在其他搜索子句上启用“多”支持),它就可以满足您的期望。

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

  • 完全符合问题的标题。正是我一直在寻找的东西。多谢! (4认同)
  • 我只能假设对原始内容的编辑改变了含义,否则不会有 10 票赞成。 (2认同)
  • @Hossein - 最初的问题特别使用“match_phrase”,这不是“multi_match”的默认行为。参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query-phrase.html 简而言之,它允许术语之间的距离比直接相邻术语的距离稍远。 (2认同)