1. Lucene Delete Function
/** * Delete Index * */ public void delete() { Directory dir = FSDirectory.open(new File("E:/LuceneIndex")); IndexWriter writer = null;
try { writer = new IndexWriter(dir, new IndexWriterConfig( Version.LUCENE_35, new SimpleAnalyzer(Version.LUCENE_35)));
// Param is a selector. It can be a Query or a Term // A Query is a set of conditions (id like %1%) // A Term is a specific condition (name = 1) writer.deleteDocuments(new Term("name", "FileItemIterator.java")); } catch (CorruptIndexException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (LockObtainFailedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { writer.close(); } catch (CorruptIndexException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
2.
1) Like Windows, lucene provides a recycle bin for indices.
2) When we execute query, we won't get the data that has been deleted.
3) But we can fetch the indices whenever we want to rollback. And the deleted item is tag as _*_*.del
3. We can use IndexReader to get the number of deleted files
/** * Search * @throws IOException * @throws CorruptIndexException * */ public void search() throws CorruptIndexException, IOException { IndexReader reader = IndexReader.open(dir); // We can get index file count by using reader System.out.println("numDocs = " + reader.numDeletedDocs()); System.out.println("maxDocs = " + reader.maxDoc()); System.out.println("deleteDocs = " + reader.numDeletedDocs()); }
4. We can ue IndexReader to undelete deleted index files
/** * Undelete * */ public void undelete() { IndexReader reader = null; try { // param1: the directory // param2: readOnly reader = IndexReader.open(dir, false); reader.undeleteAll(); } catch (CorruptIndexException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { reader.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
Comments:
1) When we want to recovery the deleted files, we have to tag the readonly as false. Because by default, readonly is true.
2) After the undelete operation, the file that with the suffix of .del has gone. The data in it has been recovery into index files.
5. How do we empty recycle bin? (Delete files that with the suffix of .del)
1) Befory Lucene-3.5, this operation is called writer.optimize(). But it's now deprecated as every time we optimize, Lucene has to update all the index files. It's really high cost.
2) In/After Lucene-3.5, the operation writer.forceMerge() is the alias of writer.optimize(). They do the same operation and both are high cost.
3) So instead, we can use writer.forceMergeDeletes() to delete all deleted index files and is low cost.
6. About index file redundancy:
1)We can find that every time we execute buildIndex(), there will be another group of index files that are built.
2) As the count of execution grows, the index dir would become larger and larger. We should force the index file to update.
3) But the operation of index file update is deprecated as Lucene will maintain these index files for us automatically.
4) But we can merge index file manually.
/** * Merge */ public void merge() { IndexWriter writer = null; try { writer = new IndexWriter(dir, new IndexWriterConfig( Version.LUCENE_35, new SimpleAnalyzer(Version.LUCENE_35))); // Lucene will merge index files into two segments. The deleted item will be empty. // After Lucene-3.5, this method is deprecated. writer.forceMerge(2); } catch (CorruptIndexException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (LockObtainFailedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
6. How to delete all index files every time before we build index?
/**
* Create Index
*
* @throws IOException
* @throws LockObtainFailedException
* @throws CorruptIndexException
*/
public void buildIndex() throws CorruptIndexException,
LockObtainFailedException, IOException
{
// 2. Create IndexWriter
// --> It is used to write data into index files
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_35,
new SimpleAnalyzer(Version.LUCENE_35));
IndexWriter writer = new IndexWriter(dir, config);
// This function will empty index directory.
writer.deleteAll();
// Before 3.5 the way to create index is like below(depreciated):
// new IndexWriter(Direcotry d, Analyzer a, boolean c, MaxFieldLength
// mfl);
// d: Directory, a: Analyzer, c: Shoule we create new one each time
// mlf: The max length of the field to be indexed.
// 3. Create Document
// --> The target we want to search may be a doc file or a table in DB.
// --> The path, name, size and modified date of the file.
// --> All the information of the file should be stored in the Document.
Document doc = null;
// 4. Each Item of The Document is Called a Field.
// --> The relationship of document and field is like table and cell.
// Eg. We want to build index for all the txt file in the c:/lucene dir.
// So each txt file in this dir is called a document.
// And the name, size, modified date, content is called a field.
File files = new File("E:/LuceneData");
for (File file : files.listFiles())
{
doc = new Document();
// Using FileReader, we didn't store content into index file
// doc.add(new Field("content", new FileReader(file)));
// If we want to store content into index file, we have to read
// content into string.
String content = FileUtils.readFileToString(file);
doc.add(new Field("content", content, Field.Store.YES,
Field.Index.ANALYZED));
doc.add(new Field("name", file.getName(), Field.Store.YES,
Field.Index.NOT_ANALYZED));
// Field.Store.YES --> The field should be stored in index file
// Field.Index.ANALYZED --> The filed should be participled
doc.add(new Field("path", file.getAbsolutePath(), Field.Store.YES,
Field.Index.NOT_ANALYZED));
// 5. Create Index File for Target Document by IndexWriter.
writer.addDocument(doc);
}
// 6. Close Index Writer
if (null != writer)
{
writer.close();
}
}
Comments: writer.deleteAll() --> Will delete all index files.
6. How to update index?
/** * Update * */ public void update() { IndexWriter writer = null; Document doc = null; try { writer = new IndexWriter(dir, new IndexWriterConfig( Version.LUCENE_35, new SimpleAnalyzer(Version.LUCENE_35))); doc = new Document(); doc.add(new Field("id", "1", Field.Store.YES, Field.Index.ANALYZED)); doc.add(new Field("name", "Yang", Field.Store.YES, Field.Index.NOT_ANALYZED)); doc.add(new Field("password", "Kunlun", Field.Store.YES, Field.Index.NOT_ANALYZED)); doc.add(new Field("gender", "Male", Field.Store.YES, Field.Index.NOT_ANALYZED)); doc.add(new Field("score", 110 + "", Field.Store.YES, Field.Index.NOT_ANALYZED)); /* * Actually, Lucene doesn't provide update function. The update * function is delete + add First, delete index files that match the * term Second, build new index based on doc passed in */ writer.updateDocument(new Term("name", "Davy"), doc); } catch (CorruptIndexException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (LockObtainFailedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
Summary:
1. Delete: Using writer.deleteAll(); writer.delete(new Term(key, value)); writer.optimize(); writer.forceMergeDeletes(maxSegments);
2. Recovery: Using reader.undeleteAll() to recovery all items that are deleted.
3. Update: Using writer.update(new Term(key, value), doc); It will delete items that match the term and will add doc using the passing in doc.
相关推荐
《Nutch入门经典翻译1:Introduction to Nutch, Part 1: Crawling》一文深入介绍了Nutch这一开源网络爬虫框架的基本概念、体系结构及其关键组件,为初学者提供了全面的理解视角。以下是对该文章核心知识点的详细解读...
1. **文档阅读**:深入了解 Nutch 需要阅读官方提供的文档,如 "Introduction to Nutch, Part 1 Crawling" 和 "Introduction to Nutch, Part 2 Searching",以及源代码。Nutch 的源码结构清晰,便于理解和学习。 2....
7. **文档与学习资源**:对于深入学习 Nutch,推荐阅读官方文档,特别是 `Introduction to Nutch, Part 1 Crawling` 和 `Introduction to Nutch, Part 2 Searching`。同时,直接阅读源码是理解 Nutch 工作原理的关键...
1. Introduction to Zend Framework 1.1. 概述 1.2. 安装 2. Zend_Acl 2.1. 简介 2.1.1. 关于资源(Resource) 2.1.2. 关于角色(Role) 2.1.3. 创建访问控制列表(ACL) 2.1.4. 注册角色(Role) 2.1.5. 定义访问...
内容概要:本文详细介绍了利用COMSOL进行三维弯曲光纤波导传输仿真的方法和技术要点。首先探讨了几何建模的关键步骤,如使用参数化螺旋线创建弯曲结构,并强调了避免端口模式失配和平滑过渡的重要性。接着讨论了材料设置中的注意事项,尤其是处理各向异性材料时自定义坐标系的应用。文中还深入讲解了波束包络法的核心思想及其相对于传统有限元法的优势,特别是在内存占用方面。此外,提供了具体的求解技巧,包括开启渐进扫描功能以及调整数值耗散参数来提高收敛性。对于后处理部分,则着重介绍了如何通过线积分计算弯曲损耗,并展示了通过脚本自动化生成模场分布动画的方法。最后比较了波束包络法与FDTD方法在不同情况下的表现差异。 适用人群:从事光通信系统设计、光纤器件研究的专业技术人员,以及对电磁场仿真感兴趣的科研工作者。 使用场景及目标:适用于需要精确评估光纤弯曲引起的各种效应的研究项目,如数据中心内部布线优化、新型光纤设计等。主要目标是帮助用户掌握高效准确地进行复杂三维弯曲波导仿真的技能,从而更好地理解和预测实际应用中的性能指标。 其他说明:文中不仅提供了详细的理论解释和技术指导,还附带了许多实用的操作提示和代码片段,便于读者快速上手实践。同时提醒读者注意一些常见的错误来源,如材料色散设置不当可能导致的结果偏差等问题。
ffmepg windows 下载详细教程2025年(最新)
蓝天白云简约儿童教学课件PPT模板
内容概要:本文详细介绍了如何在COMSOL中构建直流电弧放电模型,利用磁流体动力学(MHD)方程将温度场、流体场和电磁场进行耦合仿真。文章首先解释了如何通过洛伦兹力将电磁场和流体场耦合,接着讨论了温度场中材料参数(如电导率)随温度变化的处理方法。文中还探讨了求解策略,包括分步计算和参数化扫描,以及如何设置边界条件和网格划分。最后,作者分享了一些实用技巧,如调整阻尼因子和使用特定的湍流模型,确保计算结果的准确性。 适合人群:从事等离子体物理、电磁场仿真、流体力学等领域研究的专业人士和技术爱好者。 使用场景及目标:适用于需要精确模拟直流电弧放电行为的研究项目,帮助研究人员理解电弧内部复杂的物理机制,优化电弧设备的设计和性能。 其他说明:文章提供了大量具体的代码片段和配置细节,有助于读者快速上手并解决常见问题。此外,作者还分享了许多实践经验,使读者能够更好地应对仿真过程中可能出现的各种挑战。
2000-2017年各省城市液化石油气供气总量数据 1、时间:2000-2017年 2、来源:国家统计j、能源nj 3、指标:行政区划代码、城市、年份、城市液化石油气供气总量 4、范围:31省
内容概要:本文详细介绍了基于C#开发的3C运动控制框架,该框架已在半导体和新能源行业中稳定运行五年。框架特点包括三级权限管理系统、灵活的轴配置与控制方式、多种硬件兼容性(如EtherCAT、研华控制卡)、模块化窗体设计以及MES系统的无缝对接。文中展示了具体的代码实现,如权限验证、轴控制、硬件驱动接口、快捷键处理、数据库操作等。此外,还提到了一些实用的设计技巧,如工厂模式、策略模式、状态模式的应用,确保系统的灵活性和扩展性。 适合人群:具备一定C#编程基础,对工业自动化、运动控制感兴趣的开发者和技术人员。 使用场景及目标:① 半导体和新能源生产线的运动控制;② 快速搭建稳定的运动控制系统;③ 实现高效、安全的权限管理和硬件控制;④ 提供模块化设计以便于后续维护和功能扩展。 其他说明:该框架提供了完整的源码和数据库备份,可以直接用于实际项目部署。同时,文中提到的一些设计思路和编码技巧对于提高系统的稳定性和易用性非常有帮助。
内容概要:本文详细介绍了如何使用连续小波变换(CWT)、卷积神经网络(CNN)和支持向量机(SVM)进行滚动轴承故障诊断的方法。首先,通过对东南大学提供的轴承数据集进行预处理,将一维振动信号转换为时频图。然后,构建了一个CNN-SVM混合模型,其中CNN用于提取时频图的特征,SVM用于分类。文中还讨论了如何选择合适的小波基、尺度范围以及如何防止过拟合等问题。此外,作者提供了T-SNE可视化工具来评估模型性能,并分享了一些实用的避坑指南。 适合人群:从事机械设备故障诊断的研究人员和技术人员,尤其是那些对振动信号处理有一定了解的人。 使用场景及目标:适用于工业环境中对旋转机械设备的故障检测和预测。主要目标是提高故障诊断的准确性,减少误判率,确保设备的安全稳定运行。 其他说明:文中提到的所有代码均已在Matlab环境下验证通过,并附有详细的注释和解释。对于初学者来说,建议逐步跟随代码实现,理解每一步骤背后的原理。
内容概要:本文探讨了配电网动态多目标重构问题,旨在通过改变网络中开关的状态来优化网络结构,从而降低网损、改善电压质量和减少开关动作次数。文中采用了改进粒子群算法(PSO),并在Matlab中实现了该算法。改进之处在于加入了随机因素和自适应参数,使粒子能够更好地跳出局部最优,更全面地搜索解空间。此外,文章详细介绍了如何处理孤岛和环网约束,确保网络拓扑的合法性和稳定性。通过IEEE33节点网络的实际案例,展示了该方法的有效性和优越性。 适合人群:从事电力系统研究、配电网优化以及智能算法应用的相关研究人员和技术人员。 使用场景及目标:适用于需要优化配电网结构、提高电力传输效率和稳定性的场合。主要目标是在满足多种约束条件下,找到开关动作次数、电压偏差和网损的最佳平衡解。 其他说明:文章不仅提供了理论分析,还包括具体的Matlab代码实现,便于读者理解和实践。同时,强调了严格的约束处理方法,如DFS和并查集的应用,确保解决方案的可靠性和实用性。
内容概要:本文详细介绍了在FPGA上实现非IP核、可配置点数的快速傅立叶变换(FFT)的方法。该方法采用16位定点数作为输入,32位定点数作为输出,在内部使用浮点数进行高精度计算。整个设计分为三个主要阶段:定点转浮点预处理、浮点运算核以及浮点转定点后处理。文中特别强调了蝶形运算单元的设计、存储器的乒乓操作、地址生成机制和状态机控制等方面的技术细节。此外,还讨论了如何通过调整参数N来自由选择不同的FFT点数,并提供了具体的测试案例和性能评估。 适合人群:熟悉VHDL编程语言并有一定FPGA开发经验的研发人员。 使用场景及目标:适用于需要高效、灵活地实现各种长度FFT的应用场合,如通信系统、音频处理等领域。通过本项目的实践,读者能够掌握不依赖于IP核的手动FFT实现方式,提高对底层硬件的理解和技术能力。 其他说明:文中提供的代码片段展示了关键步骤的具体实现,对于希望深入了解FFT算法及其在FPGA平台上的优化实现的研究者来说非常有价值。同时,作者分享了一些实用的小技巧,比如利用CORDIC算法优化旋转因子计算等,有助于进一步降低资源消耗并提升性能。
内容概要:本文详细介绍了利用欧姆龙PLC(CP1H系列)和MCGS触摸屏实现的热转印工艺瓶子印花机控制系统。系统通过PLC进行精确的伺服电机控制和温度调节,确保瓶子印花的质量和效率。文中具体讲解了PLC的I/O配置、PID温度控制、伺服电机的脉冲控制、MCGS的人机交互界面设计及其脚本编程,以及仿真测试过程中遇到的问题及解决方案。此外,还讨论了硬件选型、通信协议的选择、异常处理机制等方面的内容。 适合人群:从事工业自动化领域的工程师和技术人员,特别是对PLC编程、热转印工艺、MCGS触摸屏编程感兴趣的读者。 使用场景及目标:适用于需要高精度控制的热转印工艺设备的设计与调试。主要目标是提高生产效率和产品质量,减少设备故障率,缩短调试时间。 其他说明:文章提供了大量实际操作经验和代码示例,帮助读者更好地理解和掌握相关技术和应用场景。同时,强调了仿真测试的重要性,展示了如何通过仿真工具提前发现问题并优化系统性能。
内容概要:本文提供了一个详细且可直接运行的 Python 脚本,用于将 Word 文档 (.doc) 转换为 (.docx) 格式。该脚本不仅实现了基本的文件转换功能,还包含了错误处理、日志记录和进度显示功能,确保转换过程的稳定性和透明度。它能够自动识别输入是单个文件还是文件夹,并保持原始目录结构,同时自动创建不存在的输出目录。此外,脚本支持所有 Word 2007+ 版本,兼容长路径文件名,处理隐藏文件和系统文件。 适合人群:适用于需要批量处理 Word 文档格式转换的用户,特别是那些对自动化脚本有一定了解的技术人员。 使用场景及目标:① 需要将大量 .doc 文件转换为 .docx 格式的办公环境;② 需要保留文件目录结构并确保转换过程有详细日志记录的场景;③ 需要处理包含特殊字符路径、大文件或嵌套多层目录结构的复杂情况。 其他说明:需要注意的是,该脚本必须在 Windows 系统上运行,并且需要安装 Microsoft Word。首次运行时可能会弹出 Word 许可证验证窗口。对于权限问题、文件占用问题以及格式丢失问题,文中也提供了相应的解决方案。脚本经过严格测试,能够处理多种特殊情况,如包含中文/特殊字符的路径、文件大小超过 100MB 的文档等。
PP01_Z-ONE_ARXML_IPD_V2.1.arxml
OpenGL是一种强大的图形库,用于创建2D和3D图形,广泛应用于游戏开发、科学可视化、工程设计等领域。在这个项目中,我们看到一个基于OpenGL的机械臂运动仿真程序,它能够实现机械臂在四个方向上的旋转。这样的模拟对于理解机械臂的工作原理、机器人控制算法以及进行虚拟环境中的机械臂运动测试具有重要意义。 我们需要了解OpenGL的基础知识。OpenGL是一个跨语言、跨平台的编程接口,用于渲染2D和3D矢量图形。它提供了大量的函数来处理图形的绘制,包括几何形状的定义、颜色设置、光照处理、纹理映射等。开发者通过OpenGL库调用这些函数,构建出复杂的图形场景。 在这个机械臂仿真程序中,C#被用来作为编程语言。C#通常与Windows平台上的.NET Framework配合使用,提供了一种面向对象的、类型安全的语言,支持现代编程特性如LINQ、异步编程等。结合OpenGL,C#可以构建高性能的图形应用。 机械臂的运动仿真涉及到几个关键的计算和控制概念: 1. **关节角度**:机械臂的每个部分(或关节)都有一个或多个自由度,表示为关节角度。这些角度决定了机械臂各部分的位置和方向。 2. **正向运动学**:根据关节角度计算机械臂末端执行器(如抓手)在空间中的位置和方向。这涉及将各个关节的角度转换为欧拉角或四元数,然后转化为笛卡尔坐标系的X、Y、Z位置和旋转。 3. **反向运动学**:给定末端执行器的目标位置和方向,计算出各关节所需的理想角度。这是一个逆向问题,通常需要解决非线性方程组。 4. **运动规划**:确定从当前状态到目标状态的路径,确保机械臂在运动过程中避免碰撞和其他约束。 5. **OpenGL的使用**:在OpenGL中,我们首先创建几何模型来表示机械臂的各个部分。然后,使用矩阵变换(如旋转、平移和缩放)来更新关节角度对模型的影响。这些变换组合起来,形成机械臂的动态运动。 6. **四向旋转**:机械臂可能有四个独立的旋转轴,允许它在X、Y、Z三个轴上旋转,以及额外的绕自身轴线的旋转。每个轴的旋转都由对应的关节角度控制。 7. **交互控制**:用户可能可以通过输入设备(如鼠标或键盘)调整关节角度,实时观察机械臂的运动。这需要将用户输入转换为关节角度,并应用到运动学模型中。 8. **图形渲染**:OpenGL提供了多种渲染技术,如深度测试、光照模型、纹理映射等,可以用于提高机械臂模拟的真实感。例如,可以添加材质和纹理来模拟金属表面,或者使用光照来增强立体感。 这个项目结合了OpenGL的图形渲染能力与C#的编程灵活性,构建了一个可以直观展示机械臂运动的仿真环境。通过理解并实现这些关键概念,开发者不仅能够学习到图形编程技巧,还能深入理解机器人学的基本原理。
内容概要:文章深入探讨了AUTOSAR BSW层中的通信协议栈,详细介绍了各功能模块的作用与层级关系。BSW层的通信协议栈分为多个层次,包括服务层、ECU抽象层和微控制器抽象层。服务层涉及COM、PduR、IpduM和BusTP模块,负责信号处理、PDU路由及大数据传输等功能;ECU抽象层的BusInterface模块实现数据队列管理和基于时间触发的发送;微控制器抽象层的TrcvDriver和BusDriver则负责底层硬件的初始化和数据收发。文中还具体描述了BSW层通过COM模块进行报文发送和接收的流程,强调了各模块间的协作机制。此外,文章提到CAN、CAN FD以及未来的CAN XL技术的应用前景。; 适合人群:汽车电子领域工程师,尤其是对AUTOSAR架构有一定了解的技术人员。; 使用场景及目标:①理解AUTOSAR BSW层中通信协议栈的工作原理;②掌握BSW层各模块的功能及其交互方式;③熟悉CAN、CAN FD和CAN XL等通信协议的实际应用。; 其他说明:阅读本文有助于深入了解AUTOSAR BSW层的设计理念和技术细节,建议结合实际项目经验进行学习,以便更好地掌握BSW层的开发和调试技巧。
内容概要:MathorCup是一项面向高校学生的知名数学建模竞赛,由专业机构和行业专家支持,主要为本科生和研究生提供竞赛平台(部分高中生也可参加)。竞赛以团队形式进行,每队3人,涵盖优化、数据分析、算法设计及工业应用等方向的题目,比赛时长为3-4天。竞赛每年举办一次,通常在4月或11月,设有全国一、二、三等奖及成功参赛奖,对学术研究、奖学金评定及就业申请有帮助。备赛技巧包括基础技能储备(数学工具、编程能力、论文写作),分阶段学习(前期学习经典模型和练习往届赛题,赛前一周模拟实战),以及合理的时间管理和组队策略(角色分工、协作要点、避免常见错误)。此外,推荐了相关书籍、在线课程和工具包,强调保持耐心和注重创新的参赛心态。 适合人群:高校本科生、研究生(部分高中生)。 使用场景及目标:①帮助学生了解数学建模竞赛的基本信息和流程;②为参赛者提供备赛技巧和组队策略;③指导学生如何有效利用时间和资源准备竞赛。 阅读建议:此资源详细介绍了MathorCup竞赛的各项信息,不仅涵盖了基本规则和奖项设置,还提供了详细的备赛技巧和组队策略。建议参赛者仔细阅读并结合实际情况进行实践,特别是注重团队协作和时间管理,同时参考推荐的书籍、课程和工具包,提升自身能力。