经过了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. pat 1001 A+B Format

    题目链接:传送门 题目简述: 1. 给定两个整数值a,b: 2.范围-1000000 <= a, b <= 1000000: 3.按指定格式输出结果 例:-100000 9 输出: -99 ...

  2. [BJOI 2010]次小生成树Tree

    Description 小 C 最近学了很多最小生成树的算法,Prim 算法.Kurskal 算法.消圈算法等等. 正当小 C 洋洋得意之时,小 P 又来泼小 C 冷水了.小 P 说,让小 C 求出一 ...

  3. 计蒜客NOIP模拟赛6 D1T1Diamond-square

    Diamond-square 算法是一种能够用于生成噪声的算法,现在我们考虑这个算法的一个变种. 你有一个 2^n\times 2^n2​n​​×2​n​​ 的网格,一共有 (2^n+1)^2(2​n ...

  4. 51 nod 1681 公共祖先 (主席树+dfs序)

    1681 公共祖先 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题   有一个庞大的家族,共n人.已知这n个人的祖辈关系正好形成树形结构(即父亲向儿子连边). 在另 ...

  5. [BZOJ]1050 旅行comf(HAOI2006)

    图论一直是小C的弱项,相比其它题型,图论的花样通常会更多一点,套路也更难捉摸. Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权 ...

  6. SPOJ Query on a tree V

    You are given a tree (an acyclic undirected connected graph) with N nodes. The tree nodes are number ...

  7. 【Python3.6+Django2.0+Xadmin2.0系列教程之三(入门篇-下)】学生信息管理系统

    上一篇我们已经初步的构建起了一个学生管理系统的模型,现在接着来继续完善它吧. 1.上传图片/文件等资源 有时候需要添加一些附件,例如,新生刚入学,大家相互之间还不熟悉,希望能通过照片来加深印象,并且方 ...

  8. Delphi7.0常用函数-属性-事件

    abort 函数 引起放弃的意外处理 addexitproc 函数 将一过程添加到运行时库的结束过程表中 addr 函数 返回指定对象的地址 adjustlinebreaks 函数 将给定字符串的行分 ...

  9. CSS3左右间歇晃动效果

    今天在做一个活动页面时,产品想要在页面中添加一个吸引人注意的小图片左右晃动的效果,并且该效果是间歇执行的.我一想应该挺简单的吧,二话没说就答应了,谁知在真正实现的时候才发现还是有些许困难的.于是就在网 ...

  10. kibana使用

    最近,被老大叫写一个kibana的使用方法给所有人用. 注意的一点: 能不用空格表示OR或者AND就不用空格表示,因为要么全用要么全部不用,否则会因为解析搜索同级的时候,若出现空格和OR,会冲突覆盖意 ...