Solr\Lucene优劣势分析

最早lucene2.4以及以前,追溯到2008年前后,lucene刚刚引起大家的关注,到后来Nutch

、solr的出现,lucene变得更加热。Nutch、Solr的发展,极大推动了lucene的升级。

对于一些接触过搜索,使用过lucene、solr的人来说,一般都会感觉lucene、solr很牛逼。我个人也认为solr、lucene确实非常NB,他涵盖了信息检索的几乎全部基础知识和非常高性能的实现方式。从solr的结构,扩展、维护整体看,发现有非常多的“工程亮点”,熟读solr定会增加对java的理解、运用技能。

但是,其实lucene solr有其自身的一些局限性,而这些局限性在大数据量的时候显得更为明显。

早些时候 Cedric Champeau 的评论

http://www.jroller.com/melix/entry/why_lucene_isn_t_that 和对应的中文版

http://www.jroller.com/melix/entry/why_lucene_isn_t_that

这个评论是在当时情况下给出的,截止2012.6.13日,有些问题已经在solr、nutch或者其他基于solr、hadoop、hbase、cassandra等系统上得到完善和运用。

下面结合实践经验,汇总一些solrlucene

在使用过程中的一些“短板”,之所以说是短板,因为只在有些情况下,才成为问题,有些情况下并不是问题。最后列举一些lucene、solr中对信息检索基础知识的支持和实现。

solrlucene 最大优势:

低成本、快速上手、开源社区发达,有问题基本上有现成的解决方法。

但是,也正因为如此,熟悉了solr、lucene并不能说一定可以应对任何搜索需求。因为实际场景中,有许多千奇百怪的需求、问题,往往需要面对的是用最小的改动、最方便的形式满足需求,而不是,是否满足以及多久满足的问题,要的是简单、可靠、可控、快速接入、快速处理故障。

最后汇聚成为“检索质量”,而这个标准是很难形成和取得相应口碑的。经验成为了搜索中的重要财富,而solr、lucene原理、源码只是一种最为基础和最为不可缺失的工具。理解了这些,是可以复制一个solr、lucene的,但是无法复制solr、lucene已经形成的开源经验、应用经验、讨论氛围等。

solrlucene 短板

短板越多,反应solr、lucene已经支持的场景非常多,提供服务的功能非常强大。所谓的短板,完全可以成为solr、lucene在生成环境中的应用特殊性所在、亮点所在。

(1) http 请求做了cache,有时候会出现新数据不可见,cache滞后的问题。—cache优化下也不是问题

(2) admin 后台页面,支持中文、复杂查询语法上,欠友好。—自己稍加扩展也不是问题

(3) swap core

的时候,单结点多core,并且core对应的索引比较大的时候,切换过程出现内存2倍化现象,甚至超时现象。—如果分前后排切换这些都不是问题了。

(4) index build和index search

往往在一起,导致全量过程,磁盘峰值3倍化。一份原来的、一份新建的、一份优化的时候。—-当然,build和search分离是可以解决这个问题的,也是常规做法。

(5) build 和search和在一起,也使得build

和search的一些参数设置不能区别对待,尤其是build和search合体的时候,预留磁盘、内存等加速build,反而影响search。—-当然可以

build search分离搞定

(6) 分布式查询,如果有merge,性能有些问题。—-当然可以将数据分区,避免merge

(7)

得分因子是可以调整的,但是得分因子的增加、得分公式的扩展,无法直接从solr配置插入。—-但是,可以扩展lucene的代码或者参数spanquery,重新一个query,插入solr,这样工作量稍大.另外,社区提供了bm25、pagerank等排序batch,对lucene有所以了解后,就可以直接引用了。

(8) solr

分布式索引全量、增量控制粒度,尚不够友好。指定结点、任何时刻全量,指定条件下增量都不够顺利。尽管solr提供了自定义扩展实现方法。这些也不是很大问题。

(9) solr

build和search和在一起,数据和业务其实绑定在一起了,没有彻底隔离。使得在上100个core的时候,数据源管理维护变得非常消耗资源。直接引入hadoop或者其他nosql存储时目前最流行的用来隔离数据和业务耦合性了。开源的分布式lucene方案非常多.

(10) ABTest 共享相同索引目录,而不同排序或者不同分词 solr不能直接支持

(11) ABTest 独立索引目录,不同排序或者不同分词,solr也不能直接支持

(12) 一个core

对应多个子目录,查询既可以查指定子目录也可以全部子目录查,以及更新某个子目录索引或者全部子目录索引,solr也不能直接支持,而这些在大数据量的时候是需要支持这些功能的。

(13)solr或者lucene

目前不支持快速的“局部”更新。这里是指对document的某个字段的快速更新,目前是需要传入完整的document,然后add进去。如果document

的不变字段来源多个源的话,IO、计算资源有些浪费,如果更新量不大还好。—当然可以对更新的单独开辟内存来处理,而更大的那个基本索引不去动他。

