专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »编程综合 » 领域模型:使用领域模型(domain object)来进行索引、搜索 »正文

领域模型:使用领域模型(domain object)来进行索引、搜索

来源: 发布时间:星期四, 2009年1月15日 浏览:9次 评论:0
  这给员带来了很大方便在业务逻辑处理上只要针对do object就可以

  使用Lucene进行索引、搜索开发时候最经常碰到概念就是Document 和Field个不得不去做事情就是将领域对象属性映射到documentfield中去在搜索时候还要根据document和field来构建DTOs(Data transfor object)来返回给web层这点和EJB个缺点很类似返回给web层不能是实体Bean而是对实体Bean进行封装了DTO

  我们希望是有类似POJO技术带来便利持久化是do object返回给web层也是也是do object

  我们在对do object进行索引和搜索时候也希望能够直接在do object层面进行操作而不是直接去和document和field打交道而我们利用compass框架就可以做到这样

  Compass是使用了Lucene搜索引擎框架它提供了套开源、高性能、可以灵活配置搜索框架可以为用户应用提供搜索功能它还能和Spring、Hibernate等已有框架进行整合

  ComapssAPI结构和hibernate非常相似如果使用过hibernate员使用comapass基本上对API就很得心应手

  我们来看个例子

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员对上面代码应该是非常熟悉吧compass完全让你远离了LuceneAPI让你代码更专注和业务逻辑而把索引和搜索事情都交给compass吧这点还带来了个优点就是利用compass很容易给已有系统增加搜索功能

  那么如何让do object被compass使用呢当然和hibernate只要完成些domai object配置文件就可以了具体可以阅读compass附带example

  索引是简单了那么搜索呢??

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;
}


  这样就完成了搜索只要使用sessionfind(String)思路方法CompassHits是对lucene中Hits个封装find思路方法默认会在所有字段中进行该关键字查找如果你希望有自己方式来查找compass也提供了Lucene语法查找,eg:

  session.find("keyword:key*");

  如果你对这些事务处理代码比较反感compass也提供了Template and Callback

  这样就不需要担心session和transaction处理了

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);
}
});




  最后说就是compass虽然很大程度上借鉴了hibernate些设计思想但是目前版本compass还没有完成些hibernate中比较有用功能

  1、Compass不支持级联(Casscading)

  同样是针对do object操作支持级联(Cascading)是必须但是compass目前版本是需要员对每个对象都来save

  2、compass目前还不支持lazy loading

  当用户搜索并得到个对象时候所有和这个对象相关联对象也会被同时加载到内存中

  呵呵compass还有很多吸引人地方本文只是针对do object编程来看待compass带来便利



0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: