solr和elasticsearch对比,有什么差别吗
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了solr和elasticsearch对比,有什么差别吗相关的知识,希望对你有一定的参考价值。
从两个方面对ElasticSearch和Solr进行对比,从关系型数据库中的导入速度和模糊查询的速度。单机对比
1. Solr 发布了4.0-alpha,试了一下,发现需要自己修改schema,好处是它自带一个data importer。在自己的计算机上测试了一下,导入的性能大概是:14分钟导入 3092730 条记录,约合 3682条/秒。
2. 3百万条记录的情况下,模糊查询和排序基本都在1秒内返回
3. 刚才的测试,是每个field单独存储,现在修改了一下配置文件,增加了一个copyField,所有的field都拷贝一份到text这个field里面去,导入的性能大概是:19分钟导入了3092730 条记录,约合 2713条/秒
4. 3百万条记录的情况下,针对text的模糊查询基本在1秒内返回,但是针对所有记录的排序,大概要2~3秒
5. 使用 elasticsearch 0.19.8,缺省配置,用单任务导入,导入性能是:20分钟导入了3092730 条记录,约合2577条/秒
6. 3百万条记录的情况下,查询基本上在1秒内返回,但是模糊查询比较慢,第一次要10秒,后来大概要1~3秒。加上排序大概需要5秒,整体排序基本100ms
查询及排序的指令:
"query":
"query_string":
"query": "*999*"
,
"sort": [
"TIME_UP":
"order": "asc"
]
7. Es0.19.8,用两个任务导入,导入性能是:13分钟导入了3092730 条记录,约合3965条/秒
8. Solr全部建好索引后,占用磁盘空间是1.2G,es占用磁盘空间是4G
单机对比2
在一台Intel i7,32G内存的机器上,重新跑这两个的对比。不过有个重大的区别在于,Solr是在这台性能很好的机器上跑,而es的导入进程则是在一台Intel 四核 2.5G,4G内存的机器上跑的,也许会有性能的差异。ES版本0.19.8,Solr版本4.0-ALPHA。
1. Solr的导入性能:3400万条记录,用时62分钟,平均9140条/秒,占用空间12.75G
2. 使用 *999* 这样的模糊查询,3秒以内返回,稍长一点的查询条件 *00100014*,也是2~3秒返回
3. Es的导入性能(设置Xmx为10G):3400万条记录,用时40分钟,平均14167条/秒,占用空间33.26G,客户端采用4个并发。
4. 使用 *999* 这样的模糊查询,9秒返回,稍长一点的查询条件 *00100014*,11.8秒返回
5. 如果不是针对所有字段查询,而是针对某个特定字段,比如 SAM_CODE: *00100014*,那么也是1秒以内返回。
6. 结论:es的查询效率也可以很高,只是我们还不会用。
7. 结论2:es有个设置是把所有字段放一块的那个,缺省是放一起,但是不知道为什么没起到应有的作用。
备注:
1. Solr第一次的那个内存使用的是缺省设置,这次改为10G,结果导入性能反而变差了,400万条记录,用了8分钟,平均8333条/秒,不知道为什么。
2. 改回缺省的内存配置,导入速度仍然慢。
3. 重启Linux,用10G的内存配置,再导入,5030万条记录,用时92分,约9112条/秒,说明导入速度和内存配置没有大差别
4. 在10G配置的情况下,检索速度也差别不大。
5. 为了搞清楚lucene4.0和solr4.0的进步有多大,下载了solr3.6.1,所幸的是4.0的配置文件在3.6.1上也可以用,所以很快就搭起来进行测试,导入性能为:3400万条记录,用时55分钟,约10303条/秒,占用空间13.85G。查询性能:*999*第一次11.6s,*00100014* 27.3s,相比4.0ALPHA的结果(5000万结果当中,*999*第一次2.6s,*00100014*第一次2.5s)来说,慢了很多,与es的性能差不多,因此,也许lucene4.0真的对性能有大幅提升?
集群对比:
采用4台同样配置(Intel i7,32G内存)的Centos 6.3组成的集群,进行对比。
1. 首先是es,很方便的就组成了一个Cluster,等上一个3400万条的Index全部均衡负载之后进行测试,导入到另外一个Index当中。
2. 导入性能:8500万条记录,用时72分钟,约为19676条/秒。在前5千万条记录导入时的速度在2万/条以上,初始的速度在2.2万/条。占用空间78.6G(由于有冗余,实际占用空间为157.2G)
3. 查询性能:
*999*第一次13.5秒,第二次19.5秒,第三次7.4秒,第四次7.1秒,第五次7.1秒
*00100014*第一次17.2秒,第二次16.6秒,第三次17.9秒,第四次16.7秒,第五次17.1秒
SAM_CODE:*999*,0.8s,1.3s,0.02s,0.02s,0.02s
SAM_CODE: *00100014*,0.1s,0.1s,0.02s,0.03s,0.05s
4. Solr4.0-ALPHA,SolrCloud的配置还算简单,启动一个ZooKeeper,然后其他三台机器访问这个地址,就可以组成一个Cloud:
机器1: nohup java -Xms10G -Xmx10G -Xss256k -Djetty.port=8983 -Dsolr.solr.home="./example-DIH/solr/" -Dbootstrap_confdir=./example-DIH/solr/db/conf/ -Dcollection.configName=xabconf3 -DzkRun -DnumShards=4 -jar start.jar &
其他机器:nohup java -Xms10G -Xmx10G -Dsolr.solr.home="./example-DIH/solr/" -DzkHost=192.168.2.11:9983 -jar start.jar &
但是在执行 data import 的时候,频繁出现 OutOfMemoryError: unable to create new native thread。查了很多资料,把Linux的ulimit当中的nproc改成10240,把Xss改成256K,都解决不了问题。暂时没有办法进行。
结论
1. 导入性能,es更强
2. 查询性能,solr 4.0最好,es与solr 3.6持平,可以乐观的认为,等es采用了lucene4之后,性能会有质的提升
3. Es采用SAM_CODE这样的查询性能很好,但是用_all性能就很差,而且差别非常大,因此,个人认为在目前的es情况下,仍然有性能提升的空间,只是现在还没找到方法。 参考技术A 从两个方面对ElasticSearch和Solr进行对比,从关系型数据库中的导入速度和模糊查询的速度。
单机对比
1. Solr 发布了4.0-alpha,试了一下,发现需要自己修改schema,好处是它自带一个data importer。在自己的计算机上测试了一下,导入的性能大概是:14分钟导入 3092730 条记录,约合 3682条/秒。
2. 3百万条记录的情况下,模糊查询和排序基本都在1秒内返回
3. 刚才的测试,是每个field单独存储,现在修改了一下配置文件,增加了一个copyField,所有的field都拷贝一份到text这个field里面去,导入的性能大概是:19分钟导入了3092730 条记录,约合 2713条/秒
4. 3百万条记录的情况下,针对text的模糊查询基本在1秒内返回,但是针对所有记录的排序,大概要2~3秒
5. 使用 elasticsearch 0.19.8,缺省配置,用单任务导入,导入性能是:20分钟导入了3092730 条记录,约合2577条/秒
6. 3百万条记录的情况下,查询基本上在1秒内返回,但是模糊查询比较慢,第一次要10秒,后来大概要1~3秒。加上排序大概需要5秒,整体排序基本100ms
查询及排序的指令:
"query":
"query_string":
"query": "*999*"
,
"sort": [
"TIME_UP":
"order": "asc"
]
7. Es0.19.8,用两个任务导入,导入性能是:13分钟导入了3092730 条记录,约合3965条/秒
8. Solr全部建好索引后,占用磁盘空间是1.2G,es占用磁盘空间是4G
单机对比2
在一台Intel i7,32G内存的机器上,重新跑这两个的对比。不过有个重大的区别在于,Solr是在这台性能很好的机器上跑,而es的导入进程则是在一台Intel 四核 2.5G,4G内存的机器上跑的,也许会有性能的差异。ES版本0.19.8,Solr版本4.0-ALPHA。
1. Solr的导入性能:3400万条记录,用时62分钟,平均9140条/秒,占用空间12.75G
2. 使用 *999* 这样的模糊查询,3秒以内返回,稍长一点的查询条件 *00100014*,也是2~3秒返回
3. Es的导入性能(设置Xmx为10G):3400万条记录,用时40分钟,平均14167条/秒,占用空间33.26G,客户端采用4个并发。
4. 使用 *999* 这样的模糊查询,9秒返回,稍长一点的查询条件 *00100014*,11.8秒返回
5. 如果不是针对所有字段查询,而是针对某个特定字段,比如 SAM_CODE: *00100014*,那么也是1秒以内返回。
6. 结论:es的查询效率也可以很高,只是我们还不会用。
7. 结论2:es有个设置是把所有字段放一块的那个,缺省是放一起,但是不知道为什么没起到应有的作用。
备注:
1. Solr第一次的那个内存使用的是缺省设置,这次改为10G,结果导入性能反而变差了,400万条记录,用了8分钟,平均8333条/秒,不知道为什么。
2. 改回缺省的内存配置,导入速度仍然慢。
3. 重启Linux,用10G的内存配置,再导入,5030万条记录,用时92分,约9112条/秒,说明导入速度和内存配置没有大差别
4. 在10G配置的情况下,检索速度也差别不大。
5. 为了搞清楚lucene4.0和solr4.0的进步有多大,下载了solr3.6.1,所幸的是4.0的配置文件在3.6.1上也可以用,所以很快就搭起来进行测试,导入性能为:3400万条记录,用时55分钟,约10303条/秒,占用空间13.85G。查询性能:*999*第一次11.6s,*00100014* 27.3s,相比4.0ALPHA的结果(5000万结果当中,*999*第一次2.6s,*00100014*第一次2.5s)来说,慢了很多,与es的性能差不多,因此,也许lucene4.0真的对性能有大幅提升?
集群对比:
采用4台同样配置(Intel i7,32G内存)的Centos 6.3组成的集群,进行对比。
1. 首先是es,很方便的就组成了一个Cluster,等上一个3400万条的Index全部均衡负载之后进行测试,导入到另外一个Index当中。
2. 导入性能:8500万条记录,用时72分钟,约为19676条/秒。在前5千万条记录导入时的速度在2万/条以上,初始的速度在2.2万/条。占用空间78.6G(由于有冗余,实际占用空间为157.2G)
3. 查询性能:
*999*第一次13.5秒,第二次19.5秒,第三次7.4秒,第四次7.1秒,第五次7.1秒
*00100014*第一次17.2秒,第二次16.6秒,第三次17.9秒,第四次16.7秒,第五次17.1秒
SAM_CODE:*999*,0.8s,1.3s,0.02s,0.02s,0.02s
SAM_CODE: *00100014*,0.1s,0.1s,0.02s,0.03s,0.05s
4. Solr4.0-ALPHA,SolrCloud的配置还算简单,启动一个ZooKeeper,然后其他三台机器访问这个地址,就可以组成一个Cloud:
机器1: nohup java -Xms10G -Xmx10G -Xss256k -Djetty.port=8983 -Dsolr.solr.home="./example-DIH/solr/" -Dbootstrap_confdir=./example-DIH/solr/db/conf/ -Dcollection.configName=xabconf3 -DzkRun -DnumShards=4 -jar start.jar &
其他机器:nohup java -Xms10G -Xmx10G -Dsolr.solr.home="./example-DIH/solr/" -DzkHost=192.168.2.11:9983 -jar start.jar &
但是在执行 data import 的时候,频繁出现 OutOfMemoryError: unable to create new native thread。查了很多资料,把Linux的ulimit当中的nproc改成10240,把Xss改成256K,都解决不了问题。暂时没有办法进行。
结论
1. 导入性能,es更强
2. 查询性能,solr 4.0最好,es与solr 3.6持平,可以乐观的认为,等es采用了lucene4之后,性能会有质的提升
3. Es采用SAM_CODE这样的查询性能很好,但是用_all性能就很差,而且差别非常大,因此,个人认为在目前的es情况下,仍然有性能提升的空间,只是现在还没找到方法。 参考技术B Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果,【特点】是一个高性能,采用Java开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。
【ElasticSearch】:ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。ElasticSearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、php、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。
Solr和ES对比
Solr与ES(ElasticSearch)对比
搜索引擎选择: Elasticsearch与Solr
搜索引擎选型调研文档
Elasticsearch简介*
Elasticsearch是一个实时的分布式搜索和分析引擎。它可以帮助你用前所未有的速度去处理大规模数据。
它可以用于全文搜索,结构化搜索以及分析,当然你也可以将这三者进行组合。
Elasticsearch是一个建立在全文搜索引擎 Apache Lucene? 基础上的搜索引擎,可以说Lucene是当今最先进,最高效的全功能开源搜索引擎框架。
但是Lucene只是一个框架,要充分利用它的功能,需要使用JAVA,并且在程序中集成Lucene。需要很多的学习了解,才能明白它是如何运行的,Lucene确实非常复杂。
Elasticsearch使用Lucene作为内部引擎,但是在使用它做全文搜索时,只需要使用统一开发好的API即可,而不需要了解其背后复杂的Lucene的运行原理。
当然Elasticsearch并不仅仅是Lucene这么简单,它不但包括了全文搜索功能,还可以进行以下工作:
-
分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。
-
实时分析的分布式搜索引擎。
-
可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。
这么多的功能被集成到一台服务器上,你可以轻松地通过客户端或者任何你喜欢的程序语言与ES的RESTful API进行交流。
Elasticsearch的上手是非常简单的。它附带了很多非常合理的默认值,这让初学者很好地避免一上手就要面对复杂的理论,
它安装好了就可以使用了,用很小的学习成本就可以变得很有生产力。
随着越学越深入,还可以利用Elasticsearch更多高级的功能,整个引擎可以很灵活地进行配置。可以根据自身需求来定制属于自己的Elasticsearch。
使用案例:
-
维基百科使用Elasticsearch来进行全文搜做并高亮显示关键词,以及提供search-as-you-type、did-you-mean等搜索建议功能。
-
英国卫报使用Elasticsearch来处理访客日志,以便能将公众对不同文章的反应实时地反馈给各位编辑。
-
StackOverflow将全文搜索与地理位置和相关信息进行结合,以提供more-like-this相关问题的展现。
-
GitHub使用Elasticsearch来检索超过1300亿行代码。
-
每天,Goldman Sachs使用它来处理5TB数据的索引,还有很多投行使用它来分析股票市场的变动。
但是Elasticsearch并不只是面向大型企业的,它还帮助了很多类似DataDog以及Klout的创业公司进行了功能的扩展。
Elasticsearch的优缺点**:
优点
-
Elasticsearch是分布式的。不需要其他组件,分发是实时的,被叫做”Push replication”。
-
Elasticsearch 完全支持 Apache Lucene 的接近实时的搜索。
-
处理多租户(multitenancy)不需要特殊配置,而Solr则需要更多的高级设置。
-
Elasticsearch 采用 Gateway 的概念,使得完备份更加简单。
-
各节点组成对等的网络结构,某些节点出现故障时会自动分配其他节点代替其进行工作。
缺点
-
只有一名开发者(当前Elasticsearch GitHub组织已经不只如此,已经有了相当活跃的维护者)
-
还不够自动(不适合当前新的Index Warmup API)
Solr简介*
Solr(读作“solar”)是Apache Lucene项目的开源企业搜索平台。其主要功能包括全文检索、命中标示、分面搜索、动态聚类、数据库集成,以及富文本(如Word、PDF)的处理。Solr是高度可扩展的,并提供了分布式搜索和索引复制。Solr是最流行的企业级搜索引擎,Solr4 还增加了NoSQL支持。
Solr是用Java编写、运行在Servlet容器(如 Apache Tomcat 或Jetty)的一个独立的全文搜索服务器。 Solr采用了 Lucene Java 搜索库为核心的全文索引和搜索,并具有类似REST的HTTP/XML和JSON的API。Solr强大的外部配置功能使得无需进行Java编码,便可对其进行调整以适应多种类型的应用程序。Solr有一个插件架构,以支持更多的高级定制。
因为2010年 Apache Lucene 和 Apache Solr 项目合并,两个项目是由同一个Apache软件基金会开发团队制作实现的。提到技术或产品时,Lucene/Solr或Solr/Lucene是一样的。
Solr的优缺点
优点
-
Solr有一个更大、更成熟的用户、开发和贡献者社区。
-
支持添加多种格式的索引,如:HTML、PDF、微软 Office 系列软件格式以及 JSON、XML、CSV 等纯文本格式。
-
Solr比较成熟、稳定。
-
不考虑建索引的同时进行搜索,速度更快。
缺点
-
建立索引时,搜索效率下降,实时索引搜索效率不高。
Elasticsearch与Solr的比较*
当单纯的对已有数据进行搜索时,Solr更快。
当实时建立索引时, Solr会产生io阻塞,查询性能较差, Elasticsearch具有明显的优势。
search_fresh_index_while_indexing
随着数据量的增加,Solr的搜索效率会变得更低,而Elasticsearch却没有明显的变化。
search_fresh_index_while_indexing
综上所述,Solr的架构不适合实时搜索的应用。
实际生产环境测试*
下图为将搜索引擎从Solr转到Elasticsearch以后的平均查询速度有了50倍的提升。
Elasticsearch 与 Solr 的比较总结
-
二者安装都很简单;
-
Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能;
-
Solr 支持更多格式的数据,而 Elasticsearch 仅支持json文件格式;
-
Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供;
-
Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch。
Solr 是传统搜索应用的有力解决方案,但 Elasticsearch 更适用于新兴的实时搜索应用。
其他基于Lucene的开源搜索引擎解决方案*
-
直接使用 Lucene
说明:Lucene 是一个 JAVA 搜索类库,它本身并不是一个完整的解决方案,需要额外的开发工作。
优点:成熟的解决方案,有很多的成功案例。apache 顶级项目,正在持续快速的进步。庞大而活跃的开发社区,大量的开发人员。它只是一个类库,有足够的定制和优化空间:经过简单定制,就可以满足绝大部分常见的需求;经过优化,可以支持 10亿+ 量级的搜索。
缺点:需要额外的开发工作。所有的扩展,分布式,可靠性等都需要自己实现;非实时,从建索引到可以搜索中间有一个时间延迟,而当前的“近实时”(Lucene Near Real Time search)搜索方案的可扩展性有待进一步完善
说明:基于 Lucene 的,支持分布式,可扩展,具有容错功能,准实时的搜索方案。
优点:开箱即用,可以与 Hadoop 配合实现分布式。具备扩展和容错机制。
缺点:只是搜索方案,建索引部分还是需要自己实现。在搜索功能上,只实现了最基本的需求。成功案例较少,项目的成熟度稍微差一些。因为需要支持分布式,对于一些复杂的查询需求,定制的难度会比较大。
说明:Map/Reduce 模式的,分布式建索引方案,可以跟 Katta 配合使用。
优点:分布式建索引,具备可扩展性。
缺点:只是建索引方案,不包括搜索实现。工作在批处理模式,对实时搜索的支持不佳。
说明:基于 Lucene 的一系列解决方案,包括 准实时搜索 zoie ,facet 搜索实现 bobo ,机器学习算法 decomposer ,摘要存储库 krati ,数据库模式包装 sensei 等等
优点:经过验证的解决方案,支持分布式,可扩展,丰富的功能实现
缺点:与 linkedin 公司的联系太紧密,可定制性比较差
说明:基于 Lucene,索引存在 cassandra 数据库中
优点:参考 cassandra 的优点
缺点:参考 cassandra 的缺点。另外,这只是一个 demo,没有经过大量验证
说明:基于 Lucene,索引存在 HBase 数据库中
优点:参考 HBase 的优点
缺点:参考 HBase 的缺点。另外,在实现中,lucene terms 是存成行,但每个 term 对应的 posting lists 是以列的方式存储的。随着单个 term 的 posting lists 的增大,查询时的速度受到的影响会非常大
以上是关于solr和elasticsearch对比,有什么差别吗的主要内容,如果未能解决你的问题,请参考以下文章