booleanjuntion#iSempty等效于休眠搜索6 booleanpredicateclausesstep

发布于 2025-02-10 20:07:59 字数 1285 浏览 0 评论 0原文

Hibernate Search 5 BooleanJunction具有有用的ISEMPTY()方法,您可以确定是否实际存在任何条款。这有助于在B/C上游构建查询时,我们将不包括,或者如果特定的布莱亚截止为空,则会更改我们的查询,因为它不会提供所需的结果。

Hibernate Search 6中布尔质量的等效物是什么?我看不到一个,那么是否有另一种方法可以确定布尔式PRELEANPREENATECATECLAUSESSTEP是空的还是其中没有条款?

提供一些示例代码以说明。

Hibernate Search 5.10.7. -Final:

     public Query buildProbableVendorNamesQuery(FullTextSession fts, QueryBuilder qb, Set<String> vendorNames) {
            BooleanJunction namesBool = qb.bool();

            vendorNames.forEach(name ->
                    addProbableVendorNameBool(fts, qb, namesBool, name)
            );
    
            return namesBool.isEmpty() ? null : namesBool.createQuery();
        }

Hibernate Search 6.1.5.Final:

    public SearchPredicate buildProbableVendorNamesPredicate(SearchPredicateFactory pf, Set<String> vendorNames) {
        BooleanPredicateClausesStep namesBool = pf.bool();

        vendorNames.forEach(name ->
                addProbableVendorNameBool(pf, namesBool, name)
        );

        //TODO: How can we know if namesBool is empty so we can return null?
        return namesBool.toPredicate();
    }

命名为空的原因有多种原因,1个名称本身最终成为停止字或将其标准化为一无所有。在这种情况下,我们想通知呼叫者在上游,搜索播放是无效的,因此不要尝试在查询中使用它。

Hibernate Search 5 BooleanJunction has a useful isEmpty() method to you can determine whether any clauses actually exist. This helps when building the Queries upstream b/c we won't include, or will alter our Query if a particular BooleanJunction is empty since it will not provide the results desired.

What is the equivalent for BooleanPredicateClausesStep in Hibernate Search 6? I don't see one, so is there another way to determine whether a BooleanPredicateClausesStep is empty or has no clauses contained within it?

Providing some example code to illustrate.

Hibernate Search 5.10.7.Final:

     public Query buildProbableVendorNamesQuery(FullTextSession fts, QueryBuilder qb, Set<String> vendorNames) {
            BooleanJunction namesBool = qb.bool();

            vendorNames.forEach(name ->
                    addProbableVendorNameBool(fts, qb, namesBool, name)
            );
    
            return namesBool.isEmpty() ? null : namesBool.createQuery();
        }

Hibernate Search 6.1.5.Final:

    public SearchPredicate buildProbableVendorNamesPredicate(SearchPredicateFactory pf, Set<String> vendorNames) {
        BooleanPredicateClausesStep namesBool = pf.bool();

        vendorNames.forEach(name ->
                addProbableVendorNameBool(pf, namesBool, name)
        );

        //TODO: How can we know if namesBool is empty so we can return null?
        return namesBool.toPredicate();
    }

There are various reasons why namesBool could be empty, 1 being that the name itself ended up being a stop word or normalizing down to nothing. In that case we'd want to inform the caller upstream that the SearchPredicate is null so don't attempt to use it in a query.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

歌枕肩 2025-02-17 20:07:59

编辑:Hibernate Search 6.2.0.Alpha2在booleanPredicateOptionsCollector/booleanPrealPreadicateClausessTep上引入了hascclause方法,因此您应该使用它。


上一个答案:

在冬眠搜索6.2之前,没有等效的。

同时,您可以将list传递给addprobablevendornamebool作为解决方法。虽然不是很漂亮,但它会起作用:

    public SearchPredicate buildProbableVendorNamesPredicate(SearchPredicateFactory pf, Set<String> vendorNames) {
        List<SearchPredicate> clauses = new ArrayList();

        vendorNames.forEach(name ->
                addProbableVendorNameBool(pf, clauses, name)
        );

        if (clauses.isEmpty()) {
            return null;
        }

        BooleanPredicateClausesStep namesBool = pf.bool();
        clauses.forEach(namesBool::should);
        return namesBool.toPredicate();
    }

    private void addProbableVendorNameBool(SearchPredicateFactory pf, List<SearchPredicate> clauses, String name) {
        ...
    }

或者,如果您可以更改addprobablevendornamebool,以便它准确地返回一个谓词(例如,如果需要,请在必要时创建自己的布尔谓词)或null <<null << /代码>:

    public SearchPredicate buildProbableVendorNamesPredicate(SearchPredicateFactory pf, Set<String> vendorNames) {
        List<SearchPredicate> clauses = vendorNames.stream()
                .map(name -> buildProbableVendorSingleNamePredicate(pf, name))
                .filter(Objects::nonNull)
                .collect(Collectors.toList());

        if (clauses.isEmpty()) {
            return null;
        }

        BooleanPredicateClausesStep namesBool = pf.bool();
        clauses.forEach(namesBool::should);
        return namesBool.toPredicate();
    }

    private SearchPredicate buildProbableVendorSingleNamePredicate(SearchPredicateFactory pf, String name) {
        ...
        return <something or null>;
    }

EDIT: Hibernate Search 6.2.0.Alpha2 introduced a hasClause method on BooleanPredicateOptionsCollector/BooleanPredicateClausesStep, so you should use that.


Previous answer:

Before Hibernate Search 6.2, there is no equivalent.

In the meantime, you can pass a List to addProbableVendorNameBool as a workaround. While not very pretty, it will work:

    public SearchPredicate buildProbableVendorNamesPredicate(SearchPredicateFactory pf, Set<String> vendorNames) {
        List<SearchPredicate> clauses = new ArrayList();

        vendorNames.forEach(name ->
                addProbableVendorNameBool(pf, clauses, name)
        );

        if (clauses.isEmpty()) {
            return null;
        }

        BooleanPredicateClausesStep namesBool = pf.bool();
        clauses.forEach(namesBool::should);
        return namesBool.toPredicate();
    }

    private void addProbableVendorNameBool(SearchPredicateFactory pf, List<SearchPredicate> clauses, String name) {
        ...
    }

Or, if you can change addProbableVendorNameBool so that it returns exactly exactly one predicate (e.g. by having it create its own boolean predicate if necessary) or null:

    public SearchPredicate buildProbableVendorNamesPredicate(SearchPredicateFactory pf, Set<String> vendorNames) {
        List<SearchPredicate> clauses = vendorNames.stream()
                .map(name -> buildProbableVendorSingleNamePredicate(pf, name))
                .filter(Objects::nonNull)
                .collect(Collectors.toList());

        if (clauses.isEmpty()) {
            return null;
        }

        BooleanPredicateClausesStep namesBool = pf.bool();
        clauses.forEach(namesBool::should);
        return namesBool.toPredicate();
    }

    private SearchPredicate buildProbableVendorSingleNamePredicate(SearchPredicateFactory pf, String name) {
        ...
        return <something or null>;
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文