Compass 更智能的搜索引擎(2)--进阶

来源:互联网 发布:亚马逊app网络连不上 编辑:程序博客网 时间:2024/05/04 04:22

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


    • 面向对象的分页
    • dao层实现
    • 代码释义
      • 优点一
      • 优点二


面向对象的分页

分页获得的一个个的页面本身就是一个对象,所以我这样设计页面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);            }

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

1 0