`
longzhun
  • 浏览: 370152 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

更新索引策略之一(非繁忙时刻更新)

 
阅读更多

 

半夜更新:也可以叫做非繁忙时段更新。

思路:从上次遍历的最后一条开始.我们需要保存一个数据库中的id,也就是每次遍历后的最大id,以方便下次遍历的时候从这个id开始,判断只去比这个id大的记录进行更新索引。

1.创建一个txt文件

2.第一次遍历,将遍历后的最大id存入txt文件

3.以后每次遍历,从txt文件中取出id,并在遍历数据库结束后更新最大id.

 

         4.定制任务,要求每天凌晨2点运行此程序.

 

定制任务的方式

 

1.打开一个网页,网页中有一段js代码,判断时间如果是凌晨2点那么将页面跳转到我们的action路径,从而启动任务。

2.Spring提供的quartz来进行任务定制

 

代码如下:

 

	<!--定制任务  -->
	<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref bean="doTime"/>
			</list>
		</property>
		
		<property name="configLocation" value="classpath:quartz.properties"/>
	</bean>
	
	
	<!-- 定义触发时间 -->
	<bean id="doTime" class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail">
			<ref bean="ci"/>
		</property>
		
		<property name="cronExpression">
			<value>0/5 * * * * ?</value>
		</property>
	</bean>
	
	<!--指定时间工作的具体类  -->
	<bean id="ci" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject" ref="createIndex" />
		<property name="targetMethod" value="doJob" />
		<property name="concurrent" value="false" /> <!--将并发设置为false-->
	</bean>

 

 

org.quartz.scheduler.instanceName = TestScheduler
org.quartz.scheduler.instanceId = AUTO

 

 

 

public class CreateIndex{
	// 注入manager层
	private ArticleManager articleManager;

	public void setArticleManager(ArticleManager articleManager) {
		this.articleManager = articleManager;
	}
	public void doJob()throws Exception{
		System.out.println("任务执行!");
		this.createIndex();
	}
	public void createIndex() throws Exception {
		// 实例化分词器,使用的是中文分词器
		Analyzer analyzer = new PaodingAnalyzer();
		// 指定要保存的文件路径并保存到FSDirectory中
		System.out.println(URLDecoder.decode(AnalyzerAction.class
				.getResource("/date/index/article/").toString(),"UTF-8").substring(6));
		FSDirectory directory = FSDirectory.getDirectory(URLDecoder.decode(AnalyzerAction.class
				.getResource("/date/index/article/").toString(),"UTF-8").substring(6));
		// true表示覆盖原来已经创建的索引,如果是false表示不覆盖,而是继续添加索引
		IndexWriter writer = new IndexWriter(directory, analyzer, true);

		String articleId = this.readText();
		if(null == articleId || "".equals(articleId)){
			articleId = "0";
		}
		List list = articleManager.articleList(Integer.parseInt(articleId));

		for (Iterator it = list.iterator(); it.hasNext();) {
			Document doc = new Document();
			Article article = (Article) it.next();
			doc.add(new Field("id", String.valueOf(article.getId()), Field.Store.YES,
					Field.Index.UN_TOKENIZED));
			doc.add(new Field("article_title", article.getArticleTitle(), Field.Store.YES,
					Field.Index.TOKENIZED));
			String content = FunctionUtil.Html2Text(article.getArticleContent());
			doc.add(new Field("article_content", content, Field.Store.YES,
					Field.Index.TOKENIZED));
			articleId = String.valueOf(article.getId());
			writer.addDocument(doc);
		}
		writer.optimize();
		writer.close();
		
		//最后一篇文章的id写入txt文件
		this.writerText(articleId);
	}
	
	//从txt文件中读入id
	public String readText(){
		String content = "";
		InputStream in = null;
		try {
			in = AnalyzerAction.class.getResourceAsStream("/date/index/article/" + "articlesId.txt");
			Reader re = new InputStreamReader(in,"UTF-8");
			char[] chs = new char[1024];
			int count;
			
			while((count = re.read(chs)) != -1){
				content += new String(chs,0,count);
			}
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally{
			if(in != null){
				try {
					in.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		return content;
		
	}
	//向txt文件中写入id
	public void writerText(String articleId){
		BufferedWriter bw = null;
		try {
			String path = URLDecoder.decode(AnalyzerAction.class
					.getResource("/date/index/article/"+ "articlesId.txt").toString(),"UTF-8").substring(6);
			File file = new File(path);
			bw = new BufferedWriter(new FileWriter(file));
			bw.write(articleId);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			if(bw != null){
				try {
					bw.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

 

分享到:
评论

相关推荐

    索引介绍聚集索引和非聚集索引

    - **更新性能**:由于聚集索引会影响数据行的物理顺序,因此在插入、删除或更新操作时可能会引起更多的页面分裂或重组,而非聚集索引则相对较少受到影响。 - **存储空间**:聚集索引由于包含实际的数据行,因此通常...

    nexus index 索引手动更新

    因此,"nexus index 索引手动更新"是一个实用技巧,它允许用户主动触发索引的更新,而不是被动地等待自动更新完成。这样可以节省时间,尤其是在急需获取最新组件信息或者需要快速部署项目的时候。 手动更新Nexus...

    SQL Server 索引结构及其使用(聚集索引与非聚集索引)

    数据库索引是数据库性能优化的关键技术之一。SQL Server 提供了两种索引:聚集索引(clustered index)和非聚集索引(nonclustered index)。本文将详细介绍聚集索引和非聚集索引的概念、区别、使用场景和误区。 ...

    数据库非聚集索引 聚集索引 模式 索引

    非聚集索引在查询性能上很有优势,尤其是对于多列联合索引和范围查询,但它们会占用额外的存储空间,并且在插入、删除和更新时可能需要维护索引。 接着是**聚集索引**。聚集索引决定了数据在表中的物理存储顺序。在...

    聚集索引和非聚集索引的区别

    相比之下,非聚集索引(Non-Clustered Index)并不影响数据的物理存储顺序。非聚集索引拥有自己的独立结构,其叶子节点通常包含键值以及指向实际数据行的书签或指针。这意味着,查询非聚集索引时,数据库系统需要两...

    SQL Server群集与非群集索引设计指南.pdf )

    群集索引是SQL Server中最关键的索引类型之一,其设计直接影响到数据库的整体性能和长期可维护性。群集索引决定了表中数据的物理存储顺序,因此,合理设计群集索引可以显著提升查询速度和减少I/O操作。 #### 静态与...

    聚集索引与非聚集索引的区别

    非聚焦索引则是一种索引,其中索引的逻辑顺序与磁盘上数据行的物理存储顺序不一致。在非聚焦索引中,索引结构与数据分开存储,索引条目包含了指向实际数据行的指针。 - **定义**:非聚焦索引中,索引条目包含了指向...

    solr增量导入更新索引包

    增量导入更新索引包是Solr中的一项重要功能,它允许系统仅处理自上次完整索引以来发生改变的数据,从而大大提升了效率并降低了资源消耗。下面将详细阐述Solr增量更新的相关知识点。 1. **Solr的索引机制** Solr...

    论文研究-一种支持高效检索的双重索引策略.pdf

    本文探讨了一种双重索引策略,其目的是为了提升XML(可扩展标记语言)文档集合的检索效率,特别是解决基于路径表达式查询效率低的问题。文章提出了一种高效的索引方法,该方法结合了倒排文档和结构索引,在XML文档中...

    一种分布式实时数据系统中的基于动态索引策略的存取定位机制.pdf

    综上所述,一种分布式实时数据系统中的基于动态索引策略的存取定位机制,为实时数据库提供了一种高效、稳定、可扩展的解决方案。它不仅解决了分布式系统中数据存取的效率问题,还封装了系统的复杂性,使得用户能够...

    分区索引,本地索引,全局索引的区别

    本地索引是一种特殊的分区索引,它与表的分区紧密相关,即索引的分区策略完全遵循表的分区策略。 ##### 1. 特点: - **分区机制**:本地索引的分区键等同于表的分区键,分区数也等同于表的分区数。 - **前缀索引**...

    slor定时增量更新索引dataimport.properties

    slor定时增量更新索引dataimport.properties

    索引合并策略

    索引合并是优化数据检索性能的关键技术之一,尤其在处理大量数据时,如Lucene这样的全文检索库,索引合并策略显得尤为重要。本文将详细探讨索引合并的原理以及如何在Lucene中实现这一策略。 索引合并,顾名思义,是...

    Mysql的索引及优化策略

    Mysql的索引及优化策略,个人感觉还不错

    郑保卫 - 索引优化策略及实战

    在郑保卫于2015年Oracle技术嘉年华(OTN)分会场的演讲中,他深入探讨了索引优化策略及实战,并分享了多个实战案例。以下是从标题、描述、标签和提供的部分内容中提炼出的知识点。 一、索引使用原则 索引是数据库...

    Mybatis Plus 自定义批量插入或批量更新(根据唯一索引)

    对于批量更新,情况类似,但通常不需要检查数据是否存在,因为更新操作不会与唯一索引冲突。然而,如果你希望在更新前检查某些条件,可以自定义 `batchUpdate()` 方法: ```java @Override public boolean batch...

    Solr数据库插入(全量和增量)索引

    最后,我们需要定义索引更新策略,例如全量索引或增量索引。 测试结果 在本文中,我们使用 Solr 3.6.2 版本,在 Linux 5.2 操作系统上进行测试。我们使用 Oracle 10g 数据库作为数据源,并使用 DIH 和 Delta-...

    oracle索引,常见索引问题

    Oracle数据库中的索引是优化查询性能的关键工具,它...因此,当遇到常见的索引问题时,如索引未被使用、索引碎片化、索引过多或过少等,都需要深入分析并采取相应的解决方案,如重建索引、优化查询语句或调整索引策略。

    索引更新索引更新

    索引更新是Lucene中的一种重要机制,用于实时更新索引中的文档。索引更新可以分为两种情况:删除文档和更新文档。在Lucene中,删除文档可以使用IndexReader和IndexWriter两种方式实现,每种方式都有其优缺。 首先,...

    关于lucene建立数据库索引的更新说明

    总之,使用Lucene建立数据库索引是一个涉及多方面知识的过程,包括但不限于版本适配、索引策略、用户界面实现、搜索结果处理和分词优化。在实践中,不断学习和交流,结合具体需求调整方法,才能更好地利用Lucene实现...

Global site tag (gtag.js) - Google Analytics