问题:
目前索引里面已经有1000多万的数据了,现在需要每几分钟就增量得添加新的内容到索引中。
但是,我发现新加入索引后,整个索引结构都要重新调整。非常耗时(长达半个小时)。
不知道大家有没有什么比较好的办法,加快这个过程?
回答:
我觉得用lucene做,一个原则索引里面尽量少存储,索引文件小了,optimize要移动的数据块也小。
还有Lucene实在不适合做实时,有一个办法,将新索引建在内存中,新建在内存上的searcher与硬盘索引searcher合并为
MutliSearcher提供给前端搜索,内存到达一定量时再后台合并到主索引上,合并完成用新的Searcher替换MutliSearcher。
Lucene2.3已经放出来了,添加了很多新功能,可以去看看
大量索引的更方案: 索引分开, 周索引,月索引,全部索引
提高搜索性能方式
搜索
1、对于按创建时间的排序可以使用doc.id的方式
new SortField(null, SortField.DOC, reverse)排序方式尽量使用INT类型的字段
也就是按照写入索引的顺序排序
2、对于时间字符串的排序可以转换成整数进行排序
3、去掉不必要的parse
使用TermQuery替换
4、TermQuery和Term可以只保留一个实例
createTerm(text)
5、减少Doc到model的转换
索引出来String到Date的转换多余而且费时
直接使用Doc对象包装成JSONObject
6、MultiFieldQueryParser改成自己用boolean查询重构
7、减少请求参数的包装类
8、搜索排序方法可以作为常量
将sort参数变成int型,使用swich进行判断
10、使用HitCollector类来适应不同情况下,Hits的大小
新、旧接口
相关搜索接口
11、使用尽可能快的磁盘IO
12、日志,先写文件,每天批量入库
13、增量索引使用reopen
新的reopen()方法只会加载那些变更过的索引片断,而不是重新加载完整的索引。
14、setMergeFactor 在做实时索引的时候,可以设置的小一点
这样就会及时索引进去
索引
索引
1、t.termText()替换为new String(t.termBuffer(),0,t.termLength())
2、StringReader 和TokenStream对象都需要close
3、索引时Document只用一个、Field只用几个
一个Document对象对应多个Field实例
Field有新的setValue方法,动态改变属性
不能只有一个Field实例
例如:idField, bodyField
必须等Document都到索引中之后,才可以重新设置值
4、索引中Field的命名只使用2个字符表示
5、有些索引字段可以考虑使用0,1替代字符串,排序采用整数来排
6、减少索引的存储字段,一般只存ID
7、索引的时候只用一个IndexWriter对象
8、3.1版本有个新的方法writer.ramSizeInBytes()
根据RAM的使用情况,来决定是不需要刷新到磁盘。
之前:setMaxBufferedDocs
9、批量索引的时候,尽可能多使用一些内存,采用非复合的文件方式,完成后集中优化合并索引文件
fsWriter.addIndexesNoOptimize
fsWriter.setUseCompoundFile(false);
需要注意不要超过系统的允许打开文件数
10、重复使用单一的Token实例,在analyzer中。
11、Turn off auto-commit if there are stored fields and term vectors
设置autoCommit=false,直到writer close之后才会生效
默认是true
12、如果总是同时在多个分词的字段中查询,可以考虑将多个Field合并到一个Field中
13、增加mergeFactor,但是不要太大
反复调试获取经验值
14、关闭一些实际上没用的功能(不要存储一些不必要的字段,尽量不要打开term vectors)
15、使用更快的analyzer
16、加快获得document数据的速度
比如:从数据库、文件获取数据的速度
17、索引的时候可以考虑使用多线程
使用多线程addDocuments
需要测试,然后确定线程数
18、可以分开索引,然后合并
并行索引机制
分享到:
相关推荐
Lucene允许动态更新和删除文档,这在实时搜索场景中非常重要。更新文档时,Lucene会处理旧索引和新索引的合并;删除文档时,它会在索引中添加删除标记。 5. **性能优化** 为了提升搜索效率,Lucene提供了一些优化...
SSM(Spring、SpringMVC、MyBatis)与Lucene是两个在Java开发中非常重要...通过合理的集成和优化,可以有效解决大数据量下的搜索难题。在实际开发中,理解并熟练掌握这些技术,对于提升项目的质量和效率具有重要意义。
3. **高性能**:Lucene通过内存缓存、位向量和优化的数据结构来提高搜索速度。同时,它支持多线程索引和搜索,适应大规模数据处理。 4. **可扩展性**:Lucene提供了丰富的API,开发者可以定制分词器、过滤器、评分...
磁盘索引可以实现大数据量的搜索,而内存索引则提供更快的检索速度。 5. **更新与删除**:Lucene 允许动态更新索引,如添加新文档、修改已有文档或删除文档。这使得实时搜索成为可能。 6. **多语言支持**:Lucene ...
- **索引构建**:使用IndexWriter类创建和更新索引,将数据源(如数据库、文件系统等)中的内容导入Lucene索引。 - **查询执行**:通过QueryParser或直接构建Query对象来构造查询,然后使用IndexSearcher类执行查询...
- **数据经常需要更新但数据量不大**:对于此类情况,可以采用增量更新的方式,即只对新增或修改的部分进行索引更新,而不是重建整个索引,这样可以显著减少索引建立的时间。 - **数据经常需要更新且数据量巨大**...
Lucene支持增量索引,意味着可以对新的或已更改的数据进行实时更新。索引优化则是一次性合并多个段(segments)的过程,以提高搜索性能。 5. **搜索结果相关性** Lucene通过TF-IDF(Term Frequency-Inverse ...
- 分布式索引和搜索:通过分布式部署,lucene可以处理大规模数据,提高系统的并发处理能力。 5. 应用场景 - 内容管理系统:为站内新闻、文章提供快速的全文搜索。 - 数据库辅助:对数据库中的文本字段进行索引,...
- **更新和删除**:使用IndexWriter可以更新已有文档,或通过ID删除文档。 - **多线程索引**:通过控制IndexWriter的并发设置,可以提高索引大量数据时的性能。 以上就是关于“Lucene索引的简单使用”的详细介绍,...
- 性能调优:根据服务器资源和数据量,适当调整Lucene的索引设置,如分块大小、内存缓冲等。 以上就是关于"ssh+lucene搜索实例"的相关知识点,通过这种方式,可以有效地在分布式环境中实现全文搜索功能,提高数据...
5. **分片与分布式搜索**:随着数据量的增加,单个索引可能无法承载。Lucene 4.6支持分片技术,可以将大型索引分散到多个节点上,实现分布式搜索,保证了大规模数据下的搜索性能。 6. **内存管理**:4.6版本在内存...
6. **更新与删除**:Lucene允许动态地更新和删除索引中的文档,确保信息的实时性。9.3.0可能会对这些操作的效率进行优化。 7. **内存管理**:为了提高性能,Lucene会缓存部分索引数据。9.3.0可能包含改进的内存管理...
6. **内存与磁盘索引**:Lucene可以将索引存储在内存或磁盘上,内存索引速度快但容量有限,磁盘索引则可处理大量数据,但检索速度相对较慢。 通过这个简单的Lucene demo,我们可以了解到如何利用这个强大的全文搜索...
6. **内存管理**:Lucene使用内存-磁盘混合模式,确保了在大量数据下的高效运行。 7. **更新和删除索引**:Lucene支持动态更新索引,当文档内容发生变化时,可以快速地反映到索引中;同样,也可以方便地从索引中...
9. **查询优化**:通过改进查询执行策略,Lucene 7.2 可能能够更快地返回结果,尤其是在大数据量下。 10. **内存管理**:为了适应不同的硬件环境,新版本可能会有更智能的内存分配策略,降低内存占用,提高系统效率...
8. **更新与删除**:Lucene支持对索引进行动态更新和删除操作,但需要注意的是,这些操作通常涉及重新构建部分或全部索引,以保持数据一致性。 9. **多线程与分布式搜索**:Lucene API设计允许在多线程环境中高效...
在"spring-lucene简单项目"中,我们将学习如何配置和使用Lucene来索引和检索数据。 项目开始时,你需要在Spring配置文件中声明Lucene的相关bean,如Analyzer(分析器)、Directory(存储索引的目录)和IndexWriter...
6. **更新与删除索引**:Lucene 提供了动态更新索引的能力,可以在不重新构建整个索引的情况下添加、更新或删除文档。 7. **高级特性**:包括模糊搜索、通配符查询、范围查询、地理位置搜索等。此外,还可以通过...
在大数据量场景下,可以采用分片策略,将索引分散到多个节点上,利用Lucene的分布式搜索能力,提高查询效率。 #### 3.2 延迟索引更新 为了减少实时索引更新对系统性能的影响,可以采用延迟索引更新策略,将多个小...