【问题标题】:Multi-"match-phrase" query in Elastic SearchElastic Search 中的多“匹配短语”查询
【发布时间】:2015-07-13 06:01:56
【问题描述】:

这对我来说应该是显而易见的,但事实并非如此。下面的双匹配只匹配第二阶段(本例为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"
    }
  }
}

我想完全匹配所有包含任一短语的文档。

【问题讨论】:

    标签: elasticsearch elasticsearch-query match-phrase


    【解决方案1】:

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

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

    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

    【讨论】:

    • 我只能假设对原文的修改改变了意思,否则这不会有 10 票。
    • 完全符合问题的标题。正是我想要的。非常感谢!
    • 谢谢@JimK。正在寻找这个。
    • 你为什么提到"type": "phrase"。 type: 短语和不提有什么区别?
    • @Hossein - 原始问题专门使用match_phrase,这不是multi_match 的默认行为。 ref: elastic.co/guide/en/elasticsearch/reference/current/… 简而言之,它允许术语比直接邻居相距更远。
    【解决方案2】:

    您的第一个查询并不是真正有效的 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"}}
          ]
        }
     }
    }
    

    【讨论】:

    • 感谢您指出无效的 JSON 对象。是的,那是我的一个错误。我也澄清了这个问题。感谢您向我展示如何使用这两个短语进行 boolean and 搜索所有文档。实际上,我希望所有文档都包含一个或两个短语。
    • bool 更改为should 似乎可以解决问题。非常感谢您提供正确方向的提示。
    • 有什么方法可以对具有相同查询词的多个字段进行 match_phrase 吗?因为我在同一个查询词的多个字段匹配的情况下使用了 multi_match。所以想知道 match_phrase 是否也有类似 multi_match 的东西.. TIA :)
    • @ASN 请参阅下面的答案,因为当我找到您的评论时,我也在问同样的问题。这至少从 2.3 开始就起作用了,仅供参考。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 2021-02-20
    • 2023-01-13
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    相关资源
    最近更新 更多