经过了Compass 更智能的搜索引擎(1)–入门的学习,想必对于Compass的使用有了更深的认识了吧。下面谈点更加切合实际开发的东西。那就是CRUD.



面向对象的分页

分页获得的一个个的页面本身就是一个对象,所以我这样设计页面Page.java

  1. /**
  2. * @Date 2016年8月2日
  3. *
  4. * @author Administrator
  5. */
  6. package domain;
  7. import java.util.List;
  8. /**
  9. * @author 郭瑞彪
  10. *
  11. */
  12. public class Page<T> {
  13. private List<T> lists;
  14. private int totalResults;
  15. public List<T> getLists() {
  16. return lists;
  17. }
  18. public void setLists(List<T> lists) {
  19. this.lists = lists;
  20. }
  21. public int getTotalResults() {
  22. return totalResults;
  23. }
  24. public void setTotalResults(int totalResults) {
  25. this.totalResults = totalResults;
  26. }
  27. @Override
  28. public String toString() {
  29. return "Page [lists=" + lists + ", totalResults=" + totalResults + "]";
  30. }
  31. }

dao层实现

  1. /**
  2. * @Date 2016年8月2日
  3. *
  4. * @author Administrator
  5. */
  6. package dao;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. import org.compass.core.CompassHits;
  10. import org.compass.core.CompassSession;
  11. import org.compass.core.CompassTransaction;
  12. import domain.Article;
  13. import domain.Page;
  14. import util.CompassUtils;
  15. /**
  16. * @author 郭瑞彪
  17. *
  18. */
  19. public class ArticleIndexDao {
  20. /**
  21. * 保存到索引库
  22. *
  23. * @param a
  24. */
  25. public void save(Article a) {
  26. CompassSession session = CompassUtils.getCompassSessionFactory().openSession();
  27. CompassTransaction tx = null;
  28. try {
  29. tx = session.beginTransaction();
  30. session.create(a);
  31. tx.commit();
  32. } catch (Exception e) {
  33. if (tx != null) {
  34. tx.rollback();
  35. }
  36. throw new RuntimeException(e);
  37. } finally {
  38. session.close();
  39. }
  40. }
  41. /**
  42. * 删除索引库中对应的索引
  43. *
  44. * @param id
  45. */
  46. public void delete(Integer id) {
  47. CompassSession session = CompassUtils.getCompassSessionFactory().openSession();
  48. CompassTransaction tx = null;
  49. try {
  50. tx = session.beginTransaction();
  51. session.delete(Article.class, id);
  52. tx.commit();
  53. } catch (Exception e) {
  54. if (tx != null) {
  55. tx.rollback();
  56. }
  57. throw new RuntimeException(e);
  58. } finally {
  59. session.close();
  60. }
  61. }
  62. /**
  63. * 更新索引
  64. *
  65. * @param a
  66. */
  67. public void update(Article a) {
  68. CompassSession session = CompassUtils.getCompassSessionFactory().openSession();
  69. CompassTransaction tx = null;
  70. try {
  71. tx = session.beginTransaction();
  72. session.save(a);// 添加或者更新,照应了优化以减少代价
  73. tx.commit();
  74. } catch (Exception e) {
  75. if (tx != null) {
  76. tx.rollback();
  77. }
  78. throw new RuntimeException(e);
  79. } finally {
  80. session.close();
  81. }
  82. }
  83. /**
  84. * 支持分页的查询
  85. *
  86. * @param queryString
  87. * 查询字符串
  88. * @param firstResult
  89. * 开始查询页码
  90. * @param maxResult
  91. * 每页的数据量
  92. * @return
  93. */
  94. public Page search(String queryString, int firstResult, int maxResult) {
  95. CompassSession session = CompassUtils.getCompassSessionFactory().openSession();
  96. CompassTransaction tx = null;
  97. try {
  98. tx = session.beginTransaction();
  99. // 查询,得到结果
  100. CompassHits hits = session.find(queryString);
  101. Page page = new Page();
  102. page.setTotalResults(hits.getLength());
  103. List<Article> articles = new ArrayList<Article>();
  104. // 分页机制,获取一段数据
  105. firstResult = firstResult >= 0 ? firstResult : 0;
  106. int endResult = Math.min(firstResult + maxResult, hits.getLength());
  107. for (int i = firstResult; i < endResult; i++) {
  108. Article a = (Article) hits.data(i);
  109. articles.add(a);
  110. }
  111. page.setLists(articles);
  112. tx.commit();
  113. return page;
  114. } catch (Exception e) {
  115. if (tx != null) {
  116. tx.rollback();
  117. }
  118. throw new RuntimeException(e);
  119. } finally {
  120. session.close();
  121. }
  122. }
  123. }

代码释义

优点一

DAO层代码的设计必须有很强的容错性及弹性。

  1. public void save(Article a) {
  2. CompassSession session = CompassUtils.getCompassSessionFactory().openSession();
  3. CompassTransaction tx = null;
  4. try {
  5. tx = session.beginTransaction();
  6. session.create(a);
  7. tx.commit();
  8. } catch (Exception e) {
  9. if (tx != null) {
  10. tx.rollback();
  11. }
  12. throw new RuntimeException(e);
  13. } finally {
  14. session.close();
  15. }
  16. }

从这段代码中,就能略见一斑了。

如果代码正确执行,则业务正常通过。

如果代码catch到了一场,就会滚刚才的操作,保证数据的正确性,并throw出去,告知上层调用者。

