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

简介: 经过了Compass 更智能的搜索引擎(1)–入门的学习,想必对于Compass的使用有了更深的认识了吧。下面谈点更加切合实际开发的东西。那就是CRUD.面向对象的分页dao层实现代码释义优点一优点二面向对象的分页分页获得的一个个的页面本身就是一个对象,所以我这样设计页面Page.

经过了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);
            }

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

目录
相关文章
|
4月前
|
人工智能 Java
AI大模型----SpringBoot添加放行最简单的方式@AuthAccess,问题库构思,概念title,答案text,搜索search
AI大模型----SpringBoot添加放行最简单的方式@AuthAccess,问题库构思,概念title,答案text,搜索search
|
6月前
|
搜索推荐 应用服务中间件 PHP
小课堂 -- 搜索引擎语法
小课堂 -- 搜索引擎语法
37 0
|
Java Apache 索引
白话Elasticsearch10-深度探秘搜索技术之基于dis_max实现best fields策略进行多字段搜索
白话Elasticsearch10-深度探秘搜索技术之基于dis_max实现best fields策略进行多字段搜索
88 0
|
前端开发
前端知识学习案例5vs code-搜索和替换全局内容
前端知识学习案例5vs code-搜索和替换全局内容
83 0
前端知识学习案例5vs code-搜索和替换全局内容
|
SQL 开发框架 Java
OR-Mapping 设计改进(ORMapping 简介)| 学习笔记
简介:快速学习 OR-Mapping 设计改进(ORMapping 简介)
246 0
OR-Mapping 设计改进(ORMapping 简介)| 学习笔记
|
前端开发 安全 Java
PassJava 开源(十四)之 管理后台-题目类型功能
PassJava 开源(十四)之 管理后台-题目类型功能
262 0
PassJava 开源(十四)之 管理后台-题目类型功能
|
Web App开发 Python
网页结构的简介和Xpath语法的入门教程
相信很多小伙伴已经听说过Xpath,之前小编也写过一篇关于Xpath的文章,感兴趣的小伙伴可以戳这篇文章如何利用Xpath抓取京东网商品信息以及Python网络爬虫四大选择器(正则表达式、BS4、Xpath、CSS)总结。
8105 0
|
Web App开发 数据采集 数据库
2.HtmlAgilityPack 爬取优酷电影名进阶(所有分类+多线程)
上一章节中我们实现了对优酷单页面的爬取,简单进行回顾一下,使用HtmlAgilityPack库,对爬虫的爬取一共分为三步 爬虫步骤 加载页面 解析数据 保存数据 继第一篇文档后的爬虫进阶,本文章主要是对上一篇的进阶。
985 0