【问题标题】:Does the order in which BooleanPredicateClausesStep filters are chained matter?BooleanPredicateClausesStep 过滤器的链接顺序是否重要?
【发布时间】:2022-08-04 20:29:41
【问题描述】:

我有以下方法可以创建一个BooleanPredicateClausesStep 来进行查询。

private BooleanPredicateClausesStep<?> getJournalAndSpatialSearchCriteria(GeoFilter geoFilter, SearchPredicateFactory factory, Boolean includeJournalsWithStatusFinished) {
    SearchPredicate journalLocationMustResideWithinRadius = getJournalsContainedWithinRadiusPredicate(geoFilter, factory);
    SearchPredicate mustOrShouldBeOfStatus = getSubmissionStatusConditionPredicate(includeJournalsWithStatusFinished, factory);
    return factory.bool()
        .filter( journalLocationMustResideWithinRadius )
        .filter( factory.match().field( \"deleted\" ).matching( \"false\" ) )
        .filter( mustOrShouldBeOfStatus )
        .filter( factory.match().field( \"containsHarvestEntry\" ).matching( \"true\" ) )
        .filter( factory.match().field( \"grownOutdoors\" ).matching( \"true\" ) );
}

它包含一个空间搜索谓词,用于检查期刊是否属于预定义的圆形地理区域。所有其他过滤器都是简单的过滤器,仅检查某个字段是否与值匹配。

我的问题是:所有这些过滤器是按顺序实现还是同时实现?或者换一种说法; lucene 会先获取所有属于定义地理区域的对象,然后再检查它们是否被删除还是同时检查两者? hibernate search documentation 没有说明过滤器的处理顺序。

    标签: elasticsearch filter lucene hibernate-search hibernate-search-6


    【解决方案1】:

    简而言之:不,在单个布尔谓词中声明过滤器的顺序无关紧要.无论顺序如何,结果都是相同的,而无论顺序如何,性能很可能是相同的。


    详细解答:

    给定布尔谓词中的子句顺序无关紧要,因为谓词将匹配相同的文档而不管顺序如何。

    关于实现,它有点复杂,但粗略地说过滤器会变成DocIdSetIterators,然后组合起来,这样组合的迭代器只会遍历返回的文档全部迭代器。这意味着每个迭代器将一个接一个地递增。

    但是,有一些优化允许迭代器“跳过”与前一个迭代器匹配的文档,因此顺序可能很重要,但仅出于性能考虑:如果您有一个快速且匹配很少文档的过滤器,则最好执行首先它。

    ... Lucene 通常知道每个过滤器/迭代器的“成本”,并且会自动更改迭代器的顺序以首先执行成本较低的迭代器(参见 Lucene 8.11 中的org.apache.lucene.search.ConjunctionDISI#createConjunction)。

    综上所述:即使是为了性能,虽然订单在内部很重要,但应该不重要.所以,别想了:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-11
      • 2011-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      相关资源
      最近更新 更多