`
huqi
  • 浏览: 96957 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

导致Lucene无法索引查询的NoClassDefFoundError

阅读更多

Lucene乃是当今免费开源搜索引擎的霸主,确实它十分好用,发展势头也很生猛,在Apache组织的支持下不断的更新、推出新版本。

但是其存在一个隐藏的很深的bug,相信困扰了不少和我一样研究使用过它的人,这个bug从早期的版本到目前的V2.3.1一个存在,不能不说是一个遗憾。

具体触发这个bug的原因很复杂,在某些环境、服务器、应用中……

表现为建立索引文件和执行查询时报“NoClassDefFoundError”,跟进代码会发现是“SegmentReader”这个类型不能创建实例,但怎么看这个类都是存在的。其实问题在这(SegmentReader.java):

  /** *//** The class which implements SegmentReader. */
  
private static Class IMPL;
  
static ...{
    
try ...{
      String name 
=
        System.getProperty(
"org.apache.lucene.SegmentReader.class",
                           SegmentReader.
class.getName());
      IMPL 
= Class.forName(name);
    }
 catch (ClassNotFoundException e) ...{
      
throw new RuntimeException("cannot load SegmentReader class: " + e, e);
    }
 catch (SecurityException se) ...{
      
try ...{
        IMPL 
= Class.forName(SegmentReader.class.getName());
      }
 catch (ClassNotFoundException e) ...{
        
throw new RuntimeException("cannot load default SegmentReader class: " + e, e);
      }

    }

  }

看到这句没有“System.getProperty("org.apache.lucene.SegmentReader.class", SegmentReader.class.getName());”,鬼知道它什么时候把这个系统属性设入内存中的!它的本意是想动态加载SegmentReader,但反而有可能弄巧成拙,导致Class.forName报出NoClassDefFoundError,更要命的是在static{}代码段中的Error不会明确的显示在异常堆栈中,任你用什么debug手段都不能立即定位问题。

知道了问题,最简单的解决方法,很直接,改代码。把那个IMPL和static{}段干脆去掉,不利用系统属性动态加载就是了,就直接使用SegmentReader,就认准它了:-)

分享到:
评论

相关推荐

    lucene做索引查询流程

    lucene 做索引查询流程,来自《lucene in action》

    lucene实现索引查询

    查询索引包括以下步骤: 1. **打开索引目录**:与创建索引类似,先打开索引所在的目录。 2. **创建分词器**:同样需要一个分词器来处理查询字符串。 3. **创建索引读取器**:`IndexReader`用于读取索引,从中获取...

    Lucene建索引及查询关键字

    在Eclipse环境中运用java,Lucene建索引及查询关键字

    Lucene索引和查询

    - 多线程支持:在大型应用中,可能需要并发创建和查询索引,Lucene支持多线程操作。 - 性能优化:如使用内存映射文件(MMapDirectory)、优化写入策略等。 - 分布式搜索:通过Solr或Elasticsearch,可以实现分布式...

    基于lucene技术的增量索引

    **基于Lucene技术的增量索引** 在信息技术领域,全文搜索引擎是处理大量数据查询的关键工具。Apache Lucene是一个开源的全文检索库,被广泛应用于构建高效、可扩展的搜索功能。本文将深入探讨如何利用Lucene实现...

    Lucene读取索引文件

    开发者在使用Lucene时,应充分理解其内部机制,以便更好地优化查询性能和维护索引。 在开发过程中,有时会遇到需要查看二进制索引文件内容的情况,这时可以使用工具如jd-gui.exe(Java反编译器),虽然它主要用于...

    Lucene创建索引步骤

    Lucene创建索引步骤: 1、创建Directory(索引位置) 2、创建IndexWrite(写入索引) 3、创建Document对象 4、为Document添加Field(相当于添加属性:类似于表与字段的关系) 5、通过IndexWriter添加文档到索引中

    Lucene 索引的简单使用

    本篇文章将详细阐述如何使用Lucene来创建和查询索引,帮助你深入理解其核心概念和操作流程。 ### 1. Lucene基本概念 - **文档(Document)**:在Lucene中,一个文档代表你要索引的信息单元,它可以包含多个字段...

    lucene索引结构原理

    Lucene支持多种查询类型,如term查询、短语查询、范围查询等,它们的执行速度都依赖于倒排索引。 通过以上这些组件和机制,Lucene能够提供高效、可扩展的全文搜索能力。开发者可以通过自定义Analyzer、调整段合并...

    基于lucene的索引与搜索

    本文档主要探讨了基于Apache Lucene的索引与搜索技术,这是构建高效全文搜索引擎的关键组成部分。Lucene是一个开源的Java库,提供了强大的文本分析、索引和搜索功能,被广泛应用于各种信息检索系统中。 第一章 引言...

    Lucene之删除索引

    在深入探讨Lucene删除索引这一主题之前,我们先来理解一下Lucene的基本概念。Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发。它提供了高性能、可扩展的搜索和索引功能,广泛应用于各种应用程序中,如...

    lucene 索引小示例

    总结来说,Lucene的索引过程涉及了分析、存储和查询三个主要阶段。通过理解和实践这个小示例,开发者可以掌握Lucene的基本用法,并在此基础上进一步探索更高级的功能,如模糊查询、短语匹配、布尔查询等。同时,源码...

    Lucene建立索引及查询包含“java”关键字 示例代码

    这个示例代码将向我们展示如何使用Lucene来创建一个索引,并执行一个包含"java"关键字的查询。 首先,我们需要导入必要的Lucene库,包括核心类库和其他可能需要的模块,例如分析器(Analyzer)和文档(Document)...

    lucene索引查看程序及代码

    3. **搜索测试**:内置的搜索功能允许我们直接在索引上进行查询,观察查询结果的排序和相关性。 4. **分析器检查**:luke可以展示不同分析器对文本的处理过程,帮助我们选择和调整适合的分析策略。 5. **统计信息**...

    lucene全文检索简单索引和搜索实例

    《Lucene全文检索:简单索引与搜索实例详解》 Lucene是Apache软件基金会的开源项目,是一款强大的全文检索库,被广泛应用于Java开发中,为开发者提供了构建高性能搜索引擎的能力。在本文中,我们将深入探讨如何基于...

    Lucene索引器实例

    - **索引(Index)**:索引是Lucene对文档进行处理后生成的数据结构,用于快速查找满足特定查询条件的文档。 - **分词(Tokenization)**:将文档内容分割成独立的词语,称为“术语”或“Token”。 - **分析器...

    Lucene3.0创建索引

    它为开发者提供了构建搜索应用所需的所有基本工具,包括索引文档、执行查询、处理分析等。Lucene3.0是该系列的一个版本,在性能和稳定性方面都有所提升。 #### 二、创建索引的基本步骤 根据提供的描述,创建索引的...

    深入 Lucene 索引机制

    2. 索引匹配:Lucene通过遍历倒排索引,找到所有匹配查询的Term,并结合Posting List找出包含这些Term的文档。 3. 排序和评分:Lucene使用TF-IDF(词频-逆文档频率)和其他因素(如文档长度、查询词位置等)计算每...

    lucene并行索引

    传统的单机索引方法已无法满足高效处理大规模数据的需求,尤其是在搜索引擎领域。Lucene作为一款优秀的全文检索引擎库,其高效、灵活的特点受到了广泛的关注。然而,在面对海量数据时,Lucene的索引构建过程可能会变...

Global site tag (gtag.js) - Google Analytics