最后,无论代码正确还是错误,都会执行释放资源的操作。保证系统的高效,稳定。

优点二

  1. // 分页机制,获取一段数据
  2. firstResult = firstResult >= 0 ? firstResult : 0;
  3. int endResult = Math.min(firstResult + maxResult, hits.getLength());
  4. for (int i = firstResult; i < endResult; i++) {
  5. Article a = (Article) hits.data(i);
  6. articles.add(a);
  7. }

我们应该学习的就是这样的敏捷开发的经验,充分的考虑到可能发生的状况。来保证代码的正确的运行。

Compass 更智能的搜索引擎(2)--进阶的更多相关文章

  1. Compass 更智能的搜索引擎(3)--高亮,排序,过滤以及各种搜索

    要想使得一个搜索系统更加的完美,查询精确度和页面显示算是其中比较重要的两个方面.今天,我们就来谈谈怎么使得我们的搜索系统更加的完美. 关于分词 下载地址 配置 关于高亮 关于排序 原理 冗余字段 使用 ...

  2. Compass 更智能的搜索引擎(1)--入门

    学完了前面的Lucene系列教程: 全文检索 Lucene(1)–入门 全文检索 Lucene(2)–进阶 全文检索 Lucene(3)–分页 全文检索 Lucene(4)–高亮 Lucene确实是个 ...

  3. iPad版微信终于来临了 微信5.4版搜索更智能 转账就是发消息

    等待甚久的iPad版微信终于来临了!昨日微信iOS版本更新至5.4.0.16,新增功能包括搜索公众号.识别图中二维码.面对面收钱,同时适配iPad.(微信5.4安卓版重回ios风格 导航菜单都放底栏位 ...

  4. C# .NET更智能的数据库操作的封装

    前述: 对数据库操作的封装,相信网络上已经有一大堆,ORM框架,或者是.NET本身的EF,都很好的支持数据库操作.这篇文章是分享自己所思考的,对数据库操作的简单封装.我对于这篇文章,认为被浏览者所关注 ...

  5. 使用OpenAPI构建更智能的API

    像OpenAPI这样的API描述规范是一个关键工具,您应该尽可能地将其好好掌握,记录和执行API的工作由计算机和开发人员完成:OpenAPI 3.0现在允许额外的表现力,可以让机器为我们做更多有用的工 ...

  6. Win10系统升级更新方式将会更智能

    使用Win10系统的你肯定遇到过在工作时开始自动更新而不得不搁置工作的情况,想必你也已经被Win10系统的自动更新折磨不已,不过这种情况将会马上得到改观. 微软现在已经开始寻找更智能的版本升级更新方式 ...

  7. 从程序到系统:建立一个更智能的世界——记Joseph Sifakis“21世纪的计算”大会主题演讲

    Sifakis"21世纪的计算"大会主题演讲" title="从程序到系统:建立一个更智能的世界--记Joseph Sifakis"21世纪的计算&q ...

  8. 微软Project Oxford帮助开发人员创建更智能的应用

    Oxford帮助开发人员创建更智能的应用" title="微软Project Oxford帮助开发人员创建更智能的应用"> 假设你是一名对关于健身的应用充满奇思妙想 ...

  9. AI剪辑和自定义UI,打造更智能的剪辑体验

    为满足开发者构建高效的应用内视频编辑能力,7月的HMS Core 6.0 推出了视频编辑服务(Video Editor Kit),一站式的视频处理能力获得了积极反响.同时,我们也关注到开发者需要集成丰 ...

随机推荐

  1. python数据挖掘_Json结构分析

    json是一种轻量级的数据交换格式,也可以说是一种配置文件的格式 这种格式的文件是我们在数据处理经常会遇到的 python提供内置的模块json,只需要在使用前导入即可 你可以通过帮助函数查看json ...

  2. [AHOI 2012]树屋阶梯

    Description 暑假期间,小龙报名了一个模拟野外生存作战训练班来锻炼体魄,训练的第一个晚上,教官就给他们出了个难题.由于地上露营湿气重,必须选择在高处的树屋露营.小龙分配的树屋建立在一颗高度为 ...

  3. [HNOI 2009]有趣的数列

    Description 我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件: (1)它是从1到2n共2n个整数的一个排列{ai}: (2)所有的奇数项满足a1<a3<…&l ...

  4. [USACO 08JAN]Haybale Guessing

    Description The cows, who always have an inferiority complex about their intelligence, have a new gu ...

  5. 51 nod 1023 石子归并 V3(GarsiaWachs算法)

    1023 石子归并 V3基准时间限制:2 秒 空间限制:131072 KB 分值: 320 难度:7级算法题 N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一 ...

  6. 51nod 1682 中位数计数

    1682 中位数计数基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均 ...

  7. poj 1228 稳定凸包

    Grandpa's Estate Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12337   Accepted: 3451 ...

  8. spoj 1676 AC自动机+矩阵快速

    Text Generator Time Limit: 1386MS   Memory Limit: 1572864KB   64bit IO Format: %lld & %llu Submi ...

  9. Spring AOP @Around @Before @After 区别

    此段小代码演示了spring aop中@Around @Before @After三个注解的区别@Before是在所拦截方法执行之前执行一段逻辑.@After 是在所拦截方法执行之后执行一段逻辑.@A ...

  10. Spring @Component的作用详细介绍

    @component 作用 1.@controller 控制器(注入服务)2.@service 服务(注入dao)3.@repository dao(实现dao访问)4.@component (把普通 ...