使用领域模型(domain object)来进行索引、搜索2011-12-28 hi.baidu.com Goodtiger对于讲domain object 映射到关系型数据库中,hibernate等持久性框架做了很多的工作,使得业务逻辑只需要和hibernate等持久层进行交互,而不需要直接和具体的数据库进行交互。这给程序员带来了很大的方便,在业务逻辑处理上,只要针对domain object就可以。使用Lucene进行索引、搜索开发的的时候,最经常碰到的概念就是Document 和Field,在程序中一个不得不去做的事情,就是将领域对象的属性映射到document的field中去,在搜索的时候,还要根据document和field来构建DTOs(Data transfor object)来返回给web层。这点和EJB的一个缺点很类似,返回给web层的不能是实体Bean,而是对实体Bean进行封装了的DTO。我们希望的是有类似POJO的技术带来的便利一样,持久化的是domain object,返回给web层的也是也是domain object。我们在对domain object进行索引和搜索的时候,也希望能够直接在domain object的层面进行操作,而不是直接去和document和field打交道。而我们利用compass框架就可以做到这样。Compass是使用了Lucene的搜索引擎框架,它提供了一套开源的、高性能的、可以灵活配置的搜索框架,可以为用户的应用程序提供搜索功能。它还能与Spring、Hibernate等已有的框架进行整合。Comapss的API结构和hibernate非常的相似,如果使用过hibernate的程序员使用comapass,基本上对API就很得心应手。我们来看一个例子
CompassConfiguration config = new CompassConfiguration().configure();Compass compass = config.buildComapss();CompassSession session = compass.openSession();CompassTransaction tx = null;try{ tx = session.beginTransaction(); Book book = new Book(); book.setName("C++编程思想"); book.setAuthor(”Bruce Eckel“); session.save(book); tx.commit();}catch(Exception e){ if(tx!=null) { tx.rollback(); }}finally{ session.close();}
Hiberanete的程序员对上面的代码应该是非常的熟悉吧,compass完全让你远离了Lucene的API,让你的代码更专注与业务逻辑,而把索引和搜索的事情都交给compass吧。这点还带来了一个优点,就是利用compass很容易的给已有的系统增加搜索的功能。那么如何让domain object被compass使用呢,当然和hibernate一样,只要完成一些domai object的配置文件就可以了,具体的可以阅读compass附带的example。