问题由来:
参考一些资料,以及自己知道的io操作的资源消耗,知道IndexWriter也有同样的问题,同时IndexWriter同一时间只能有一个实例存在(如果在第一个IndexWriter实例存在之后,索引目录下会产生一个write.lock文件,这个时候你想实例化第二个IndexWriter时,肯定会报错的)。所以考虑能否构造一个单例IndexWriter出来,然后一直持有。
参考了lucene API关于IndexWriter的commit方法:
Commits all pending changes (added & deleted documents, optimizations, segment merges, added indexes, etc.) to the index, and syncs all referenced index files, such that a reader will see the changes and the index updates will survive an OS or machine crash or power loss. Note that this does not wait for any running background merges to finish. This may be a costly operation, so you should test the cost in your application and do it only when really necessary.
提交所有挂起的变化到当前的索引,包括新增,删除文档,优化操作,段合并操作,添加索引等。
同时,针对当前索引的引用,比如一个IndexReader将会看到所有的当前的改变。
与此同时,针对索引的更新将会固化到存储设备上。
需要提醒的是,commit操作不会等待后台任何的合并操作完成。
commit操作有可能是一个很消耗资源的操作,所以你需要测试你的程序的消耗;如果需要可以单独进行测试。
再看lucene API关于IndexWriter的close方法:
Commits all changes to an index and closes all associated files. Note that this may be a costly operation, so, try to re-use a single writer instead of closing and opening a new one.
提交所有的针对当前索引的操作,同时关闭相关联的文件,需要注意的是这是一个很消耗资源的操作,所以应该尝试构造一个循环使用的单例的IndexWriter代替关闭和重新打开索引。
关于indexwriter实例的重用:
参考了以上文字之后,我考虑用一个单例模式在程序启动之后,始终保持当前的仅有的一个indexwriter实例,也确实实现了,但是突然间意识到一个问题:
当进程强制退出怎么办?考虑问题不周全啊!
仔细想了一下,关于重用以及资源浪费的说法是对的,但是只能作为参考,既定的程序规则还是无法打破的,当然可以打破,但是当你违背常理去做一些事情的时候,是要付出代价的。
因此关于重用的indexwriter实例,只能说是利用一个indexwriter去尽可能多的干活,但是该关闭的时候还是得关闭;而资源浪费则是时刻提醒你尽可能的减少资源浪费,仅此而已。
总结:
一般情况下索引的更新都是有时效性的:设定一个时间长度然后循环增量索引。
索引如果频繁的开关IndexWriter确实很消耗资源,另外IndexWriter只允许同一时间有一个实例存在,而针对索引的提交用commit完全就够使了,没有close IndexWriter的必要。
分享到:
相关推荐
4. 使用IndexWriter对象的addDocument()方法将Document对象写入索引库。 5. 完成索引添加后,必须关闭IndexWriter对象,即调用close()方法,以确保索引库正确创建。 三、查询语法和IK中文分词解析器的使用: 1. IK...
Lucene的索引过程体系结构涉及创建IndexWriter对象、创建文档Document对象、将文档加入IndexWriter以及DocumentsWriter的处理,直至关闭IndexWriter对象。 Lucene的段合并过程是其索引过程中的一个重要环节,涉及...
2. 索引构建:使用IndexWriter对象,将Document批量写入索引,支持实时更新和增量索引。 3. 查询解析:QueryParser解析用户输入的查询字符串,生成对应的Query对象。 4. 搜索执行:使用Searcher对象,执行Query...
通过IndexWriter索引器的构造函数,以及它初始化时调用的一个init方法,可以了解一个IndexWriter索引器的构造最重要的是在init方法中的初始化工作。它主要实现了根据指定的建立索引的方式(重写、追加写入),通过...
3. 创建IndexWriterConfig并设置Analyzer,然后使用IndexWriterConfig创建IndexWriter对象。 4. 创建Document对象,添加字段,如TextField、IntField等,将数据存入Document。 5. 使用IndexWriter对象将Document写入...
接着,使用 IndexWriter 对象将 Document 添加到索引,确保设置好相应的目录路径和索引参数。最后,调用 IndexWriter 的 commit 方法保存索引。 2. **读取(Read)** 读取操作在 Lucene 中主要通过搜索来实现。...
创建`IndexWriter`对象,该对象用于写入索引文件,索引文件的存储位置和分词器都是其构造函数的参数之一。 2. 创建`Document`对象,用于表示要索引的文档。 3. 将不同类型的字段(如标题、作者、内容等)添加到...
6. **关闭IndexWriter**:完成索引操作后关闭IndexWriter对象释放资源。 ```java indexWriter.close(); ``` ### API详解 1. **IndexWriter** - **addDocument()**:添加文档至索引库。 - **deleteAll()**:...
1. **创建索引**: 首先,你需要实例化一个Directory对象(如FSDirectory)来指定存储索引的位置,然后创建一个IndexWriter对象,添加文档并调用`addDocument()`方法。 2. **分析文本**: 使用Analyzer对文档内容进行...
工具类对IndexWriter,IndexReader,IndexSearcher,Analyzer,QueryParser等Lucene这些常用操作对象的获取进行了封装,其中IndexWriter采用了单例模式,确保始终只有一个对象实例,因为Lucene限制了索引写操作是阻塞的...
构造Query对象,执行search方法,返回匹配的ScoreDoc数组。ScoreDoc包含了文档的得分和编号。 4. 结果处理:对ScoreDoc数组进行迭代,使用Document对象的document方法获取匹配的文档详情,进行展示或其他处理。 5....
// 创建 IndexWriter 对象,用于写入索引 IndexWriter indexWriter = new IndexWriter(directory, config); // 创建 Document 对象,模拟一个待索引的文档 Document doc = new Document(); doc.add(new ...
3. **查询**:使用 QueryParser 创建查询对象,或者直接构造 Query 对象。接着,使用 IndexSearcher 执行查询,返回 TopDocs 对象,包含匹配的文档及其评分。 4. **获取结果**:遍历 TopDocs,使用 ScoreDoc 获取...
1. **创建 IndexWriter 对象**:IndexWriter 是用于创建或更新索引的对象。创建时需要指定索引的存储位置、分析器以及是否需要覆盖已有的索引。 ```java IndexWriter writer = new IndexWriter("index", new ...
Lucene的索引过程主要包括创建IndexWriter对象、创建文档对象、处理文档、缓存管理、关闭IndexWriter对象等步骤。 **2. 详细索引过程** - **创建IndexWriter对象**:初始化索引写入器。 - **创建文档对象**:创建...
3. **创建IndexWriter**: 使用Analyzer和Directory创建IndexWriter对象,用于写入索引。 4. **添加文档**: 通过调用IndexWriter的addDocument方法,将包含字段的Document对象加入索引。 5. **提交更改**: 一旦所有...
Query 对象可以用来执行搜索,返回匹配的 Document 对象,从而获取相关的数据。此外,还可以使用 Filter 来进一步限制搜索结果,例如根据时间范围或特定字段筛选。 **7. 性能优化** 为了达到“瞬间完成”的搜索速度...
2. 初始化IndexWriter对象,传入Directory对象、Analyzer、是否创建新索引及最大段大小。 3. 获取待索引文件列表,通常是文件数组。 4. 循环遍历文件,创建Document对象,将文件内容(如文件名、内容等)转化为Field...
4. 添加文档到索引:使用IndexWriter对象将Document对象添加到索引目录中。IndexWriter负责管理写入过程,包括合并段(Segment)以优化空间和性能。 5. 关闭资源:完成索引后,记得关闭IndexWriter,释放资源。 三...