(14)solr不支持第三方条件过滤。例如从倒排中过滤处理一批doc,而这些doc需要与外部源进行doc

域值过滤。问题主要是第三方信息动态性太强,不利于直接写索引中去。

(15)solr 在支持中文分词的时候,有很多第三方包可以引入,但需要扩展query

parse有时候,总体看有优势也有劣势。优势是引入方便,劣势是词库、算法体系和lucene的不完全兼容,扩展、完善不是那么容易。

(16)

在排序上,对与去重或者对应基于时间动态性上,还没有现成的支持。去重是指排序的前几条结果,可能某个域值完全相同了,或者某几个域值完全相同,导致看起来,靠前的结果带有一些关联字段的“聚集性”,对有些应用来说,并不是最好的。

在时间因素上动态性,也没有直接支持,也只能靠间接的按时间排序来实现。

这个问题其实不是lucene、solr要关注的吧,应该是应用的特殊性导致的吧。

(17) solr

、lucene输出的日志,尚没有一个通用的分析工具,包括高频词、查询query聚合性等。只能自行去解析。

(18) 在支持推荐上,还不能将log信息直接关联起来,推荐也基本上靠离线计算好,导入倒排索引,查询再关联起来。

(19) 当内存30个G 以上,单节点索引数据量比较大的时候,jvm

环境下FGC和内存管理显得非常辣手。调优需要仔细的测试

(20) lucene很少面向接口,solr很多面向接口,插件化、可扩展使得solr很灵活

(21)

对于垂直型的平台化搜索,支持N个不同应用、不同schema、不同数据源、不同更新频率、不同查询逻辑、不同访问请求量、不同性能指标要求、不同机器配置、垂直扩容、水平扩容,solr显得不够胜任,尽管

solrcloud中已经有非常多的宝贵设计经验。

(22)

流控和数控,solr也不能直接支持。访问请求不支持定时和定量控制,索引垂直扩容(增加索引副本,支撑更多访问请求)、索引水平扩容(增加索引分区数,支撑更多数据量,平衡性能和空间压力)

(23) solr自容错还不够强大。例如schema

变更导致的不合理检测以及配置错误的回滚、solrconfig的一些参数不能动态获取,必须事先配置好。oom之后不能自动reload!请求量大的时候也不能抛弃一些请求。

(24) 基于位操作的高级应用还不够灵活,例如boolean 存储和facet、byte[]

存储和facet、group等,支撑仍然不够友好。

(25) query parse

基本没有预测功能,不能调整query顺序和自动收缩条件。当然一般情况下是不需要这么复杂的优化。

(26)一些比较变态的查询需求不是特别高效。例如查询某个域不空。当然可以将空域采取默认值代替,查询默认值再过滤。

(27)对于唯一值域,没有优化,导致唯一值域的term数据膨胀。最常见的就是更新时间、上传时间等,占了非常大的term比例

(28)multivalue 字段,实质是建立多个相同域名的字段,并不是一个域。对于域值很多内容的话,只好和在一起保存。同时,long

int short float double 等数组不能直接作为一个类型保存,全部得转为字符存储。空间和效率有些低。

(29)有些词出现的频率特别高,导致该词的倒排连非常长,solr、lucene也没有干涉。任务交给应用自己斟酌,实际上solr单节点对于命中超过100w的,并多字段排序的时候,cache失效时性能非常糟糕的。

(30)solrlucene 对于千万级别应用非常擅长,亿级别应用需要慎重对待。

lucene在信息检索基础理论的阐释:

(1) dictionary 和 postling 分离

(2) dictionary 压缩:基于词典、跳跃、前缀压缩、二分查找

(3) postling 压缩:差值压缩、可变字节压缩、p4del、simle9、simple16、跳跃表

(4) tfidf 默认实现、pagerank、 bm25等第三方实现支持

(5) 索引分段 segment、全量索引、增量索引、update-out-of-place、合并策略

(6) 查询多目录、查询分布式

(7) filter 过滤,bitmap的使用

(8) 各种cache的配置和使用以及监控

(9) 各种插件化支持、扩展灵活

(10) query 的and 与 or以及组合

(11) Top 、翻页、高亮、统计、分组的支持

(12) 模糊查询、区间查询、坡度查询统统支持

(13) 默认排序、自定义自段值排序、联合排序、动态排序、静态排序、queryboot、indexboot 一并支持

时间: 2024-10-13 14:17:44

Solr\Lucene优劣势分析的相关文章

Hyper-V在桌面虚拟化中的优劣势分析

在桌面虚拟化的项目中使用Hyper-V已经有一段时间了,最近越来越迷茫了,迷茫在Hyper-V到底在什么场景中比自己的竞争对手(vmware和citrix)存在绝对优势? 为什么这样说呢? 在桌面虚拟化中比较典型的两种方式是RDS和VDI模式,以我个人经验来看,虽然RDS是性价比非常高的一种解决方案,但是在实际使用过程中只要甲方不是特别在意投资的情况下都会去选择VDI模式.因为RDS模式给最终使用者带来的局限性和限制性太强了,最终会导致用户的意见或反对情绪比较大. 无论是RDS还是VDI模式中,

