2013-05-23期-定时抓取数据库内容
2014-02-08 09:18
246 查看
1.修改ArticleMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.searchengine.dao.ArticleDao"> <!-- 取得内容列表 --> <select id="getContentList" resultType="contentObject" > SELECT * FROM article </select> <!-- 取得需要更新的内容列表 --> <select id="getUpdateContentList" resultType="contentObject" > SELECT * FROM article where flag=1 </select> <insert id="insertArticle" parameterType="contentObject" useGeneratedKeys="true" keyProperty="id"> insert article(title,content,createDate,flag) value (#{title},#{content},#{createDate},1) </insert> <!-- 更新标识位 --> <update id="updateArticleFlag" > update article set flag = 0 where flag=1 </update> </mapper>
2.修改ArticleDao.java
public interface ArticleDao { /** * Function:取得所有文章内容 * @author JLC * @return */ public List<ContentObject> getContentList(); /** * Function:取得要更新的文章内容 * @author JLC * @return */ public List<ContentObject> getUpdateContentList(); /** * Function:新增内容 * @author JLC * @param article */ public void insertArticle(ContentObject article); /** * Function:更新标识位 * @author JLC */ public void updateArticleFlag(); }
3.修改ContentObject.java
public class ContentObject extends BaseObject{ /** * */ private static final long serialVersionUID = 9165845707595907325L; private Long id; /** * 状态 1已更新 0未更新 */ private int flag=1; /** * 内容标题 */ private String title; /** * 内容详细信息 */ private String content; /** * 内容创建时间 */ private Date createDate = new Date(); public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public Date getCreateDate() { return createDate; } public void setCreateDate(Date createDate) { this.createDate = createDate; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public int getFlag() { return flag; } public void setFlag(int flag) { this.flag = flag; } @Override public String toString() { return ReflectionToStringBuilder.toString(this); } }
4.修改PackContentObject.java
/** * 转换内容对象为Document对象 * @param ct * @return */ public static Document convertContentToDoc(ContentObject ct){ Document doc = new Document(); //Field.Store.YES 表示存储内容 doc.add(new LongField("id", ct.getId(), Field.Store.YES)); doc.add(new StringField("title", ct.getTitle(), Field.Store.YES)); doc.add(new TextField("content", ct.getContent(),Field.Store.YES)); doc.add(new LongField("createDate",new Date().getTime(),Field.Store.YES)); return doc; }
5.修改ContentService.java
public interface ContentService { /** * Function:取得内容列表 * @author JLC * @return * @throws Exception */ public List<ContentObject> getContentList() throws Exception; /** * Function:保存文章内容 * @author JLC * @param article * @throws Exception */ public void saveArticle(ContentObject article)throws Exception; }
6.修改ContentServiceImpl.java
public class ContentServiceImpl implements ContentService { @Autowired private ArticleDao articleDao; public void setArticleDao(ArticleDao articleDao) { this.articleDao = articleDao; } public List<ContentObject> getContentList() throws Exception { return articleDao.getContentList(); } public void saveArticle(ContentObject article) throws Exception { if(article!=null) articleDao.insertArticle(article); } }
7.修改SearchAction.java
@Action( value = "add", results = { @Result(name = SUCCESS, type="redirect", location = "/index.jsp") } ) public String addContent() throws Exception { try{ contentService.saveArticle(contentObj); }catch(Exception e){ e.printStackTrace(); } return SUCCESS; }
8.修改Job.java
public class Job { @Autowired private ArticleDao articleDao; /* 一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。 按顺序依次为 秒(0~59) 分钟(0~59) 小时(0~23) 天(月)(0~31,但是你需要考虑你月的天数) 月(0~11) 天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT) 7.年份(1970-2099) 其中每个元素可以是一个值(如6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时), 一个列表(1,3,5),通配符。由于"月份中的日期"和"星期中的日期"这两个元素互斥的,必须要对其中一个设置?. 0 0 10,14,16 * * ? 每天上午10点,下午2点,4点 0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时 0 0 12 ? * WED 表示每个星期三中午12点 "0 0 12 * * ?" 每天中午12点触发 "0 15 10 ? * *" 每天上午10:15触发 "0 15 10 * * ?" 每天上午10:15触发 "0 15 10 * * ? *" 每天上午10:15触发 "0 15 10 * * ? 2005" 2005年的每天上午10:15触发 "0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发 "0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发 "0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 "0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发 "0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发 "0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发 "0 15 10 15 * ?" 每月15日上午10:15触发 "0 15 10 L * ?" 每月最后一日的上午10:15触发 "0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发 "0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发 "0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发 有些子表达式能包含一些范围或列表 例如:子表达式(天(星期) )可以为 “MON-FRI”,“MON,WED,FRI”,“MON-WED,SAT” “*”字符代表所有可能的值 因此,“*”在子表达式(月 )里表示每个月的含义,“*”在子表达式(天(星期) )表示星期的每一天 “/”字符用来指定数值的增量 例如:在子表达式(分钟)里的“0/15”表示从第0分钟开始,每15分钟 在子表达式(分钟)里的“3/20”表示从第3分钟开始,每20分钟(它和“3,23,43”)的含义一样 “?”字符仅被用于天(月)和天(星期)两个子表达式,表示不指定值 当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为“?” “L” 字符仅被用于天(月)和天(星期)两个子表达式,它是单词“last”的缩写 但是它在两个子表达式里的含义是不同的。 在天(月)子表达式中,“L”表示一个月的最后一天 在天(星期)自表达式中,“L”表示一个星期的最后一天,也就是SAT 如果在“L”前有具体的内容,它就具有其他的含义了 例如:“6L”表示这个月的倒数第6天,“FRIL”表示这个月的最一个星期五 注意:在使用“L”参数时,不要指定列表或范围,因为这会导致问题 字段 允许值 允许的特殊字符 秒 0-59 , - * / 分 0-59 , - * / 小时 0-23 , - * / 日期 1-31 , - * ? / L W C 月份 1-12 或者 JAN-DEC , - * / 星期 1-7 或者 SUN-SAT , - * ? / L C # 年(可选) 留空, 1970-2099 , - * / */ /** * Function:更新索引内容 * @author JLC */ //@Scheduled(fixedDelay = 5000) 5秒更新一次 @Scheduled(cron = "0 0/1 * * * ?") //一分钟更新一次 public void doUpdateIndexData(){ SearchEngineCore se = SearchObject.getInstance().getLuceneContext("search"); //List<Document> docList = getWebContentDocuments(); List<Document> docList = getDBContentDocuments(); for(Document doc:docList){ try{ se.getTw().updateDocument(new Term("id",doc.get("id")), doc); se.getTw().addDocument(doc); se.commitIndex(); se.refreshData(); se.getNRTManager().maybeRefresh(); articleDao.updateArticleFlag(); }catch(Exception e){ e.printStackTrace(); } } System.out.println("定时抓取完毕"); } /** * Function:抓取网页内容 * @author JLC * @return */ public List<Document> getWebContentDocuments(){ List<Document> docs = new ArrayList<Document>(); WebContent wc = new WebContent(); Document doc1 = PackContentObject.convertContentToDoc(wc.getContentFromSite("http://news.163.com")); docs.add(doc1); Document doc2 = PackContentObject.convertContentToDoc(wc.getContentFromSite("http://news.sohu.com/")); docs.add(doc2); return docs; } /** * Function:抓取数据库内容 * @author JLC * @return */ public List<Document> getDBContentDocuments(){ List<Document> docs = new ArrayList<Document>(); //内容列表 List<ContentObject> contentList = articleDao.getUpdateContentList(); for(ContentObject cobj:contentList){ Document doc = PackContentObject.convertContentToDoc(cobj); docs.add(doc); } return docs; } public void setArticleDao(ArticleDao articleDao) { this.articleDao = articleDao; } }
9.修改article表
create database if not exists `test`; USE `test`; DROP TABLE IF EXISTS `article`; CREATE TABLE `article` ( `id` bigint(20) NOT NULL auto_increment, `title` varchar(50) default NULL, `content` text, `createdate` datetime default NULL, `flag` int(11) default NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
10.启动应用进入 http://localhost:8080/searchengine/addcontent.jsp 添加内容到数据库 一分钟后会更新到lucene索引库中,搜索结果如下
相关文章推荐
- 微信搜一搜迈出新的一步,好戏来了
- 搜狗百度360市值齐跌:搜索引擎们陷入集体焦虑?
- 本人即将筹备败家日志,敬请期待!
- IE:使用搜索助手
- 用SQL建立索引的方法步骤
- SQL效率提升之一些SQL编写建议并有效利用索引
- SQLSERVER的非聚集索引结构深度理解
- SQL Server误区30日谈 第8天 有关对索引进行在线操作的误区
- SQL Server 索引介绍
- SqlServer 索引自动优化工具
- 优化 SQL Server 索引的小技巧
- sqlserver 索引的一些总结
- mysql中索引使用不当速度比没加索引还慢的测试
- Sql Server 查询性能优化之走出索引的误区分析
- sqlserver索引的原理及索引建立的注意事项小结
- 基于文本的搜索
- 使用Sphinx对索引进行搜索
- asp 多关键词搜索的简单实现方法
- 关于Sphinx创建全文检索的索引介绍