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

Lucene的缺点

 
阅读更多

对那些刚接触Lucene的人来说,这里是使用它的关键:Apache Lucene是一个由java编写的高性能,全方位的单词搜索引擎库。在批评它之前,我必须承认Lucene是一个高性能的划词搜索引擎。几年来,Lucene已经被看作是用java编写的嵌入式搜索引擎中的一等公民。它的声誉每日剧增,并且仍然是开源java搜索引擎中的最佳。每个人都在说:“Doug Cutting做了一项伟大的工作”。然而,最近的几个月内,开发的进程变得缓慢,我认为Lucene将不会满足现代的文档处理需求。不要把东西搞糟:我不是搜索引擎开发者,我只是个开发者,使用搜索引擎,来提供合适信息的检索科技。这贴是讨论为什么对未来的开发者而言,Lucene不是最好选择,至少对我们而言如此,并且情况并没有得到改变。我们列出Lucene的局限性:Lingway公司基于语意来生成复杂的查询。例如当你正在查找关于“中东地区冲突”的文章,你也许还需要找关于“伊拉克战争”文章。在上面这个用例中,“战争”和“伊拉克”分别是“冲突”和“中东”的扩展。我们使用一种技术能分析你的查询,产生相应的最合适的扩展,为它们生成查询。然而,为了得到相关的结果,这些还是不够的:通过Lucene实现的类似Google的等级或是经常变化积分的并不能满足语意级别积分。例如,一个包含“中”和“东”短语,但是被超过一个以上的单词隔开,这种情况并不是我们想要查找的。更重要的是,相对常规的单词,我们应该给扩展更低的分数。比如,我们应该给“中东地区冲突”这个短语更高的分数,而不是“伊拉克战争”。在Lingway公司,我们认为这种文章相关性技术是一种未来的搜索引擎。Google在文章搜索上做的很出色。但我们想要的却是最相关的文章。但是,大部分的当代搜索引擎都没有对这样复杂查询做相关的设计…Lucene被wikipedia使用,如果你注意到当你查询查过一个单词时,大多数的查询结果并不是由关联的…为了演示需求,这里有一个Lingway公司即将上线的KM3.7产品的界面截图。这里我们用法语写一个查询,用来查找那些同样主题,而用英语写的文章。注意,这可不仅仅是简简单单的翻译,我们称之为语言交叉模式:注意到那些绿色的匹配:chanteur变成了singer,但是我们也发现singing被匹配了。同样情况流行乐成为蓝调的扩展。6大理由不选用Lucene6. 没有对集群的内置支持。如果你创建集群,你可以写出自己对Directory的实现,或是使用Solr或者使用Nutch+Hadoop。Solr和Nutch都支持Lucene,但不是直接的替代。Lucene是可嵌入的,而你必须支持Solr和Nutch..我认为Hadoop从Lucene团队中产生并不惊讶:Lucene并不是通用的。它的内在性决定了对大多数场合来说它是非常快速的,但是对大型文档集合时,你不得不排除Lucene。因为它在内核级别上并没有实现集群,你必须把Lucene转换到别的搜索引擎,这样做并不直接。转换到Solr或者Nutch上的问题会让你遇到许多不必要的麻烦:Nutch中的集成crawling和Solr中的检索服务。5.跨度查询太慢这对Lingway公司来说可能是个特殊的问题。我们对跨度查询有很强要求,Lucene检索结构已经开始添加这一细节,但它们当初可没这么想。最基础的实现导致了复杂的算法并且运行缓慢,尤其是当某些短语在一份文档中重复了许多次出现。这是为什么我倾向说Lucene是一个高性能的划词检索引擎当你仅仅使用基本的布尔查询时。4.积分不能被插件化Lucene有自己对积分算法的实现,当条件增加时使用Similarity类。但很快它显示出局限性当你想要表示复杂的积分,例如基于实际匹配和元数据的查询。如果你这样做,你不得不继承Lucene的查询类。因为Lucene使用类似tf/idf的积分算法,然而在我们遇到的场合,在语意上的积分上Lucene的积分机制并不合适。我们被迫重写每一个Lucene的查询类使得它支持我们自定义的积分。这是一个问题。3.Lucene并非良好设计作为一个系统架构师,我倾向认为(1)Lucene有一个非常糟糕的OO设计。虽然有包,有类的设计,但是它几乎没有任何设计模式。这让我想起一个由C(++)开发者的行为,并且他把坏习惯带到了java中。这造成了,当你需要自定义Lucene来满足你的需求(你将来必定会遇到这样的需求),你必须面对这样的问题。例如:几乎没有使用接口。查询类(例如BooleanQuery,SpanQuery,TermQuery…)都是一个抽象类的子类。如果你要添加其中的一个细节,你会首先想到写一个接口来描述你扩展的契约,但是抽象的Query类并没有实现接口,你必须经常的变化自己的查询对象到Query中并在本地Lucene中调用。成堆的例子如(HitCollecor,…)这对使用AOP和自动代理来说也是一个问题. 别扭的迭代实现.没有hasNext()方法,next()方法返回布尔类型并刷新对象内容.这对你想要保持对迭代的元素跟踪来说非常的痛苦.我假定这是故意用来节省内存但是它又一次导致了算法上的杂乱和复杂. 2.一个关闭的API使得继承Lucene成为痛苦在Lucene的世界中,它被称之为特性。当某些用户需要得到某些细节,方针是开放类。这导致了大多数的类都是包保护级别的,这意味着你不能够继承他们(除非在你创建的类似在同一个包下,这样做会污染客户代码)或者你不得不复制和重写代码。更重要的是,如同上面一点提到的,这个严重缺乏OO设计的结构,一些类应该被设为内部类却没有,匿名类被用作复杂的计算当你需要重写他们的行为。关闭API的理由是让代码在发布前变得整洁并且稳定。虽然想法很光荣,但它再一次让人感到痛苦。因为如果你有一些代码和Lucene的主要思路并不吻合,你不得不经常回归Lucene的改进到你自己的版本直到你的补丁被接受。然而当开发者开始越来越长的限制API的更改,你的补丁很少有机会被接受。在一些类和方法上加上final修饰符会让你遇到问题。我认为如果Spring框架有这样的限制,是觉不会流行起来。1. Lucene搜索算法不适合网格计算Lucene被写出来的时候硬件还没有很大的内存,多处理器也不存在。因此,索引结构是被设计成使用线性的内存开销很小的方式。我花了很长的时间来重写跨度查询算法,并使用多线程内容(使用双核处理器),但是基于迭代器的目录读取算法几乎不能实现。在一些罕见的场合你能做一些优化并能迭代一个索引通过并行方式,但是大多数场合这是不可能的。我们遇到的情况是,当我们有一个复杂的,超过50+的内嵌跨度查询,CPU还在空闲但I/O却一直忙碌,甚至在使用了RAMDirectory.有没有替代品?我认为最后一个观点充满疑问:Lucene到达了它的极限当它在现在硬件基础的条件下,检索大型数据集合时。那就是我为什么寻找下一个可以替代Lucene的出现。在阅读了博客目录和 Wikia的讨论后,我发现并没有很多的替代品。然而我最后推荐一个有希望的方案:MG4J。它有一个良好的面向对象设计,性能良好的检索(索引比Lucene慢),内存开销上也很小,达到10倍于Lucene速度的跨度查询,在我的跨度查询基准上,并且是原生上支持集群。同样它也内置了负载平衡,而Lucene最近才加入这项功能并且还是实验性质的。然而MG4J仍然缺少一些特性例如简单的索引指数,文档移除和更简单的使用索引处理。让我感到高兴的是我可以自定义Lucene上的功能在MG4J上只需花几个小时,而在Lucene上却需要数天。我认为对开源的搜索引擎来说仍然有发展空间,它不是通过单台电脑用有限的内存来索引批量文档,而是通过透明的分布式索引来提供对大型数据集合检索更为快捷的答案。你不必利用应用来获得集群特性。Lucene对第一类搜索引擎有了很好的实现,单我认为它并不符合我们的需求:在一个合理的时间内找到最佳的答案。基于tf/idf的搜索算法和google的等级并不是未来搜索引擎的趋势。实现对原数据和语义的复杂查询并找出相关的信息,这是Lingway公司(通过Lucene和其他搜索引擎技术)所作的,不过它要求有更多支持新硬件的新技术。使用Lucene的一个好理由无论我如何指责Lucene,它仍然是java开源解决方案中的最佳实现。

