1

我是 elasticsearch 的新手,因为我最近刚从 Solr 切换。我现在正在尝试将我的 solrconfig 中的 edismax 查询转换为使用 elasticsearch。

基本上我希望同时在两个字段中搜索这些术语,所以我最终得到了这个查询:

{
  "query": {
    "dis_max": {
      "queries": [
        {
          "match": {
            "field_1": {
              "query": "term1"
            }
          }
        },
        {
          "match": {
            "field_2": {
              "query": "term1"
            }
          }
        }
      ]
    }
  }
}

这适用于单个术语。如果有多个术语,则不需要找到每个术语。但是,我找不到实现此功能的方法。这就是minimum_should_match参数的用途——由bool query提供。

假设我有三个术语,我希望至少找到其中两个。通过反复试验,我检查了很多变体,包括以下内容:

{
  "query": {
    "dis_max": {
      "queries": [
        {
          "match": {
            "field_1": {
              "query": "term1 term2 nonexistingterm",
              "operator": "and",
              "minimum_should_match": 2
            }
          }
        },
        {
          "match": {
            "field_2": {
              "query": "term1 term2 nonexistingterm",
              "operator": "and",
              "minimum_should_match": 2
            }
          }
        }
      ]
    }
  }
}

但是minimum_should_match在这里不起作用,并且由于and操作员没有找到结果。它不适用于or两者,因为只有一次点击就足以返回结果。

有人可以帮我结合dis_maxminimum should match

我找不到任何有关此的文档,因此非常感谢我自己可以在 elasticsearch 中找到这些信息的任何提示!

4

1 回答 1

2

您正在使用operator: and并提供 a minimum_should_match,这并不完全有意义。在operator: and那里,它会产生如下查询:

field1:term1 AND field1:term2 AND field1:nonexistingterm

因此,无论您minimum_should_match设置什么,它们都是必需的。为了有效地使用最小应该匹配行为,您需要生成带有“或”运算符的应该子句。这就像删除operator设置一样简单,因为“或”是默认设置,您应该会看到您正在寻找的行为。那是:

{
  "query": {
    "dis_max": {
      "queries": [
        {
          "match": {
            "field_1": {
              "query": "term1 term2 nonexistingterm",
              "minimum_should_match": 2
            }
          }
        },
        {
          "match": {
            "field_2": {
              "query": "term1 term2 nonexistingterm",
              "minimum_should_match": 2
            }
          }
        }
      ]
    }
  }
}
于 2014-02-28T16:04:47.913 回答