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学习文档");

        article.setTitle("学习Compass查询");

        article.setPublishDate(new Date());

        comSession.save(article);

        article = new Article();

        article.setId((long)1);

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

        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,QueryCompassQueryBuilder这一点又和lucene很像。

session.queryBuilder()返回CompassQueryBuilder的对象,再调用queryString来查询搜索字串。可这个构造字串就有学问了:“titleIndex:学习”表示指明字段名搜索,如果想指明多个字段呢可以用空格和“+”隔开如:“titleIndex:学习 +contentIndex:第”

注意:查询字串里的标识不是对象的属性,而是对象的属性映射成索引的名字,这个是可以在Article.cmp.xml里看到的。还有就是一定要在两个搜索内容之间加空格要不然什么都搜不到。

addSort就是对搜索出的结果按一定的顺序排序。

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

最后用个for循环利用hits.data(i)将结果遍历输出。

上面的例子达到了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", "
学习")).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这个函数,但是在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的帮助文档。

posted on 2007-12-18 11:06 方涛升 阅读(531) 评论(0)  编辑  收藏 所属分类: lucene

只有注册用户登录后才能发表评论。


网站导航:
 
<2007年12月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

常用链接

留言簿(2)

随笔分类

随笔档案

文章分类

搜索

  •  

最新评论

阅读排行榜

评论排行榜