`
longgangbai
  • 浏览: 7339678 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

lucene大数据量的动态更新问题解决方式. 用内存

阅读更多

问题:
目前索引里面已经有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、可以分开索引,然后合并
并行索引机制

分享到:
评论
7 楼 lazzyGaGa 2010-08-31  
你好 可不可以请教你个问题?

你说一个索引里面尽量少存储。

就是当文本文档不存储的情况下,要怎么做高亮好了,怎么提取摘要?

谢谢!!

呵呵 经常关注你博客!
6 楼 longgangbai 2010-08-08  
一两个月不上JE突然发现JE中某一些人就是喜欢装X,讨论个问题就要么是进行人身攻击之类,要么是谩骂别人。。。JE杯具。。。
5 楼 longgangbai 2010-08-08  
riching 写道
有个问题请教一下,每天的索引有2G,如果每次查询跨度是一个月,查询方式应该怎么设计?


如果你的数据每天有2G,其实你的问题可以采用分布式的,先各个建立索引然后合并一起索引,但是这个也不是必需的。。也可以由其他方式:如有的网站采用多个搜索引擎分别检索查询,然后合并一起。。
4 楼 longgangbai 2010-08-08  
sealbird 写道
不了解lucene就不要说不适合做适时的

我不敢说了解多少,但是我以前在华为移动项目中使用,现在经常关注这方面,我也知道一些大的搜索引擎也不是天天实时更新的如果google等,google大约28天整体搜索一次。
针对基于数据库中数据的搜索引擎那么就实时更新很正常如采用compass等。
3 楼 sealbird 2010-08-03  
1 楼 riching 2010-07-17   引用
有个问题请教一下,每天的索引有2G,如果每次查询跨度是一个月,查询方式应该怎么设计?
数据量蛮大的,不知是新增的的多还是更新的多,如果有这么大的数量,考虑用分布式了,以后可以动态增加机器
2 楼 sealbird 2010-08-03  
不了解lucene就不要说不适合做适时的
1 楼 riching 2010-07-17  
有个问题请教一下,每天的索引有2G,如果每次查询跨度是一个月,查询方式应该怎么设计?

相关推荐

    Lucene.Net.dll

    - **索引构建**:使用IndexWriter类创建和更新索引,将数据源(如数据库、文件系统等)中的内容导入Lucene索引。 - **查询执行**:通过QueryParser或直接构建Query对象来构造查询,然后使用IndexSearcher类执行查询...

    lucene-memory-3.0.1.jar

    首先,由于完全依赖于内存,其容量受到系统内存的限制,无法处理大规模的数据。其次,一旦程序关闭,内存中的索引会丢失,这限制了它的持久性。为了解决这个问题,开发者通常会在程序运行过程中定期将内存索引写入...

    最新版windows lucene-8.5.1.zip

    本文将深入探讨Lucene 8.5.1在Windows系统中的核心特性、安装步骤、使用技巧以及常见问题的解决方法。 一、Lucene 8.5.1概述 Lucene 8.5.1是Lucene项目的一个重要里程碑,它引入了多项优化和改进,包括更快的搜索...

    最新版linux lucene-8.6.1.tgz

    Linux Lucene 8.6.1 是一个针对文本搜索和索引的开源库,它在Linux平台上被广泛使用。Lucene是Apache软件基金会的一个项目,为开发者提供了强大的全文搜索引擎功能,使得开发人员能够轻松地在应用程序中集成高级的...

    lucene4.7所需jar包

    它基于前缀词典的动态扩展词典方式,能够较好地解决新词识别问题。IKAnalyzer对Lucene的集成使得开发者能够在Lucene中方便地使用中文分词,提高了中文搜索的准确性和效率。 在使用Lucene 4.7时,开发者通常需要以下...

    lucene4.10.4 jar,手动整理,去除其他文件

    6. **实时索引**:Lucene支持动态更新索引,即使在大量数据变化的情况下,也能快速地将新内容纳入索引,保持搜索结果的实时性。 7. **多语言支持**:Lucene内置了多种语言的分词器,能处理包括中文在内的多种语言的...

    最新版linux lucene-8.6.0.tgz

    5. **内存管理优化**:为了处理更大规模的数据,8.6.0可能对内存使用进行了优化。 6. **文档处理**:可能增加了对不同文档格式的支持,如PDF、DOCX等。 **使用Lucene-8.6.0的步骤** 1. **安装JDK**:首先确保系统...

    Lucene.net-4.8.0 -new Bate.rar

    2. **内存与磁盘管理**:合理配置Directory类型,如内存目录用于小规模索引,而文件系统目录适用于大规模数据。 3. **并发控制**:在多线程环境下,正确管理和同步IndexWriter和IndexReader。 4. **缓存策略**:利用...

    Lucene.Net

    5. **内存优化**:Lucene.Net在内存管理和缓存策略上进行了优化,能在大规模数据集上保持良好的性能。 6. **多线程支持**:Lucene.Net设计时考虑了多线程环境,支持并发索引和搜索操作,适用于高并发的Web应用。 7. ...

    lucene-4.6.0全套jar包

    Lucene 4.6.0是其发展历史中的一个重要版本,对之前的版本进行了诸多改进和优化,使得在处理大规模数据索引和搜索时表现更佳。 一、Lucene核心概念 1. 文档(Document):在Lucene中,文档是搜索的基本单位,可以...

    最新版windows lucene-8.11.0.zip

    - **硬件需求**:随着数据量的增长,索引和搜索可能会对硬件性能提出更高要求。 - **分词准确性**:不同语言的分词策略不同,选择合适的分词器对搜索结果至关重要。 - **性能调优**:根据实际应用场景调整Lucene...

    Lucene 实战(第2版)中文带书签.pdf

    5. **分布式搜索**:随着数据量的增长,单机Lucene已无法满足需求,因此书中会介绍如何利用Solr或Elasticsearch等工具进行分布式部署,实现大规模数据的搜索。 6. **性能优化**:讨论了索引和查询性能的优化技巧,...

    Lucene.Net.rar 2.0 ver asp.net 组件

    它的内存管理策略和磁盘I/O优化使得在大数据量下依然能提供出色的响应时间。 **3. 分布式搜索** Lucene.Net支持分布式搜索,这意味着多个服务器可以共享索引,共同处理查询,提高系统的可用性和扩展性。这对于大型...

    最新版windows lucene-8.9.0.zip

    在Lucene 8.9.0中,包含了一系列重要的更新和改进,这些更新旨在提升性能、增加新特性并修复已知问题。以下是一些关键知识点: 1. **性能优化**:Lucene 8.9.0进行了大量的性能优化,包括更快的索引和搜索速度,...

    lucene完整包,所有的包都有,非常全的

    磁盘索引可以实现大数据量的搜索,而内存索引则提供更快的检索速度。 5. **更新与删除**:Lucene 允许动态更新索引,如添加新文档、修改已有文档或删除文档。这使得实时搜索成为可能。 6. **多语言支持**:Lucene ...

    ssm+lucene

    SSM(Spring、SpringMVC、MyBatis)与Lucene是两个在Java开发中非常重要...通过合理的集成和优化,可以有效解决大数据量下的搜索难题。在实际开发中,理解并熟练掌握这些技术,对于提升项目的质量和效率具有重要意义。

    基于Lucene的搜索策略研究

    - **数据经常需要更新但数据量不大**:对于此类情况,可以采用增量更新的方式,即只对新增或修改的部分进行索引更新,而不是重建整个索引,这样可以显著减少索引建立的时间。 - **数据经常需要更新且数据量巨大**...

    lucene-3.0.3-src.zip

    1. **性能提升**:3.0.3版本在搜索速度和内存使用上进行了优化,尤其在处理大量文档时表现更佳。 2. **多线程支持**:增强了对多线程环境的支持,允许多个线程并发写入和读取索引,提高了索引构建和查询效率。 3. ...

    lucene-7.2

    9. **查询优化**:通过改进查询执行策略,Lucene 7.2 可能能够更快地返回结果,尤其是在大数据量下。 10. **内存管理**:为了适应不同的硬件环境,新版本可能会有更智能的内存分配策略,降低内存占用,提高系统效率...

    Manning.Lucene.in.Action.2nd.Edition lucene in Action 第二版

    《Lucene in Action》第二版是关于Apache Lucene搜索引擎库的权威指南,专注于讲解Lucene 3.0版本。这本书由Michael McCandless、Erik Hatcher和Otis Gospodnetić共同撰写,深入浅出地介绍了如何利用Lucene进行高效...

Global site tag (gtag.js) - Google Analytics