半夜更新:也可以叫做非繁忙时段更新。
思路:从上次遍历的最后一条开始.我们需要保存一个数据库中的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...
数据库索引是数据库性能优化的关键技术之一。SQL Server 提供了两种索引:聚集索引(clustered index)和非聚集索引(nonclustered index)。本文将详细介绍聚集索引和非聚集索引的概念、区别、使用场景和误区。 ...
非聚集索引在查询性能上很有优势,尤其是对于多列联合索引和范围查询,但它们会占用额外的存储空间,并且在插入、删除和更新时可能需要维护索引。 接着是**聚集索引**。聚集索引决定了数据在表中的物理存储顺序。在...
相比之下,非聚集索引(Non-Clustered Index)并不影响数据的物理存储顺序。非聚集索引拥有自己的独立结构,其叶子节点通常包含键值以及指向实际数据行的书签或指针。这意味着,查询非聚集索引时,数据库系统需要两...
群集索引是SQL Server中最关键的索引类型之一,其设计直接影响到数据库的整体性能和长期可维护性。群集索引决定了表中数据的物理存储顺序,因此,合理设计群集索引可以显著提升查询速度和减少I/O操作。 #### 静态与...
非聚焦索引则是一种索引,其中索引的逻辑顺序与磁盘上数据行的物理存储顺序不一致。在非聚焦索引中,索引结构与数据分开存储,索引条目包含了指向实际数据行的指针。 - **定义**:非聚焦索引中,索引条目包含了指向...
增量导入更新索引包是Solr中的一项重要功能,它允许系统仅处理自上次完整索引以来发生改变的数据,从而大大提升了效率并降低了资源消耗。下面将详细阐述Solr增量更新的相关知识点。 1. **Solr的索引机制** Solr...
本文探讨了一种双重索引策略,其目的是为了提升XML(可扩展标记语言)文档集合的检索效率,特别是解决基于路径表达式查询效率低的问题。文章提出了一种高效的索引方法,该方法结合了倒排文档和结构索引,在XML文档中...
综上所述,一种分布式实时数据系统中的基于动态索引策略的存取定位机制,为实时数据库提供了一种高效、稳定、可扩展的解决方案。它不仅解决了分布式系统中数据存取的效率问题,还封装了系统的复杂性,使得用户能够...
本地索引是一种特殊的分区索引,它与表的分区紧密相关,即索引的分区策略完全遵循表的分区策略。 ##### 1. 特点: - **分区机制**:本地索引的分区键等同于表的分区键,分区数也等同于表的分区数。 - **前缀索引**...
slor定时增量更新索引dataimport.properties
索引合并是优化数据检索性能的关键技术之一,尤其在处理大量数据时,如Lucene这样的全文检索库,索引合并策略显得尤为重要。本文将详细探讨索引合并的原理以及如何在Lucene中实现这一策略。 索引合并,顾名思义,是...
Mysql的索引及优化策略,个人感觉还不错
在郑保卫于2015年Oracle技术嘉年华(OTN)分会场的演讲中,他深入探讨了索引优化策略及实战,并分享了多个实战案例。以下是从标题、描述、标签和提供的部分内容中提炼出的知识点。 一、索引使用原则 索引是数据库...
对于批量更新,情况类似,但通常不需要检查数据是否存在,因为更新操作不会与唯一索引冲突。然而,如果你希望在更新前检查某些条件,可以自定义 `batchUpdate()` 方法: ```java @Override public boolean batch...
最后,我们需要定义索引更新策略,例如全量索引或增量索引。 测试结果 在本文中,我们使用 Solr 3.6.2 版本,在 Linux 5.2 操作系统上进行测试。我们使用 Oracle 10g 数据库作为数据源,并使用 DIH 和 Delta-...
Oracle数据库中的索引是优化查询性能的关键工具,它...因此,当遇到常见的索引问题时,如索引未被使用、索引碎片化、索引过多或过少等,都需要深入分析并采取相应的解决方案,如重建索引、优化查询语句或调整索引策略。
索引更新是Lucene中的一种重要机制,用于实时更新索引中的文档。索引更新可以分为两种情况:删除文档和更新文档。在Lucene中,删除文档可以使用IndexReader和IndexWriter两种方式实现,每种方式都有其优缺。 首先,...
总之,使用Lucene建立数据库索引是一个涉及多方面知识的过程,包括但不限于版本适配、索引策略、用户界面实现、搜索结果处理和分词优化。在实践中,不断学习和交流,结合具体需求调整方法,才能更好地利用Lucene实现...