`
异步获取爱
  • 浏览: 80048 次
  • 性别: Icon_minigender_1
  • 来自: 大男子主义世界
社区版块
存档分类
最新评论

Lucene一些问题总结(网上资料和自己累积)

阅读更多
    <1>.昨天改了一个晚上代码都无法使搜索引擎创建文件索引到硬盘中,经过调试发觉已经把文档、字段提取到了内存索引器中,然而在把内存索引书写器中的索引传递给硬盘索引书写器时似乎没有传送成功,只出现segments.gen和segments_2。单独使用FSDirectory时,却是在硬盘相应目录中能够看到索引文件啊!fsWriter.addIndexesNoOptimize(Directory[] {ramdir});明明已经写上了这句了啊?第二天上午翻翻资料,发觉有一份资料强调:
    “在合并内存索引器的索引到硬盘索引器前,务必先关闭内存索引器。”
    于是我试着在前面加上"ramWriter.close();",果然终于出现了久违的.cfs文件。

    <2>上周在使用范围搜索时又遇到问题 ,程序抛出TooManyClauses  exception。后来才发现lucene将范围搜索转化为精确匹配,每个匹配对应一个clause,所以如果你的范围如果包含超过1024个索引值,程序就会抛错
    方案1:BooleanQuery.setMaxClauseCount(Integer.MAX_VALUE)改变限制,这个可以解决问题,但有隐患,如果某个范围的索引特别多,内存会有爆掉的危险。
    方案2:使用filter

    <3>目前索引里面已经有1000多万的数据了,现在需要每几分钟就增量得添加新的内容到索引中。但是,我发现新加入索引后,整个索引结构都要重新调整。非常耗时(长达半个小时)。不知道大家有没有什么比较好的办法,加快这个过程?

回答:
我觉得用lucene做,一个原则索引里面尽量少存储,索引文件小了,optimize要移动的数据块也小。
还有Lucene实在不适合做实时,有一个办法,将新索引建在内存中,新建在内存上的searcher与硬盘索引searcher合并为MutliSearcher提供给前端搜索,
内存到达一定量时再后台合并到主索引上,合并完成用新的Searcher替换MutliSearcher。
RAMDirectory和FSDirectory相结合使用

//创建基于RAMDirectory的索引
RAMDirectory rd = new RAMDirectory();
IndexWriter iw = new IndexWriter(rd,new StandardAnalyzer());
….
//向基于RAMDirectory的索引中添加文档
iw.addDocument(doc);
iw.close();
//建立基于FSDirectory的索引
FSDirectory fd = FSDirectory.getDirectory("mix");
IndexWriter writer = new IndexWriter(fd,new StandardAnalyzer());
//把缓存在RAMDirectory中的所有数据写入FSDirectory
writer.addIndexes(new Directory[] {rd});
writer.close();

//同样可以反过来用,将文件系统中的索引读入内存中,就需要使用如下的方法:
RAMDirectory rd=new RAMDirectory();


    <4> 在大规模的应用中,Lucene更适合用于狭义的“搜索”,而不应当负责数据的存储。我们看看Lucene的源代码也可以知道,Document和Field的存储效率是不够好看的。手机之家的团队也发现了这一点,他们的办法是,用Lucene存放索引,用Memcache + Berkeley DB(Java Edition)负责存储。这样有两个好处,一是减小了Lucene的数据规模,提高了程序的效率;另一方面,这套系统也可以提供某些类似SQL的查询功能。实际上,Lucene Project自己似乎也注意到了这个问题,在Store中新增了一个db选项,其实也是利用的Berkeley DB。如果仅仅用Lucene存放索引,而不存放Document,并且合理配置,一台机器可以支持几十G甚至上百G的索引;如果需要用Lucene存放索引,最好在读取时使用FieldSelector,只读取需要的Field,如果使用恰当,性能会有10%左右的提升。


    <5> 在大规模应用中,Cache是非常重要的。PPT中也提到,可以在程序提供服务之前,进行几次”预热“搜索,填充Searcher的 Cache。据我们(银杏搜索)的经验,也可以在应用程序中,再提供针对Document的Cache,这样对性能有较大的改善(同一个JVM内部的 Cache,速度更快一些)。Lucene自己似乎也注意到了这个问题,在2.4版本中提供了Cache,并提供了一个LRU Cache实现。不过据我们测试,在极端情况下,这个Cache可能会突破大小限制,一路膨胀最后吃光内存,甚至从网络上找的许多LRU Cache实现在极端条件下都有可能出现这样的问题(这也是我们百思不得其解的地方:反复检查程序的逻辑都没有问题),最终自己写了一个LRU Cache,并修改多次,目前来看是稳定的。


    <6> 在编写Java服务程序的时候,记得设置退出的钩子函数(RunTime.getRunTime.addShutdownHook)是一个非常好的习惯。许多Java程序员都没有这种意识,或者有,也只是写一个finalize函数,结果程序非正常退出时,可能造成某些外部资源的状态不稳定。拿Lucene来说,之前的IndexWriter是默认autoCommit的,这样每添加一条记录,就提交一次,好处是如果中断,则之前添加的记录都是可用的,坏处则是,索引的速度非常低。在新版本中autoCommit默认为False,速度提升明显(我们测试的结果是,提高了大约8倍),但如果中途异常退出,则前功尽弃。如果我们添加了退出的钩子函数,捕获到退出信号则自动调用writer.close()方法,就可以避免这个问题。


    <7> 目前的Lucene是兼容JDK 1.4的,它的binary版本也是JDK1.4编译的,如果对性能要求比较高,可以自行下载Lucene Source Code,用更新版本的JDK编译出.jar文件,据我测试,速度大约有30%的提升。


    <8> 如果对并发的要求较高,可以考虑采用多IndexSearcher的技术,也就是在一个应用服务中,开启多个 IndexReader(可以对同样的索引开启多个),每个IndexReader再生成一个IndexSearcher,将这些Searcher放在一个“池”里头,给搜索请求调用。这样可以大幅度提高并发的性能,代价是在写程序的时候就要考虑到这一点,进行相应的调整。
分享到:
评论

相关推荐

    lucene使用总结笔记

    lucene使用总结笔记lucene使用总结笔记lucene使用总结笔记lucene使用总结笔记lucene使用总结笔记

    Lucene原理及使用总结

    Lucene是一个基于Java的全文信息检索工具包,它被广泛应用于构建搜索引擎和文本检索系统。Lucene最初由Doug Cutting开发,并且现在是Apache软件基金会Apache Jakarta项目的一部分,可以在官方网站...

    Lucene的的学习资料及案例

    同时,案例中的代码注释和逻辑结构也能帮助你更好地掌握Lucene的API使用。 总之,Lucene是一个强大的搜索引擎工具,它提供了完整的搜索解决方案,适用于各种需要全文检索功能的应用场景。通过深入学习和实践,你将...

    lucene个人总结

    根据提供的文件信息,以下是对Lucene 3.5版本的核心知识点进行的详细解析与总结: ### Lucene 3.5 概述 Lucene 3.5 是一款高性能的全文检索引擎工具包,广泛应用于搜索引擎、文档管理和内容管理等领域。Lucene 的...

    Lucene资料大全(包括Lucene_in_Action书等)

    标题"Lucene资料大全(包括Lucene_in_Action书等)"表明这是一个包含全面Lucene学习资源的集合,其中最显著的是《Lucene_in_Action》这本书。这是一本广泛认可的关于Apache Lucene的权威指南,通常被简称为LIA,它深入...

    不错的lucene资料

    Lucene 的目标是帮助开发者轻松地为应用程序添加索引和搜索功能。尽管 Lucene 本身并不是一个完整的搜索引擎(如 Google),但它提供了一组强大且易于使用的 API,这些 API 可以帮助开发者构建出具有复杂搜索能力的...

    lucene学习资料收集

    这个资料集可能包含了关于如何理解和使用Lucene的各种资源,特别是通过博主huanglz19871030在iteye上的博客文章链接,可以深入学习Lucene的核心概念和技术细节。 【标签】:“源码”和“工具”这两个标签暗示了这个...

    lucene实现过程中存在的问题

    Lucene作为一款强大的搜索引擎库,在实际应用中确实会遇到一些问题,如平台异常、查询异常、显示问题以及写锁异常等。针对这些问题,我们可以通过一系列措施来进行预防和解决,如正确使用查询语法、优化显示逻辑、...

    Lucene2.4入门总结

    通过理解索引、查询、分析器和文档的概念,以及如何组合它们进行多条件搜索,开发者可以有效地利用 Lucene 构建自己的全文搜索引擎。随着对 Lucene 更深入的学习,你将能够探索更多的高级特性,如近实时搜索、分布式...

    lucene4.8学习资料和案例

    本文将深入探讨Lucene 4.8的核心特性、使用方法以及相关的学习资料和案例,旨在帮助读者更好地理解和应用这一技术。 一、Lucene 4.8基础概念 1. 文档(Document):Lucene中的基本单位,用于存储信息,可以理解为...

    开发自己的搜索引擎《lucene2.0+heritrix》一书对应的源码资料

    这里我们关注的是基于开源项目Lucene 2.0和Heritrix的一本书——《开发自己的搜索引擎》的源码资料。Lucene是一个高性能、全文本搜索库,而Heritrix则是一个强大的网页抓取工具,它们共同构成了搜索引擎的基础架构。...

    开发自己的搜索引擎 lucene + heritrix

    总结来说,开发一个基于Lucene和Heritrix的搜索引擎是一个涉及多种技术和步骤的复杂过程。理解Lucene和Heritrix的工作原理和使用方法,以及如何将两者结合构建有效的搜索引擎,对于完成这项工作至关重要。同时,针对...

    lucene学习总结

    **Lucene学习总结** 在深入理解Lucene之前,我们首先需要了解什么是全文检索。全文检索是一种从大量文本数据中快速查找所需信息的技术。它通过建立索引来实现高效的搜索,而Lucene正是Java环境下最著名的全文搜索...

    lucene,lucene教程,lucene讲解

    lucene,lucene教程,lucene讲解。 为了对文档进行索引,Lucene 提供了五个基础的类 public class IndexWriter org.apache.lucene.index.IndexWriter public abstract class Directory org.apache.lucene.store....

    lucene学习资料

    《Lucene学习资料》 Lucene是一个开源的全文搜索引擎库,由Apache软件基金会维护。它提供了高级的文本分析和索引功能,使得开发者能够轻松地在应用程序中集成强大的搜索功能。这个资料包中的《Lucene in Action_2nd...

    Lucene+compass学习资料

    Compass是一个基于Lucene的全文搜索引擎框架,它将Lucene的功能与对象关系映射(ORM)框架相结合,如Hibernate和JPA。通过Compass,开发者可以方便地在数据库中的实体对象上实现全文搜索。Compass提供了元数据管理、...

    Lucene 字符编码问题

    当Lucene在解析或索引文档时,如果没有正确识别和转换字符编码,就可能出现问题。 解决Lucene中的字符编码问题,可以从以下几个方面入手: 1. **确保输入一致性**:在将文本输入到Lucene之前,确保所有数据都已...

    lucene资料

    Lucene in Action 中文版.pdf MyEclipse 6 Java EE 开发中文手册.pdf lucene_构建一个简单的WEB搜索程序.doc 补_lucene_构建一个简单的WEB搜索程序 nutch.doc

    lucene源码和教程

    lucene3.0.3源码和教程

    lucene3.0 lucene3.0

    lucene3.0 lucene3.0 lucene3.0 lucene3.0 lucene3.0

Global site tag (gtag.js) - Google Analytics