lucene 中 BooleanClause.Occur.Must 和 BooleanClause.Occur.SHOULD 之间的区别
Posted
技术标签:
【中文标题】lucene 中 BooleanClause.Occur.Must 和 BooleanClause.Occur.SHOULD 之间的区别【英文标题】:Difference between BooleanClause.Occur.Must and BooleanClause.Occur.SHOULD in lucene 【发布时间】:2012-04-24 17:59:06 【问题描述】:谁能举例说明 BooleanQuery 中 lucene 中 BooleanClause.Occur.Must 和 BooleanClause.Occur.SHOULD 的区别?
【问题讨论】:
正如 here 关于 Occur.SHOULD 所说:“将此运算符用于应出现在匹配文档中的子句。对于没有 MUST 子句的 BooleanQuery,一个或多个 SHOULD 子句必须匹配BooleanQuery 要匹配的文档。" 【参考方案1】:BooleanClause.Occur.SHOULD
表示该子句是可选的,而BooleanClause.Occur.Must
表示该子句是强制性的。
但是,如果布尔查询只有可选子句,则必须至少匹配一个子句才能使文档出现在结果中。
为了更好地控制哪些文档与 BooleanQuery 匹配,还有一个 minimumShouldMatch 参数可让您告诉 Lucene,至少 minimumShouldMatch
BooleanClause.Occur.SHOULD
子句必须匹配文档才能出现在结果中。
【讨论】:
根据this lucene documentation,如果查询只有可选子句,它仍然是可选的。 setMinimumNumberShouldMatch 控制它,但默认情况下它将查询视为使用 0。【参考方案2】:我会尝试用一个例子来解释:
假设有两个子句:子句 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 标志。
在这种情况下,只有当它同时满足“两个”子句时,文档才会被选中。如果它甚至不能满足其中一个子句,那么它就不会成功。
【讨论】:
【参考方案3】:BooleanClause.Occur.Must
代表强制条款。应满足该条款才能返回结果。基本上是AND
。
BooleanClause.Occur.SHOULD
代表可选子句,其行为类似于OR
【讨论】:
【参考方案4】:当您最关心的是排名时,应该从句是 lucene 中最重要的功能!
当您使用 SHOULD 子句时,Lucene 通过 SHOULD 子句点的总和对检索到的文档进行排名。因此,您可以将一些查询与具有不同提升的 SHOULD 子句一起加入(根据它们的重要性)。这就是 Solr 中 ExtendedDismaxQuery 背后的概念。
【讨论】:
以上是关于lucene 中 BooleanClause.Occur.Must 和 BooleanClause.Occur.SHOULD 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章