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



面向对象的分页

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

/**
 * @Date 2016年8月2日
 *
 * @author Administrator
 */
package domain;

import java.util.List;

/**
 * @author 郭瑞彪
 *
 */
public class Page<T> {

    private List<T> lists;

    private int totalResults;

    public List<T> getLists() {
        return lists;
    }

    public void setLists(List<T> lists) {
        this.lists = lists;
    }

    public int getTotalResults() {
        return totalResults;
    }

    public void setTotalResults(int totalResults) {
        this.totalResults = totalResults;
    }

    @Override
    public String toString() {
        return "Page [lists=" + lists + ", totalResults=" + totalResults + "]";
    }

}

dao层实现

/**
 * @Date 2016年8月2日
 *
 * @author Administrator
 */
package dao;

import java.util.ArrayList;
import java.util.List;

import org.compass.core.CompassHits;
import org.compass.core.CompassSession;
import org.compass.core.CompassTransaction;

import domain.Article;
import domain.Page;
import util.CompassUtils;

/**
 * @author 郭瑞彪
 *
 */
public class ArticleIndexDao {

    /**
     * 保存到索引库
     *
     * @param a
     */
    public void save(Article a) {

        CompassSession session = CompassUtils.getCompassSessionFactory().openSession();
        CompassTransaction tx = null;
        try {
            tx = session.beginTransaction();
            session.create(a);
            tx.commit();
        } catch (Exception e) {
            if (tx != null) {
                tx.rollback();
            }
            throw new RuntimeException(e);
        } finally {
            session.close();
        }

    }

    /**
     * 删除索引库中对应的索引
     *
     * @param id
     */
    public void delete(Integer id) {
        CompassSession session = CompassUtils.getCompassSessionFactory().openSession();
        CompassTransaction tx = null;
        try {
            tx = session.beginTransaction();
            session.delete(Article.class, id);
            tx.commit();
        } catch (Exception e) {
            if (tx != null) {
                tx.rollback();
            }
            throw new RuntimeException(e);
        } finally {
            session.close();
        }

    }

    /**
     * 更新索引
     *
     * @param a
     */
    public void update(Article a) {
        CompassSession session = CompassUtils.getCompassSessionFactory().openSession();
        CompassTransaction tx = null;
        try {
            tx = session.beginTransaction();
            session.save(a);// 添加或者更新,照应了优化以减少代价
            tx.commit();
        } catch (Exception e) {
            if (tx != null) {
                tx.rollback();
            }
            throw new RuntimeException(e);
        } finally {
            session.close();
        }

    }

    /**
     * 支持分页的查询
     *
     * @param queryString
     *            查询字符串
     * @param firstResult
     *            开始查询页码
     * @param maxResult
     *            每页的数据量
     * @return
     */
    public Page search(String queryString, int firstResult, int maxResult) {
        CompassSession session = CompassUtils.getCompassSessionFactory().openSession();
        CompassTransaction tx = null;
        try {
            tx = session.beginTransaction();
            // 查询,得到结果
            CompassHits hits = session.find(queryString);
            Page page = new Page();
            page.setTotalResults(hits.getLength());
            List<Article> articles = new ArrayList<Article>();
            // 分页机制,获取一段数据
            firstResult = firstResult >= 0 ? firstResult : 0;
            int endResult = Math.min(firstResult + maxResult, hits.getLength());
            for (int i = firstResult; i < endResult; i++) {
                Article a = (Article) hits.data(i);
                articles.add(a);
            }
            page.setLists(articles);
            tx.commit();
            return page;
        } catch (Exception e) {
            if (tx != null) {
                tx.rollback();
            }
            throw new RuntimeException(e);
        } finally {
            session.close();
        }
    }

}

代码释义

优点一

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

public void save(Article a) {

        CompassSession session = CompassUtils.getCompassSessionFactory().openSession();
        CompassTransaction tx = null;
        try {
            tx = session.beginTransaction();
            session.create(a);
            tx.commit();
        } catch (Exception e) {
            if (tx != null) {
                tx.rollback();
            }
            throw new RuntimeException(e);
        } finally {
            session.close();
        }

    }

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

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

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

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

优点二

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

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

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. MySQL InnoDB 索引原理

    本文由  网易云发布. 作者:范鹏程,网易考拉海购 InnoDB是 MySQL最常用的存储引擎,了解InnoDB存储引擎的索引对于日常工作有很大的益处,索引的存在便是为了加速数据库行记录的检索.以下是 ...

  2. 实验吧_who are you?(盲注)

    who are you? 翻翻源码,抓抓包,乱试一通都没有什么结果 题目中提示有ip,立马应该联想到X-Forwarded-For 虽然知道是这个方面的题,但完全不知道从何入手,悄咪咪去翻一下wp 才 ...

  3. ●BZOJ 2154 Crash的数字表格

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2154 题解: 莫比乌斯反演. 题意还是很清楚的,就不赘述了. 显然有 $ANS=\sum_{ ...

  4. 【bzoj4569 scoi2016】萌萌哒

    题目描述 一个长度为n的大数,用S1S2S3...Sn表示,其中Si表示数的第i位,S1是数的最高位,告诉你一些限制条件,每个条件表示为四个数,l1,r1,l2,r2,即两个长度相同的区间,表示子串S ...

  5. 两个文件比较之comm命令

    comm命令可用于两个文件之间的比较.它有很多不错的选项可用来调整输出,以便我们执行交集.求差(difference)以及差集操作. 交集:打印出两个文件所共有的行. 求差:打印出指定文件所包含的 ...

  6. python正则表达式与Re库

    正则表达式是用来简洁表达一组字符串的表达式,一行胜千言,有点类似于数列的通项公式. 在python中提供了re库(regular expression)即正则表达式库,内置于python的标准库中,导 ...

  7. c语言第六次作业v

    (一)改错题 序列求和:输入一个正实数eps,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... ,精确到最后一项的绝对值小于eps(保留6位小数). 输入输出样例: Input e ...

  8. js 在iframe子页面获取父页面元素,或在父页面 获取iframe子页面的元素的几种方式

    用JS或jquery访问页面内的iframe,兼容IE/FF 注意:框架内的页面是不能跨域的! 假设有两个页面,在相同域下. index.html 文件内含有一个iframe: XML/HTML代码 ...

  9. SQL使用总结-like,MAX,MIN

    1. 时间索引不容许使用like 对时间索引适应like,会时间索引变成字符串操作,成为遍历动作,失去索引价值. 错误写法: EXPLAIN  SELECT AVG(data_value) AS av ...

  10. three.js 3D 动画场景

    Three.js 是一款运行在浏览器中的 3D 引擎,你可以用它创建各种三维场景,包括了摄影机.光影.材质等各种对象.使用它它能让 WebGL 变得更加简单. 下面用Three.js渲染一个物体360 ...