与dis-max-query相关的minimum_should_match

时间:2014-02-28 10:41:43

标签: solr lucene elasticsearch edismax dismax

我刚刚从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中找到这些信息的任何提示都非常感谢!

1 个答案:

答案 0 :(得分:1)

您正在使用operator: and并提供minimum_should_match,但这并不完全合理。使用operator: and,它会生成如下查询:

field1:term1 AND field1:term2 AND field1:nonexistingterm

因此,无论您minimum_should_match的设置是什么,所有这些都是必需的。要有效地使用最小匹配行为,您需要使用“或”运算符生成should子句。这就像删除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
            }
          }
        }
      ]
    }
  }
}