【问题标题】:minimum_should_match in connection with dis-max-query与 dis-max-query 相关的 minimum_should_match
【发布时间】:2014-02-28 10:41:43
【问题描述】:

我是 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 中找到这些信息的任何提示!

【问题讨论】:

  • 我不确定你已经用or 尝试过是什么意思。下面的查询似乎在测试中正常工作。如果它不适合您,可能需要有关您的设置的更多详细信息。
  • 这是我的设置: "version" : { "number" : "1.0.0", "build_hash" : "a46900e9c72c0a623d71b54016357d5f94c8ea32", "build_timestamp" : "2014-02-12T16:18:34Z ", "build_snapshot" : false, "lucene_version" : "4.6" },

标签: solr lucene elasticsearch edismax dismax


【解决方案1】:

您正在使用operator: and 并同时提供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
            }
          }
        }
      ]
    }
  }
}

【讨论】:

  • 嗨@femtoRgon,我知道'and'没有多大意义,但我尝试了一切,包括你的配置。但它也不起作用:如果你输入 "query": "term1 nonexterm1 nonexterm2" 查询仍然返回结果
  • 当然,所以我们在这里遗漏了一些信息。也许您的分析仪正在做一些您没有预料到的事情。 explain 的输出对于理解为什么会得到某些结果非常有帮助。您可能会尝试一些更简单的查询,以便更好地理解问题。只尝试其中一个匹配查询,不使用 dis_max 包装它,看看会发生什么。尝试单独搜索每个术语,看看是否会在您认为不应该的地方获得点击。
  • 感谢您指出解释语句,最后您建议逐步开始查询的建议是成功的。该问题与查询本身无关,但与使用 nedgegram 的错误使用的分析器有关。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
相关资源
最近更新 更多