38

谁能举例说明 BooleanQuery 中 lucene 中 BooleanClause.Occur.Must 和 BooleanClause.Occur.SHOULD 之间的区别?

4

4 回答 4

42

BooleanClause.Occur.SHOULD表示该子句是可选的,而BooleanClause.Occur.Must表示该子句是强制性的。

但是,如果布尔查询只有可选子句,则必须至少匹配一个子句才能使文档出现在结果中。

为了更好地控制哪些文档与 BooleanQuery 匹配,还有一个minimumShouldMatch参数,它可以让您告诉 Lucene 至少minimumShouldMatch BooleanClause.Occur.SHOULD子句必须匹配文档才能出现在结果中。

于 2012-04-12T12:08:26.193 回答
30

我将尝试用一个例子来解释:

假设有两个子句:子句 A 和子句 B。现在 BooleanClause.Occur 的效果如下:

  • 在第一种情况下,子句 A 和 B 都设置了 BooleanClause.Occur.Should 标志。这意味着即使满足其中一个子句(A 或 B),该文档也将是成功的。

  • 在第二种情况下,子句 A 设置了 BooleanClause.Occur.Must 标志,子句 B 设置了 BooleanClause.Occur.Should 标志。

    在这种情况下,当文档“将”满足条款 A 时,该文档将成为命中。该文档是否满足条款 B 对其命中没有影响。

    但是如果文档不满足A 条,那么无论它是否满足B 条,它都不会被命中。

  • 在第三种情况下,子句 A 和子句 B 都设置了 BooleanClause.Occur.Must 标志。

    在这种情况下,只有当它同时满足“两个”子句时,文档才会成功。如果它甚至不能满足其中一个子句,那么它就不会成功。

于 2012-08-03T09:47:03.383 回答
5

BooleanClause.Occur.Must代表强制条款。应满足该条款才能返回结果。基本上AND

BooleanClause.Occur.SHOULD代表可选子句,其行为类似于OR

于 2016-08-15T12:05:01.873 回答
3

当您最关心的是排名时,应该子句是 lucene 中最重要的功能!

当您使用 SHOULD 子句时,Lucene 通过 SHOULD 子句点的总和对检索到的文档进行排名。因此,您可以将一些查询与具有不同提升的 SHOULD 子句一起加入(根据它们的重要性)。这是 Solr 中 ExtendedDismaxQuery 背后的概念。

于 2015-09-09T06:25:35.527 回答