Es与MongoDB地理数据搜索性能比较

基础环境信息

主机信息:

  • 处理器:i5-9400 2.90GHz
  • 内存:16G
  • 硬盘:224G

软件信息:
Es:

  • 版本:7.6.2
  • JDK 1.8
  • 单机模式运行
  • 默认配置文件

Es客户端:

  • RestHighLevelClient 7.6.2

Mongo:

  • 版本:4.2.11
  • 单机模式运行
  • 默认配置文件

Mongo客户端:

  • spring-data-mongodb 3.1.2
  • mongodb-driver-sync 4.1.1

准备和录入测试数据

分别在Es和MongoDB中和存储10、100w等数量的坐标点数据,并随机在其中插入若干数量的测试坐标点,作为范围查询的记录。以下分别是es和mongo对应的数据说明。数据格式采用标准地理数据格式,但在两个数据库中格式略有不同,数据格式标准为RFC7946。

Es存储数据

{"type": "Feature","geometry": {"type": "Point","coordinates": [125.6, 10.1]},"properties": {"name": "Dinagat Islands"}
}

es中geo格式的数据:

  • geo_point
    地理坐标点,在Elasticsearch中用来存经纬度数据的一种数据格式。在es中指定数据类型:
{"mappings": {"store":{"properties": {"location":{"type": "geo_point"}}}}
}

存储示例:

{
"_index": "my-index-geo-01",
"_type": "_doc",
"_id": "100",
"_version": 1,
"_score": 1,
"_source": {
"location": "-9.85,-28.76"
}
}

Mongo存储数据

坐标数据格式,mongo支持两个格式:
格式一,为mongo支持的较标准的地理格式,但是与geoJson略有不同;支持2d和2dsphere索引:

{"_id" : 0,"loc" : {"coordinates" : [21.38,-40.7],"type" : "Point"}
}

格式二,较旧的格式模式,支持2d和2dsphere索引:

{ "_id" : 0, "loc" : [ 3.78, 5.94 ] }

创建集合和坐标索引:

db.demo.createIndex({loc: "2dsphere" })

查询耗时比较

查询数据方式

ES:按照geo_distance方式查询,找出指定位置在给定距离内的数据,相当于指定圆心和半径找到圆中点。
Mongo:支持较多的查询方式,分别为圆形查询(球体)、圆形查询和球面直线查询。

不同客户端端查询耗时比较

客户端查询耗时/ms 10w 20w 30w 40w 50w 60w 100w
ES(RestHighLevelClient) 153 150 139 139 142 144 141
MongoDB(MongoTemplate,圆形查询(球体)) 91 94 94 96 91 95 91
MongoDB(Mongo cilent,圆形查询(球体)) 60 63 66 65 65 63 67

说明:
查询的数据集均创建过对应索引。

不同查询方式比较

MongoDB中提供了对于圆形区域提供了不同方式的查询,以下是查询相同数据集的结果比较:

MongoDB不同查询方式耗时/ms 10w 100w
MongoDB(MongoTemplate,圆形查询(球体)) 89 91
MongoDB(MongoTemplate,圆形查询) 91 90
MongoDB(Mongo cilent,圆形查询(球体)) 60 67
MongoDB(Mongo cilent,圆形查询) 62 64

说明:
不同的查询方式需创建不同的索引,不然查询时间较长。
球面直线查询误差较大,查询结果中出现了许多不准确的坐标点,故不在对比结果中。
上面查询的耗时的前提是创建了对应格式的索引。

有无索引查询比较

下面给出有无创建索引的查询耗时比较结果:

MongoDB查询耗时/ms 50w 100w
MongoDB(MongoTemplate,圆形查询(球体)),创建索引 91 87
MongoDB(MongoTemplate,圆形查询(球体)),未创建索引 709 1358
MongoDB(Mongo cilent,圆形查询(球体)),创建索引 63 67
MongoDB(Mongo cilent,圆形查询(球体)),未创建索引 668 1310