稳定币GUSD的优劣势分析

在币圈,有人乘着牛市东风一夜暴富,也有人不幸赶上熊市倾家荡产,涨跌大起大落是币圈的常态,在如此不稳定的币市,投资者们都想寻求一些稳定.接着,稳定币诞生了. 2018年下半年,稳定币引起了各路投资者的高度关注,其中GUSD是稳定币的代表之一,本文就和大家详细聊聊GUSD的优劣势. GUSD是什么? 2018/9/10.纽约金融服务部同时批准了两种基于以太坊发行的稳定币,分别是 Gemini 公司发行的稳定币Gemini Dollar(GUSD),与Paxos公司发行的稳定币Paxos Standa

Uber的优劣势分析

前言: Uber最近在进军中国各大城市,优惠也给的很大,但是这些无法成为核心竞争力,因为优惠会击垮对手,但是只要还有一个对手存在(滴滴快的的后台也很硬,不会被轻易击垮),就不能停止优惠,这无法形成持续性发展.与优惠对应的是市场规则,用户愿意使用并付费才是持续发展的准则. 首先谈谈Uber的特色和优势 1.Uber的产品设计是极简的 Uber主张“少即是多”的体验重构.叫车只需三步,并且页面上只会把离你最近的.并且是可以提供服务的车显示出来,不会形成“密集恐惧症”. Uber司机注册流程简单 Ub

分享SAP Business One是否好用及系统优劣势分析!

SAP在中国享有品牌盛名,许多跨国企业和大型公司都采用其大型企业ERP方案.但对于中型市场(企业员工在1000人以内),SAP则面临着来自像NetSuite等的云计算ERP系统的激烈冲击.虽然SAP为大型和中型企业同时提供解决方案,但NetSuite提供的ERP解决方案则是专门为中型企业或跨国企业的分支机构所定制.NetSuite之所以获得飞速的发展是因为中型企业意识到云计算ERP和CRM方案比起那些需要在办公室机房安装服务器硬件和软件的传统ERP系统来说性价比更高.云计算ERP只需要通过网络浏

三大CMS系统优劣势分析

国内常见的CMS有dedecms.PHPCMS.WordPress.帝国cms.5UCMS等,但是对咱们来说CMS还是PHP的好.不同的CMS的侧重点也不同,是不是易上手,模板多不多,设置复杂不复杂,SEO效果怎么样,这些都是必须要搞清楚的问题.俗话讲“知己知彼方能百战百胜”,CMS选得好,对SEO简直是有如神助.下面清茶仅从个人角度出发讲解一下国内最常见的3款CMS的性价比. 帝国CMS 非常老牌的CMS,就如同该CMS官网介绍的安全.强大.稳定.灵活. 安全性:高,姜就是老的辣,老牌的CMS

分析分析SEO与SEM的优劣势

SEO(搜索引擎优化) 优势 跨搜索引擎平台效果 – SEO优化是针对所有的搜索引擎来做的,只要SEO的方法是白帽的.专业的.面向用户体验的,那么你不仅仅能收获百度来的流量,谷歌,搜狗,360,雅虎,SOSO都会不同程度的认可你的网站,从而给你网站良好的展示位置.而SEM,不同的搜索引擎有不同的服务机制. 提升流量无须增加预算 - 要提升PPC的流量,你必须提升预算.但SEO不一样,SEO优化有点像滚雪球,一开始虽然不起眼,但雪球一旦滚起来,机制一旦建立,那么势必后劲十足,效果越到后面越显著,而

solr multivalue的实现分析

线上业务准备使用solr做数据存放和索引的功能,其中有的字段要求会存入多个字,solr的field的multivalue可以实现这个功能. <dynamicField name="*_ss" type="string"  indexed="true"  stored="true" multiValued="true"/> 下面看看其实现原理:和solr的写入document相关的两个类是Solr

R 语言的优劣势是什么?

R 语言的优劣势是什么? 2015-05-27 程序员 大数据小分析 R,不仅仅是一种语言 本文原载于<程序员>杂志2010年第8期,因篇幅所限,有所删减,这里刊登的是全文. 工欲善其事,必先利其器,作为一个战斗在IT界第一线的工程师,C/C++.java.perl.python.ruby.php.javascript.erlang等等等等,你手中总有一把使用自如的刀,帮助你披荆斩棘. 应用场景决定知识的储备与工具的选择,反过来,无论你选择了什么样的工具,你一定会努力地把它改造成符合自己应用场

solr调优

修改solrconfig.xml文件 <filterCache class="solr.LRUCache" size="16384" initialSize="4096" autowarmCount="4096"/> <!-- Query Result Cache Caches results of searches - ordered lists of document ids (DocList) base