hibernate search -- 多条件查询

52 篇文章 0 订阅

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

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

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

//must true
MustJunction 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值