根据项目需求用到了Es,好久不用的我,赶紧查资料,然后忽然发现这个跟MongoDB怎么这么接近呢?
然后查阅了一些资料特此简单做下对比:
1、mongodb的目标是:“取代oracle和db2”(财务总监时上市说的)。和RDBMS是竞争关系。
2、es的大部分场景是:“一个常见的设置是使用其它数据库作为主要的数据存储,使用 Elasticsearch 做数据检索”(2.X官方文档里说的)。和RDBMS是辅助关系。
1、都是以json格式管理数据的nosql数据库。
2、都支持CRUD操作。
3、都支持聚合和全文检索。
4、都支持分片和复制。
5、都支持阉割版的join操作。
6、都支持处理超大规模数据。
7、目前都不支持事务或者叫支持阉割版的事务。
1、es是java编写,通过RESTFul接口操作数据。mongodb是C++编写,通过driver操作数据。(es对java开发更有好,利于排查理解)
2、mongodb的分片有hash和range两种方式,es只有hash一种。
3、es是天生分布式,主副分片自动分配和复制,开箱即用。mongodb的分布式是由“前置查询路由+配置服务+shard集合”,需要手动配置集群服务。
4、内部存储ES是到排索引+docvalues+fielddata。mongodb暂时未知。
5、es全文检索有强大的分析器且可以灵活组合,查询时智能匹配。mongodb的全文检索字段个数有限制。
6、es所有字段自动索引,mongodb的字段需要手动索引。
7、es非实时有数据丢失窗口。mongodb实时理论上无数据丢失风险。
1、es偏向于检索、查询、数据分析,适用于OLAP系统。mongodb偏向于大数据规模下的CRUD,适用于对事务要求不强的OLTP系统。
动态查询
全索引支持,扩展到内部对象和内嵌数组
查询记录分析
快速,就地更新
高效存储二进制大对象 (比如照片和视频)
复制和故障切换支持
Auto- Sharding自动分片支持云级扩展性
MapReduce 支持复杂聚合
商业支持,培训和咨询
{ "system" : { "currentTime" : { "$date" : "2015-07-27T14:06:40.976+0800" },
"hostname" : "dachuanz-test",
"cpuAddrSize" : 64,
"memSizeMB" : 3791,
"numCores" : 4,
"cpuArch" : "x86_64",
"numaEnabled" : false },
"os" : { "type" : "Linux",
"name" : "CentOS Linux release 7.1.1503 (Core) ",
"version" : "Kernel 3.10.0-229.7.2.el7.x86_64" },
"extra" : { "versionString" : "Linux version 3.10.0-229.7.2.el7.x86_64 ([email protected]) (gcc version 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC) ) #1 SMP Tue Jun 23 22:06:11 UTC 2015",
"libcVersion" : "2.17",
"kernelVersion" : "3.10.0-229.7.2.el7.x86_64",
"cpuFrequencyMHz" : "1596.149",
"cpuFeatures" : "fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good nopl aperfmperf pni dtes64 monitor ds_cpl vmx tm2 ssse3 cx16 xtpr pdcm dca lahf_lm dtherm tpr_shadow",
"pageSize" : { "$numberLong" : "4096" },
"numPages" : 970635,
"maxOpenFiles" : 64000 },
"ok" : 1
}
elasticSearch 目前主要用于大量数据的挖掘和搜索。使用的优势是在数据量较大的时候可以进行快速搜索,并且本身还带有分词器,可以对elasticSearch内的数据进行分词搜索。有利于数据管理。
但相对的来说,缺点也很明显。在需要添加新数据与新字段的时候,如果elasticSearch进行搜索是可能需要重新修改格式。之前的数据需要重新同步,对数据的管理有很多困难。
一旦数据格式出现改变,会变得非常麻烦。
另一个缺点就是在搜索的时候,和之前的mysql不同,有许多mysql可以搜索到的东西,在elasticSearch里就不能搜或很难搜。
{
"_index": "rta_daily_report",
"_type": "campaign",
"_id": "145603275_m_normal_20170804",
"_version": 1,
"found": true,
"_source": {
"cid": 145603275,
"advertiser_id": 457,
"trace_app_id": "id1105855019",
"network_cid": "plr_gs_ios_cn_osv9",
"platform": 2,
"direct": 1,
"last_second_domain": "tracking.lenzmx.com",
"jump_type": 7,
"direct_trace_app_id": "id1105855019",
"mode": 3,
"third": "3444.tlnk.io",
"hops": 1,
"yyyymmdd": "2017-08-03T16:00:00",
"type": "m_normal",
"click": 2,
"impression": 3,
"revenue": 0,
"install": 0
}
}
不要以为对比就是敌人,他俩也是可以搭配的哦!Elasticsearch+Mongo亿级别数据导入及查询实践,哈哈。。。
所以说,能力不是重点,合作才有未来。