基于Hibernate apache lucene的全文搜索,带有一个静态过滤器

基于Hibernate apache lucene的全文搜索,带有一个静态过滤器,hibernate,lucene,full-text-search,hibernate-search,Hibernate,Lucene,Full Text Search,Hibernate Search,我的目标是只搜索活动项目 以下是我的代码片段: FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(this.getEntityManager()); QueryBuilder queryBuilder = fullTextEntityManager.getSearchFactory() .buildQueryBuilder(

我的目标是只搜索活动项目 以下是我的代码片段:

 FullTextEntityManager fullTextEntityManager =
            Search.getFullTextEntityManager(this.getEntityManager());

    QueryBuilder queryBuilder =
        fullTextEntityManager.getSearchFactory()
        .buildQueryBuilder()
        .forEntity(Myclass.class)
        .get();

    BooleanJunction<BooleanJunction> booleanJunction = queryBuilder.bool();

    for(String token : tokens){
        booleanJunction.should( queryBuilder.keyword()
            .wildcard()
            .onFields("field1", "field2", "field3")
            .matching(token + "*")
            .createQuery());
    }

    FullTextQuery jpaQuery = fullTextEntityManager.createFullTextQuery(booleanJunction.createQuery(), MyClass.class);
状态对象是枚举

在这种情况下,如果upper找不到任何结果,结果是所有活动项,则会发生这种情况,因为它是布尔查询


有什么建议吗?

如果我理解正确,您需要类似以下内容的查询:

+(token1* token2* token3*) +field4:active
要构建该查询,您不想将field4:active部分添加到与令牌集相同的布尔查询中,您需要创建一个父布尔查询以将令牌集添加为必需(必须)查询。比如:

BooleanJunction<BooleanJunction> parentJunction = queryBuilder.bool();
parentJunction.must(booleanJunction.createQuery());
parentJunction.must(field4activeQuery);
BooleanJunction parentJunction=queryBuilder.bool();
parentJunction.must(booleanJunction.createQuery());
parentJunction.must(field4activeQuery);
BooleanJunction<BooleanJunction> parentJunction = queryBuilder.bool();
parentJunction.must(booleanJunction.createQuery());
parentJunction.must(field4activeQuery);