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的帮助文档。
- 14:50
- 浏览 (195)
- 评论 (0)
- 分类: Compass&Lucene
- 相关推荐
发表评论
- 浏览: 2463 次
- 性别:

- 来自: 天津

- 详细资料
搜索本博客
最近加入圈子
链接
最新评论
-
开发者版本:你属于哪个版 ...
引用只要不乘100就好。。。 阁下是多少?
-- by hilliate -
开发者版本:你属于哪个版 ...
xiao0556 写道我大约属于2.5吧 只要不乘100就好。。。
-- by wangdi -
开发者版本:你属于哪个版 ...
我大约属于2.5吧
-- by xiao0556 -
开发者版本:你属于哪个版 ...
我想知道的是,每个级别的人应该拿多少钱合适?这是个问题,大家能否讨论下
-- by hilliate -
编程和足球的关系,给一些 ...
kevinsai 写道我现在有2个选择,一个正在工作的小公司,小公司里面的员工好 ...
-- by hilliate






评论排行榜