分享到:
评论

相关推荐

    lucene6.6jar包

    内存索引在内存中构建和操作,因此速度极快,但缺点是如果应用程序停止,索引也会丢失。 总的来说,Lucene 6.6.0 版本通过这些 JAR 文件提供了全面的搜索解决方案,涵盖了从文本分析、索引创建、搜索执行到结果高亮...

    LUCENE搜索引擎基本工作原理

    **LUCENE搜索引擎基本工作原理** Lucene是一个开源的全文搜索引擎库,被广泛应用于构建复杂的搜索引擎系统。它的设计目标是高效、灵活且可扩展。理解Lucene的工作原理有助于开发人员更好地利用这一强大的工具。 **...

    hadoop+lucene几种结合形式

    五、Solr与Lucene的优缺点 1. 优点:低成本、快速上手,开源社区活跃,问题解决效率高。但这也意味着可能需要面对各种复杂需求,需要经验丰富的开发者进行优化以确保搜索质量。 2. 缺点:虽然功能强大,但也存在一些...

    lucene全文搜索

    - 缺点包括搜索效果差、结果中包含大量无关数据、大量数据下查询速度慢。 2. **全文检索**: - 搜索结果按相关度排序,使最相关的文档出现在前面。 - 采用索引机制提高搜索速度。 - 在大数据量环境下表现更优。...

    关于Lucene的词典FST深入剖析-申艳超1

    文章可能还分析了不同构建算法的优缺点,以及如何根据具体需求调整FST的参数以平衡空间和时间效率。同时,申艳超可能也讨论了在大规模数据集上使用FST的挑战,如构建时间、内存限制和查询效率等问题。 总的来说,这...

    lucene in action 2

    - **比较分析**:通过对比分析,让读者了解Lucene与其他产品的优缺点,以便更好地决定是否使用Lucene。 #### 六、高级搜索技术和扩展 - **高级搜索技术**:深入探讨了如何利用Lucene实现更高级别的搜索功能,如...

    Lucene In Action second edition

    - **第 4 章:构建高效索引**:讨论不同类型的索引结构及其优缺点;介绍如何根据应用场景选择合适的分词器和过滤器。 - **第 5 章:提高搜索质量**:介绍如何通过调整查询语法和评分算法来改善搜索结果的相关性和...

    Lucene in Action 2nd_Edition.doc

    - **市场对比**:对比分析了Lucene与市场上其他搜索解决方案的优缺点。 - **选择指南**:提供了指导用户根据自己的需求选择最适合的搜索技术的建议。 #### 六、高级搜索技术 - **复杂查询处理**:深入探讨了如何...

    lucene应用开发揭秘 第四讲

    ### Lucene应用开发揭秘第四讲知识点详解 #### 一、概览 《Lucene应用开发揭秘第四讲》是由觉先华老师主讲的一次技术分享,主要围绕如何设计高效的索引格式来进行讲解。本讲中重点介绍了词典的存储方式以及倒排表...

    lucene课件

    - 缺点:搜索效果一般,大量无用数据,查询速度慢。 1.4.2 **全文检索** - 结果按相关度排序,前几页对用户更有价值。 - 使用索引,速度优于数据库的 LIKE 操作。 - 数据库搜索无法实现相关度排序。 ### 3. ...

    lucene工程,分词、索引

    Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发并维护。它提供了高效、可扩展的文本搜索功能,被广泛应用于各种系统和应用中...同时,了解和研究不同分词器的优缺点,有助于在实际应用中做出更合适的选择。

    lucene索引入门[归类].pdf

    Lucene 的优点是灵活、可扩展、支持多种数据源和语言,缺点是需要对索引和检索进行复杂的配置和优化。 在 Lucene 中,索引的单位是 Document 对象,每个 Document 对象包含多个字段 Field 对象,针对不同的字段属性...

    Lucene 原理与代码分析完整版

    - 不同的策略有不同的优缺点,需要根据实际场景选择合适的策略。 **2. 详细过程** - 在段合并过程中,系统会选择多个小的段进行合并,以减少总的段数量。 - 这一过程涉及到了解具体的合并策略、选择待合并的段以及...

    基于Lucene的中文分词方法设计与实现

    - **与现有方法的比较**:与其他流行的中文分词工具(如Jieba分词等)进行对比,分析各自的优缺点。 通过实验数据可以看出,基于Lucene的中文分词模块在处理大量文本时表现出较高的效率和准确度,尤其是在处理复杂...

    搜索链接java(结合lucene)版的公交搜索系统

    java(结合lucene)版的公交搜索系统是一个基于Java语言和...但是也存在一定缺点,如站点信息较少,无实时信息如可达线路,安全和稳定性也较差,不适合直接商业应用。 总之,该java(结合lucene)版的公交搜索系统是一个开源

    基于java(结合lucene)版的公交搜索系统.zip

    java(结合lucene)版的公交搜索系统是一个基于Java语言和...但是也存在一定缺点,如站点信息较少,无实时信息如可达线路,安全和稳定性也较差,不适合直接商业应用。 总之,该java(结合lucene)版的公交搜索系统是一个开源

    lucene中文分词源码,做搜索引擎需要用到的好东西哦

    1. 分词算法:理解不同的分词算法,如基于词典的匹配、HMM模型等,以及它们的优缺点。 2. 词典构建:词典是分词的基础,了解如何构建和维护词典,以及动态更新词典的方法。 3. 分词效率:优化分词过程,减少不必要的...

    基于Lucene的医疗搜索引擎排序算法的研究.pdf

    5. 搜索引擎算法:包括PageRank、HITS(Hyperlink-Induced Topic Search)、Direct Hit等,每种算法都有其优缺点。 研究背景指出,随着搜索引擎技术的发展,用户可以更方便地在海量数据中找到所需信息。然而,现有...

    基于Lucene的中文分词器的设计与实现

    针对Lucene自带中文分词器分词效果差的缺点,在分析现有分词词典机制的基础上,设计了基于全哈希整词二分算法的分词器,并集成到Lucene中,算法通过对整词进行哈希,减少词条匹配次数,提高分词效率。该分词器词典...

Global site tag (gtag.js) - Google Analytics