Compass學習文檔(2) (轉)

      上面的只講了Compass的建立索引也就是存儲對象和加載對象,這裏講一下Compass的搜索查詢功能。上面說了Compass和Hibernate是非常像的。Hibernate查詢的時候用的是Criteriat和Query而Compass裏用的是CompassQuery具有以上兩個的功能。

      還是拿上面的例子做例子吧:

      在上面的JUnit測試用例里加入:

public void InsertCompass() 

    { 

        CompassConfiguration comConfig = new
CompassConfiguration().configure().addClass(Article.class); 

        Compass com = comConfig.buildCompass(); 

        CompassSession comSession =
com.openSession(); 

        CompassTransaction comTx =
comSession.beginTransaction(); 

         

        Article article = new Article(); 

        article.setId((long)0); 

        article.setContent("Compass學習文檔"); 

        article.setTitle("學習Compass查詢"); 

        article.setPublishDate(new Date()); 

        comSession.save(article); 

        article = new Article(); 

        article.setId((long)1); 

        article.setContent("Compass是第一個基於lucene的java開源框架"); 

        article.setTitle("學習Compass"); 

        article.setPublishDate(new Date()); 

        comSession.save(article); 

        comTx.commit(); 

    } 

 

      就是插入兩個對象數據。

      下面我們就搜搜體驗一下吧:

public void TestQuery() 

    { 

CompassConfiguration comConfig = new
CompassConfiguration().configure().addClass(Article.class); 

        Compass com = comConfig.buildCompass(); 

        CompassSession session =
com.openSession(); 

        CompassTransaction tx =
session.beginTransaction(); 

        CompassHits hits =
session.queryBuilder() 

         
.queryString("titleIndex:學習") 

         
.toQuery() 

       
.addSort("title",
CompassQuery.SortPropertyType.STRING) 

       
.addSort("publishDate",CompassQuery.SortPropertyType.INT) 

         
.hits(); 

        for(int
i=0;i<hits.getLength();i++) 

        { 

            System.out.println(((Article)hits.data(i)).getTitle()); 

        } 

    } 

 

      輸出結果是

      學習Compass查詢

      學習Compass

      其實Compass完全沒畢要那麼羅嗦,它就是爲了依照Hibernate來的。讓會Hibernate的程序員可以很容易的掌握Compass。搜索的前一部分就不說了,和Hibernate的初始化一樣且前面也講了,從CompassHits開始吧。

      可以看到:搜索就用到CompassHits,Query,CompassQueryBuilder這一點又和lucene很像。

      session.queryBuilder()返回CompassQueryBuilder的對象,再調用queryString來查詢搜索字串。可這個構造字串就有學問了:“titleIndex:學習”表示指明字段名搜索,如果想指明多個字段呢可以用空格和“+”隔開如:“titleIndex:學習 +contentIndex:第”

      注意:查詢字串裏的標識不是對象的屬性,而是對象的屬性映射成索引的名字,這個是可以在Article.cmp.xml裏看到的。還有就是一定要在兩個搜索內容之間加空格要不然什麼都搜不到。

      addSort就是對搜索出的結果按一定的順序排序。

      Hits()呢就是返回hits結果集吧。

      最後用個for循環利用hits.data(i)將結果遍歷輸出。

      上面的例子達到了Hibernate中Query的功能。而CompassQuery還有和Criteriat功能一樣的:再看個搜索的例子吧:

CompassConfiguration comConfig = new
CompassConfiguration().configure().addClass(Article.class); 

        Compass com
= comConfig.buildCompass(); 

        CompassSession
session = com.openSession(); 

        CompassTransaction
comTx = session.beginTransaction(); 

        CompassQueryBuilder
queryBuilder= session.queryBuilder(); 

        CompassQuery
compassQuery = queryBuilder.bool().addMust(queryBuilder.le("titleIndex", "學習")).toQuery(); 

        CompassHits
hits = compassQuery.addSort("title", CompassQuery.SortPropertyType.STRING).hits(); 

        for(int
i=0;i<hits.getLength();i++) 

        { 

            System.out.println(((Article)hits.data(i)).getTitle()); 

        } 

        comTx.commit();

       CompassQuery裏有lt,le,gt,ge和Criteriat是一個樣的。不過Compass的jar包裏沒有eq這個函數,但是在Compass1.1M1的幫助文檔中寫着:

CompassQueryBuilder queryBuilder = session.createQueryBuilder();
 queryBuilder.bool().addMust(queryBuilder.eq("name", "jack")).addMust(queryBuilder.lt("birthdate", "19500101"))
      .toQuery().hits();

      這個可能是Compass的一個bug。

      既然沒有eq我們就用:

      queryBuilder.bool().addMust(queryBuilder.le("titleIndex", "學習")).toQuery();做個演示吧。

      結果理想的。

      具體的用法和Hibernate一樣,也可以查看Compass的幫助文檔。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章