Compass学习文档(2) (转)

 上面的只讲了Compass的建立索引也就是存储对象和加载对象,这里讲一下Compass的搜索查询功能。上面说了Compass和Hibernate是非常像的。Hibernate查询的时候用的是Criteriat和Query而Compass里用的是CompassQuery具有以上两个的功能。

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

      在上面的JUnit测试用例里加入:

Java代码 复制代码
  1. public void InsertCompass()    
  2.   
  3.     {    
  4.   
  5.         CompassConfiguration comConfig = new  
  6. CompassConfiguration().configure().addClass(Article.class);    
  7.   
  8.         Compass com = comConfig.buildCompass();    
  9.   
  10.         CompassSession comSession =   
  11. com.openSession();    
  12.   
  13.         CompassTransaction comTx =   
  14. comSession.beginTransaction();    
  15.   
  16.             
  17.   
  18.         Article article = new Article();    
  19.   
  20.         article.setId((long)0);    
  21.   
  22.         article.setContent("Compass学习文档");    
  23.   
  24.         article.setTitle("学习Compass查询");    
  25.   
  26.         article.setPublishDate(new Date());    
  27.   
  28.         comSession.save(article);    
  29.   
  30.         article = new Article();    
  31.   
  32.         article.setId((long)1);    
  33.   
  34.         article.setContent("Compass是第一个基于lucene的java开源框架");    
  35.   
  36.         article.setTitle("学习Compass");    
  37.   
  38.         article.setPublishDate(new Date());    
  39.   
  40.         comSession.save(article);    
  41.   
  42.         comTx.commit();    
  43.   
  44.     }   
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(); 

    } 

 

      就是插入两个对象数据。

      下面我们就搜搜体验一下吧:

Java代码 复制代码
  1. public void TestQuery()    
  2.   
  3.     {    
  4.   
  5. CompassConfiguration comConfig = new  
  6. CompassConfiguration().configure().addClass(Article.class);    
  7.   
  8.         Compass com = comConfig.buildCompass();    
  9.   
  10.         CompassSession session =   
  11. com.openSession();    
  12.   
  13.         CompassTransaction tx =   
  14. session.beginTransaction();    
  15.   
  16.         CompassHits hits =   
  17. session.queryBuilder()    
  18.   
  19.             
  20. .queryString("titleIndex:学习")    
  21.   
  22.             
  23. .toQuery()    
  24.   
  25.           
  26. .addSort("title",   
  27. CompassQuery.SortPropertyType.STRING)    
  28.   
  29.           
  30. .addSort("publishDate",CompassQuery.SortPropertyType.INT)    
  31.   
  32.             
  33. .hits();    
  34.   
  35.         for(int  
  36. i=0;i<hits.getLength();i++)    
  37.   
  38.         {    
  39.   
  40.             System.out.println(((Article)hits.data(i)).getTitle());    
  41.   
  42.         }    
  43.   
  44.     }   
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功能一样的:再看个搜索的例子吧:

Java代码 复制代码
  1. CompassConfiguration comConfig = new  
  2. CompassConfiguration().configure().addClass(Article.class);    
  3.   
  4.         Compass com   
  5. = comConfig.buildCompass();    
  6.   
  7.         CompassSession   
  8. session = com.openSession();    
  9.   
  10.         CompassTransaction   
  11. comTx = session.beginTransaction();    
  12.   
  13.         CompassQueryBuilder   
  14. queryBuilder= session.queryBuilder();    
  15.   
  16.         CompassQuery   
  17. compassQuery = queryBuilder.bool().addMust(queryBuilder.le("titleIndex""学习")).toQuery();    
  18.   
  19.         CompassHits   
  20. hits = compassQuery.addSort("title", CompassQuery.SortPropertyType.STRING).hits();    
  21.   
  22.         for(int  
  23. i=0;i<hits.getLength();i++)    
  24.   
  25.         {    
  26.   
  27.             System.out.println(((Article)hits.data(i)).getTitle());    
  28.   
  29.         }    
  30.   
  31.         comTx.commit();  
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的帮助文档中写着:

Java代码 复制代码
  1. CompassQueryBuilder queryBuilder = session.createQueryBuilder();   
  2.  queryBuilder.bool().addMust(queryBuilder.eq("name""jack")).addMust(queryBuilder.lt("birthdate""19500101"))   
  3.       .toQuery().hits();  
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的帮助文档。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值