hibernate search -- 多條件查詢

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;
    }
發佈了110 篇原創文章 · 獲贊 14 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章