posts - 33,  comments - 11,  trackbacks - 0
           

          上面的只講了Compass的建立索引也就是存儲對象和加載對象,這里講一下Compass的搜索查詢功能。上面說了CompassHibernate是非常像的。Hibernate查詢的時候用的是CriteriatQueryCompass里用的是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學(xué)習(xí)文檔");

                  article.setTitle("學(xué)習(xí)Compass查詢");

                  article.setPublishDate(new Date());

                  comSession.save(article);

                  article = new Article();

                  article.setId((long)1);

                  article.setContent("Compass是第一個基于lucenejava開源框架");

                  article.setTitle("學(xué)習(xí)Compass");

                  article.setPublishDate(new Date());

                  comSession.save(article);

                  comTx.commit();

              }

          就是插入兩個對象數(shù)據(jù)。

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

          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:
          學(xué)習(xí)")

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

                  }

              }

          輸出結(jié)果是

          學(xué)習(xí)Compass查詢

          學(xué)習(xí)Compass

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

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

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

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

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

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

          最后用個for循環(huán)利用hits.data(i)將結(jié)果遍歷輸出。

          上面的例子達(dá)到了HibernateQuery的功能。而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", "
          學(xué)習(xí)")).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,geCriteriat是一個樣的。不過Compassjar包里沒有eq這個函數(shù),但是在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", "學(xué)習(xí)")).toQuery();做個演示吧。

          結(jié)果理想的。

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

          posted on 2007-12-18 11:06 方濤升 閱讀(539) 評論(0)  編輯  收藏 所屬分類: lucene

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          <2007年12月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          文章分類

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 平邑县| 定结县| 眉山市| 尚志市| 信宜市| 田东县| 湘潭县| 高邮市| 双城市| 衡东县| 天水市| 津南区| 铜陵市| 马尔康县| 宜昌市| 西乌珠穆沁旗| 高碑店市| 独山县| 米林县| 融水| 松原市| 上杭县| 常宁市| 胶南市| 南阳市| 长寿区| 福建省| 惠水县| 垫江县| 邹城市| 潞城市| 新晃| 榆中县| 英山县| 漯河市| 安塞县| 南陵县| 云安县| 大石桥市| 富源县| 庄河市|