hibernate search -- 多条件查询

来源:互联网 发布:linux运维的基础知识 编辑:程序博客网 时间:2024/05/22 13:53

hibernate search可以通过多组合条件来实现多条件查询,这里简单介绍一下多条件查询的一个实践。
如果只是单个条件查询,那么这个查询就可以很简单

luceneQuery = queryBuilder.keyword().onFields("title", "content").matching(query.getKeyword()).createQuery()

如果是多条件并查询,那么就需要使用到Must Join,如果是多条件或查询,就需要使用should Join,这里举个Must Join的例子

//must trueMustJunction term = queryBuilder.bool().must(queryBuilder.keyword()                   .onFields("title", "content")     .matching(query.getKeyword()).createQuery());//must false term.must(queryBuilder.keyword()                            .onField("status")                         .matching(query.getExcludeStatus()).createQuery()).not();

完整例子:

private FullTextQuery findByKeywordQuery(TopicQuery query) {        FullTextSession fullTextSession = Search                .getFullTextSession(getSession());        QueryBuilder queryBuilder = fullTextSession.getSearchFactory()                .buildQueryBuilder().forEntity(Topic.class).get();        org.apache.lucene.search.Query luceneQuery = null;        if (null == query.getStatus() && null == query.getUsername() && null == query.getExcludeStatus()) {            luceneQuery = queryBuilder.keyword()// .wildcard()                    .onFields("title", "content").matching(query.getKeyword())                    // .matching("*" + query.getKeyword() + "*")                    .createQuery();            if(LOG.isDebugEnabled()){                LOG.debug("create clean keyword search query: " + luceneQuery.toString());            }        } else {           MustJunction term = queryBuilder.bool().must(queryBuilder.keyword()                   .onFields("title", "content")     .matching(query.getKeyword()).createQuery());           if(null != query.getStatus()){               term.must(queryBuilder.keyword()                            // .wildcard()                            .onField("status")                            .matching(query.getStatus()).createQuery());           }           if(null != query.getExcludeStatus()){               term.must(queryBuilder.keyword()                            .onField("status")                            .matching(query.getExcludeStatus()).createQuery()).not();           }           if(null != query.getUsername()){               term.must(queryBuilder.keyword()                            // .wildcard()                            .onField("owner.username")                             .ignoreFieldBridge()                            .matching(query.getUsername()).createQuery());           }           luceneQuery =term.createQuery();           if(LOG.isDebugEnabled()){               LOG.debug("create complicated keyword search query: " + luceneQuery.toString());           }        }        // BooleanQuery        FullTextQuery hibernateQuery = fullTextSession.createFullTextQuery(                luceneQuery, Topic.class);        return hibernateQuery;    }
0 0
原创粉丝点击