前面所讲的就是Hibernate持久化Car对象和Hibernate Search 让Cars变得可搜索所需要的。现在,我们来看一下如何搜索Cars,首先,我们需要加载Hibernate配置文件,然后创建一个数据库Session:
@Before
public void setUp() throws Exception {
Configuration configuration = new Configuration();
configuration.configure("hibernate-test-cfg.xml");
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())
.buildServiceRegistry();
hibernateSessionFactory = configuration.buildSessionFactory(serviceRegistry);
hibernateSession = hibernateSessionFactory.openSession();
populateDBWithTestData();
}
我们现在可以持久化一些Car对象来测试一下:
private void populateDBWithTestData() {
Car[] testCars = { new Car("Shelby American", "GT 350", (short) 1967, "This is Tim's car!"),
new Car("Chevrolet", "Bel Air", (short) 1957, "This is a true classic") };
Transaction tx = hibernateSession.beginTransaction();
hibernateSession.save(testCars[0]);
hibernateSession.save(testCars[1]);
tx.commit();
}
现在我们的两个测试用的Car对象已经保存到H2数据库中了,而且Lucene也已经对它们创建了索引!我们可以通过Lucene来搜索Cars:
@Test
public void testUsingLuceneBooleanQueryReturningFullEntity() throws Exception {
FullTextSession fullTextSession = Search.getFullTextSession(hibernateSession);
BooleanQuery bq = new BooleanQuery();
TermQuery gt350TermQuery = new TermQuery(new Term("model", "GT 350"));
TermQuery belAirTermQuery = new TermQuery(new Term("model", "Bel Air"));
bq.add(gt350TermQuery, BooleanClause.Occur.SHOULD);
bq.add(belAirTermQuery, BooleanClause.Occur.SHOULD);
Query q = new QueryParser(Version.LUCENE_36, "cs-method", new StandardAnalyzer(Version.LUCENE_36)).parse(bq
.toString());
org.hibernate.Query hibernateQuery = fullTextSession.createFullTextQuery(q, Car.class);
List searchResults = hibernateQuery.list();
boolean foundShelby = false;
boolean foundBelAir = false;
for (Car car : searchResults) {
if (car.getModel().equals("GT 350")) {
foundShelby = true;
} else if (car.getModel().equals("Bel Air")) {
foundBelAir = true;
}
}
Assert.assertEquals(2, searchResults.size());
Assert.assertTrue(foundShelby && foundBelAir);
}
关于上面的搜索代码,这里有几个关键点:
第3行,我们获取了一个Hibernate Search FullTextSession。需要注意的是这个session装饰了一个正常的Hibernate数据库Session对象,这让Hibernate Search能够清楚创建过索引的对象的插入、更新、删除操作,从而保证Lucene的索引是最新的。
从第5行到第13行,我们创建了一个查询,来检索我们测试时保存的两个Car对象,我们选择使用Lucene的BooleanQuery来查询,尽管当你现在了全部的源码之后你会发现,有很多方法都可以创建类似的查询。这个查询将执行这样的操作:“查找所有model属性值为‘GT350’或者‘Bel Air’的Car对象”。我们创建了查询对象,然后让Lucene QueryParser对查询对象进行了分析,然后用FullTextSession将它翻译成标准的Hibernate查询。
剩下的代码用来检查我们创建的查询是否的确返回了我们期望在Lucene索引中查找到的值,然后使用断言进行验证。
如果你想了解创建跟上面类似的查询的其他方式或者想加载上面的代码然后亲自尝试一下Hibernate Search,你可以下载本篇文章的Hibernate Search实例代码
------------------------------------------分割线------------------------------------------
具体下载目录在 /2015年资料/11月/26日/Hibernate Search 和 Lucene 的快速介绍/
------------------------------------------分割线------------------------------------------