首页 »编程综合 » 领域模型:使用领域模型(domain object)来进行索引、搜索 »正文
领域模型:使用领域模型(domain object)来进行索引、搜索
来源: 发布时间:星期四, 2009年1月15日 浏览:9次 评论:0
这给 ![](/icons/72078chengxu.gif) 员带来了很大 ![](/icons/72078de.gif) 方便 ![](/icons/72078dou.gif) 在业务逻辑处理上 ![](/icons/72078dou.gif) 只要针对do ![](/icons/72078main.gif) object就可以 ![](/icons/72078dou2.gif) 使用Lucene进行索引、搜索开发 ![](/icons/72078de.gif) ![](/icons/72078de.gif) 时候 ![](/icons/72078dou.gif) 最经常碰到 ![](/icons/72078de.gif) 概念就是Document 和Field ![](/icons/72078dou.gif) 在 ![](/icons/72078chengxu.gif) 中 ![](/icons/72078yi.gif) 个不得不去做 ![](/icons/72078de.gif) 事情 ![](/icons/72078dou.gif) 就是将领域对象 ![](/icons/72078de.gif) 属性映射到document ![](/icons/72078de.gif) field中去 ![](/icons/72078dou.gif) 在搜索 ![](/icons/72078de.gif) 时候 ![](/icons/72078dou.gif) 还要根据document和field来构建DTOs(Data transfor object)来返回给web层 ![](/icons/72078dou2.gif) 这点和EJB ![](/icons/72078de.gif) ![](/icons/72078yi.gif) 个缺点很类似 ![](/icons/72078dou.gif) 返回给web层 ![](/icons/72078de.gif) 不能是实体Bean ![](/icons/72078dou.gif) 而是对实体Bean进行封装了 ![](/icons/72078de.gif) DTO ![](/icons/72078dou2.gif) 我们希望 ![](/icons/72078de.gif) 是有类似POJO ![](/icons/72078de.gif) 技术带来 ![](/icons/72078de.gif) 便利 ![](/icons/72078yi.gif) 样 ![](/icons/72078dou.gif) 持久化 ![](/icons/72078de.gif) 是do ![](/icons/72078main.gif) object ![](/icons/72078dou.gif) 返回给web层 ![](/icons/72078de.gif) 也是也是do ![](/icons/72078main.gif) object ![](/icons/72078dou2.gif) 我们在对do ![](/icons/72078main.gif) object进行索引和搜索 ![](/icons/72078de.gif) 时候 ![](/icons/72078dou.gif) 也希望能够直接在do ![](/icons/72078main.gif) object ![](/icons/72078de.gif) 层面进行操作 ![](/icons/72078dou.gif) 而不是直接去和document和field打交道 ![](/icons/72078dou2.gif) 而我们利用compass框架就可以做到这样 ![](/icons/72078dou2.gif) Compass是使用了Lucene ![](/icons/72078de.gif) 搜索引擎框架 ![](/icons/72078dou.gif) 它提供了 ![](/icons/72078yi.gif) 套开源 ![](/icons/72078de.gif) 、高性能 ![](/icons/72078de.gif) 、可以灵活配置 ![](/icons/72078de.gif) 搜索框架 ![](/icons/72078dou.gif) 可以为用户 ![](/icons/72078de.gif) 应用 ![](/icons/72078chengxu.gif) 提供搜索功能 ![](/icons/72078dou2.gif) 它还能和Spring、Hibernate等已有 ![](/icons/72078de.gif) 框架进行整合 ![](/icons/72078dou2.gif) Comapss ![](/icons/72078de.gif) API结构和hibernate非常 ![](/icons/72078de.gif) 相似 ![](/icons/72078dou.gif) 如果使用过hibernate ![](/icons/72078de.gif) ![](/icons/72078chengxu.gif) 员使用comapass ![](/icons/72078dou.gif) 基本上对API就很得心应手 ![](/icons/72078dou2.gif) 我们来看 ![](/icons/72078yi.gif) 个例子 CompassConfiguration config = CompassConfiguration .configure ; Compass compass = config.buildComapss ; CompassSession session = compass.openSession ; CompassTransaction tx = null; try { tx = session.beginTransaction ; Book book = Book ; book. Name("C 编程思想"); book. Author(”Bruce Eckel“); session.save(book); tx.commit ; }catch(Exception e) { (tx!=null) { tx.rollback ; } }finally { session.close ; }
Hiberanete ![](/icons/72078de.gif) ![](/icons/72078chengxu.gif) 员对上面 ![](/icons/72078de.gif) 代码应该是非常 ![](/icons/72078de.gif) 熟悉吧 ![](/icons/72078dou.gif) compass完全让你远离了Lucene ![](/icons/72078de.gif) API ![](/icons/72078dou.gif) 让你 ![](/icons/72078de.gif) 代码更专注和业务逻辑 ![](/icons/72078dou.gif) 而把索引和搜索 ![](/icons/72078de.gif) 事情都交给compass吧 ![](/icons/72078dou2.gif) 这点还带来了 ![](/icons/72078yi.gif) 个优点 ![](/icons/72078dou.gif) 就是利用compass很容易 ![](/icons/72078de.gif) 给已有 ![](/icons/72078de.gif) 系统增加搜索 ![](/icons/72078de.gif) 功能 ![](/icons/72078dou2.gif) 那么如何让do ![](/icons/72078main.gif) object被compass使用呢 ![](/icons/72078dou.gif) 当然和hibernate ![](/icons/72078yi.gif) 样 ![](/icons/72078dou.gif) 只要完成 ![](/icons/72078yi.gif) 些domai object ![](/icons/72078de.gif) 配置文件就可以了 ![](/icons/72078dou.gif) 具体 ![](/icons/72078de.gif) 可以阅读compass附带 ![](/icons/72078de.gif) example ![](/icons/72078dou2.gif) 索引是简单了 ![](/icons/72078dou.gif) 那么搜索呢?? CompassSession session = compass.openSession ; CompassTransaction tx = null; try { tx = session.beginTransaction ; CompassHits hits = session.find("Bruce Eckel"); tx.commit ; CompassHit hit = hits.hit(0); (hit.getAlias .equals("book"); Book book = (Book) hit.getDate ; }catch(Exception e) { (tx!=null) { tx.rollback ; } }finally { session.close ; } 这样就完成了搜索 ![](/icons/72078dou.gif) 只要使用session ![](/icons/72078de.gif) find(String)思路方法 ![](/icons/72078dou.gif) CompassHits是对lucene中 ![](/icons/72078de.gif) Hits ![](/icons/72078de.gif) ![](/icons/72078yi.gif) 个封装 ![](/icons/72078dou2.gif) find思路方法默认会在所有字段中进行该关键字 ![](/icons/72078de.gif) 查找 ![](/icons/72078dou.gif) 如果你希望有自己 ![](/icons/72078de.gif) 方式来查找 ![](/icons/72078dou.gif) compass也提供了Lucene语法 ![](/icons/72078de.gif) 查找,eg: session.find("keyword:key*"); 如果你对这些事务处理 ![](/icons/72078de.gif) 代码比较反感 ![](/icons/72078de.gif) 话 ![](/icons/72078dou.gif) compass也提供了Template and Callback 这样就不需要担心session和transaction ![](/icons/72078de.gif) 处理了 ![](/icons/72078dou2.gif) CompassConfiguration conf = CompassConfiguration .configure .addClass(Author. ); Compass compass = conf.buildCompass ; CompassTemplate template = CompassTemplate(compass); template.save(author); // open a session, transaction, and closes both Author a = (Author) template.execute( CompassCallback { public Object doInCompass(CompassSession session) { // all the actions here are within the same session // and transaction session.save(author); CompassHits hits = session.find("london"); ...
session.load(id); } }); 最后说 ![](/icons/72078de.gif) 就是compass虽然很大 ![](/icons/72078de.gif) 程度上借鉴了hibernate ![](/icons/72078de.gif) ![](/icons/72078yi.gif) 些设计思想 ![](/icons/72078dou.gif) 但是目前版本 ![](/icons/72078de.gif) compass还没有完成 ![](/icons/72078yi.gif) 些hibernate中比较有用 ![](/icons/72078de.gif) 功能 ![](/icons/72078dou2.gif) 1、Compass不支持级联(Casscading) ![](/icons/72078yinwei.gif) 同样是针对do ![](/icons/72078main.gif) object ![](/icons/72078de.gif) 操作 ![](/icons/72078dou.gif) 支持级联(Cascading)是必须 ![](/icons/72078de.gif) ![](/icons/72078dou.gif) 但是compass目前 ![](/icons/72078de.gif) 版本是需要 ![](/icons/72078chengxu.gif) 员对每个对象都来save ![](/icons/72078de.gif) ![](/icons/72078dou2.gif) 2、compass目前还不支持lazy loading 当用户搜索并得到 ![](/icons/72078yi.gif) 个对象 ![](/icons/72078de.gif) 时候 ![](/icons/72078dou.gif) 所有和这个对象相关联 ![](/icons/72078de.gif) 对象也会被同时加载到内存中 ![](/icons/72078dou2.gif) 呵呵 ![](/icons/72078dou.gif) compass还有很多吸引人 ![](/icons/72078de.gif) 地方 ![](/icons/72078dou.gif) 本文只是针对do ![](/icons/72078main.gif) object编程来看待compass带来 ![](/icons/72078de.gif) 便利
相关文章
读者评论
发表评论
|
|