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

时间:2017-01-06 12:33:19

标签: hibernate lucene full-text-search hibernate-search

我的目标是仅在活动项目中搜索 这是我的代码片段:

 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);

我想用field4过滤,它是Object,Enum, 我试过这个:

booleanJunction.must( queryBuilder.keyword()
            .wildcard()
            .onField("field4")
            .matching(Status.ACTIVE)
            .createQuery());

状态对象是枚举。

在这种情况下,如果上层不应该找到任何结果是所有活动项,则会发生因为它是bool查询..

任何建议?

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您需要一个类似的查询:

+(token1* token2* token3*) +field4:active

要构建它,您不希望将field4:active部分添加到与标记集相同的布尔查询中,您将需要创建父布尔查询以将标记查询集添加为必需(必须)查询。类似的东西:

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