上面的只講了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學(xué)習(xí)文檔");
article.setTitle("學(xué)習(xí)Compass查詢");
article.setPublishDate(new Date());
comSession.save(article);
article = new Article();
article.setId((long)1);
article.setContent("Compass是第一個基于lucene的java開源框架");
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,Query,CompassQueryBuilder這一點又和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á)到了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", "學(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,ge和Criteriat是一個樣的。不過Compass的jar包里沒有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