结论:
在相同地理数据集的情况下,mongo数据库的查询耗时比es数据库短大约30~40%。
spring data mongo提供了基于mongo driver的一层封装,使用起来更加简单便捷,如提供了序列化和反序列化的处理。原生的mongo client也提供了全面的查询方法,查询效率略高一些,不过在程序中需要增加一些处理代码,如序列化方法等,仅对结果简单处理时可以考虑使用。
有无创建索引,对于地理数据的查询耗时影响较大。

客户端查询耗时分析

通过查看MongoTemplate源码,template是在client的基础上做了封装,为了保证了读写数据的安全和于查询结果的处理更加简单,添加了包括对查询结果的映射,包括嵌套数据;上锁保证线程安全等处理代码。添加的处理逻辑增加了一部分时间开销。如下是template查询时的核心代码块:

private <T> List<T> executeFindMultiInternal(CollectionCallback<FindIterable<Document>> collectionCallback,CursorPreparer preparer, DocumentCallback<T> objectCallback, String collectionName) {try {MongoCursor<Document> cursor = null;try {cursor = preparer.initiateFind(getAndPrepareCollection(doGetDatabase(), collectionName), collectionCallback::doInCollection).iterator();//获取查询的原始结果List<T> result = new ArrayList<>();while (cursor.hasNext()) {Document object = cursor.next();result.add(objectCallback.doWith(object));//处理原始数据,映射成对应的数据类型}return result;} finally {if (cursor != null) {cursor.close();}}} catch (RuntimeException e) {throw potentiallyConvertRuntimeException(e, exceptionTranslator);}}

地理空间数据模型说明

数据类型

mongo中支持的地理空间数据类型有:Point、LineString、Polygon、MultiPoint、MultiLineString、MultiPolygon、GeometryCollection。
坐标点的数据结构是:

{ type: "Point", coordinates: [ 40, 5 ] }

空间数据索引

2dsphere索引:支持球面空间查询。
2d索引:支持平面空间查询,支持部分球面查询,但是会出现误差。推荐尽量使用2dsphere索引。

查询方式

主要有四种查询类型、计算方法说明及索引支持:

名称 说明 索引支持
$near 查询指定一个点在平面中从最近到最远的坐标点。 2dsphere and 2d
$nearSphere 查询指定一个点在球面中从最近到最远的坐标点。 2dsphere and 2d
$geoWithin 查询指定多边形形状中全部的坐标点。包括的形状有:矩形、多边形、圆形和球面圆形。 2dsphere and 2d
$geoIntersects 查询与指定GeoJSON对象相交的坐标点。 2dsphere

从10w个数据点中查询某个坐标点相近的坐标点的结果,实际数据中有五个参考点:

名称 查询结果数量
$near(直线距离最远1m内) 14
$nearSphere(直线距离最远1m内) 31356
$geoWithin(半径在1m的平面圆形内) 5
$geoWithin(半径在1m的球面圆形内) 5
$geoIntersects(与参考点相交的点) 5

Es与MongoDB地理数据搜索性能比较相关推荐

  1. es分页查询重复数据_ES优化 - 巨量数据如何提高查询性能

    问题:如果数据量特别大,如何优化ES的查询性能? 可以从以下几个方面进行思考: File Cache可用的内存: ES的查询严重依赖OS的File Cache,所以说内存分配的内存肯定是越多越好.最理 ...

  2. 使用ES的数据搜索功能

    DSL查询文档 elasticsearch的查询是基于JSON风格的DSL来实现的 使用下面的代码首先看es的,把数据批量导入之后在运行在Kibana中 查询所有,查询类型时match_all ,没有 ...

  3. MongoDB 教程五: MongoDB固定集合和性能优化 (索引Indexes, 优化器, 慢查询profile)

    mongodb索引详解(Indexes) 索引介绍 索引在mongodb中被支持,如果没有索引,mongodb必须扫描每一个文档集合选择匹配的查询记录.这样扫描集合效率并不高,因为它需要mongod进 ...

  4. 大数据搜索不只开源Elastic,星环科技自研New Search青出于蓝

    大数据产业创新服务媒体 --聚焦数据 · 改变商业 1月15日,全球著名的大数据搜索与实时处理公司Elastic公司CEO Shay Banon突然发文宣布,Elasticsearch和Kibana的 ...

  5. 碾压ES和MongoDB,RedisJson横空出世!

    " 近期官网给出了 RedisJson(RedisSearch)的性能测试报告,可谓碾压其他 NoSQL. 图片来自 Pexels 下面是核心的报告内容,先上结论: 对于隔离写入(isola ...

  6. 大数据搜索选开源还是商业软件?ElasticSearch 对比 Splunk

    2019独角兽企业重金招聘Python工程师标准>>> 本文就架构,功能,产品线,概念等方面就ElasticSearch和Splunk做了一下全方位的对比,希望能够大家在制定大数据搜 ...

  7. 聚合中返回source_大数据搜索与可视化分析(9)elasticsearch聚合分析Metric Aggregation...

    在上一篇文章中,我们介绍了<大数据搜索与可视化分析(8)kibana入门教程-2-Discover>,本文学习elasticsearch聚合分析,是对<大数据搜索与可视化分析(3)e ...

  8. 【ElasticSearch】大数据搜索选开源还是商业软件?ElasticSearch 对比 Splunk

    1.概述 转载:大数据搜索选开源还是商业软件?ElasticSearch 对比 Splunk述 本文就架构,功能,产品线,概念等方面就ElasticSearch和Splunk做了一下全方位的对比,希望 ...

  9. 【Elasticsearch】es 5.3.0 bulk index 性能调优实践

    1.概述 转载:elasticsearch5.3.0 bulk index 性能调优实践 一.集群基本信息 每天日志量70亿 ES版本: 5.3.0 机器部署 master node: 3台 data ...

  10. 为什么ES不适合做数据存储

    前段时间公司想尝试用ES来存一部分数据,以此缓解数据增长带来的对数据库的压力.ES的介绍很多地方都有,就不再写了.在研究了一段时间后,发现ES不适合做为数据存储使用,理由如下: mapping不可改, ...

最新文章

  1. Windbg 教程-调试非托管程序的基本命令下
  2. poj2362 DFS+剪枝
  3. Hibernate中的核心接口query接口用法
  4. flutter 自定义 AppBar
  5. deepin系统中.txt文件图标显示内容问题_深度系统Deepin 20最新正式版发布:从DDE到应用全面升级-Deepin 20,深度系统 ——快科技(驱动之家旗下媒体)-...
  6. CG-CTF-Web-SQL注入1
  7. oracle 游标的理解
  8. 14-1 获得初始页面内容
  9. linux mysql端口启动失败怎么办,Linux下apache mysql等服务修改默认端口后无法正常启动解决办法...
  10. 为何python不好找工作-为何python不好找工作,seo行业不好转行了
  11. Cinder组件解析
  12. word中插入emf,svg图像的注意事项
  13. 客气话要靠谱。比如公司业务一直没开展,却说学到了太多东西,那学的难道是怎样把公司搞死?
  14. 数模系列(3):模糊综合评价法
  15. win7没有权限使用计算机的,Win7提示你可能没有权限使用网络资源|未授予用户在此计算机解决方法...
  16. 念念不忘,必有回响。5次失败后,淘宝爬虫终于可以用了
  17. 2021佛山高考成绩查询,2021佛山市地区高考成绩排名查询,佛山市高考各高中成绩喜报榜单...
  18. C++之 友元(friend)
  19. 8000字解读安踏理想汽车丨打破用户体验黑箱的实战策略
  20. 前端小动画之飘落的小雪花

热门文章

  1. Collecting package metadata (current_repodata.json)解决方法
  2. 读书笔记 - 自控力
  3. 从社交网络图的edgelist得到adj
  4. 教你解决PC微信“版本过低”无法登陆的问题
  5. 使用vue-i18n实现多语言
  6. deeplabv3+ 跑 cityscape 数据集
  7. 【深度相机系列二】深度相机原理揭秘--飞行时间(TOF)
  8. 各种文件的mime类型
  9. App消息推送 实现原理
  10. jmeter性能测试2-模拟多用户登录