如何在 Hibernate 搜索中搜索与过滤器匹配的查询结果

How to search for query results which also match a filter in Hibernate search

我正在使用带有弹性搜索后端的 Hibernate Search 6。
我正在使用以下内容搜索书名。

Search.session(entityManager)
            .search(Book.class)
            .predicate(f -> query == null || query.trim().isEmpty() ? f.matchAll()
                    : f.simpleQueryString()
                        .field("title")
                        .matching(query))
            .fetchHits(10);  

现在我的 Book 实体有一个布尔字段 inStock。我希望我的休眠搜索结果只包含 inStock 为真的那些书。 我可以在结果列表的 java 中做一个过滤器,但这会破坏分页并且不像查询本身

中的东西那样优雅的解决方案

也许是这样的?

Search.session(entityManager).search(Book.class)
        .predicate(f -> f.bool(b -> { 
            b.must(f.match().field("inStock").matching(true));
            if (query != null && !query.trim().isEmpty()) { 
                b.must(f.simpleQueryString().field("title")
                        .matching(query));
            }
        }))
        .fetchHits(10);  

或者,如果 "inStock" 作为参数传递并且可能是 null(表示 "no constraint on the stock status"):

Search.session(entityManager).search(Book.class)
        .predicate(f -> f.bool(b -> { 
            b.must(f.matchAll()); // Match everything by default, if there are no constraints
            if (inStock != null) {
                b.must(f.match().field("inStock").matching(true));
            }
            if (query != null && !query.trim().isEmpty()) { 
                b.must(f.simpleQueryString().field("title")
                        .matching(query));
            }
        }))
        .fetchHits(10);  

参见this section of the documentation,尤其是最后一个例子("Easily adding clauses dynamically with the lambda syntax")