Es与MongoDB地理数据搜索性能比较 | 您所在的位置:网站首页 › es搜索性能测试 › Es与MongoDB地理数据搜索性能比较 |
Es与MongoDB地理数据搜索性能比较
基础环境信息
主机信息: 处理器:i5-9400 2.90GHz内存:16G硬盘:224G软件信息: Es: 版本:7.6.2JDK 1.8单机模式运行默认配置文件Es客户端: RestHighLevelClient 7.6.2Mongo: 版本:4.2.11单机模式运行默认配置文件Mongo客户端: spring-data-mongodb 3.1.2mongodb-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:支持较多的查询方式,分别为圆形查询(球体)、圆形查询和球面直线查询。 不同客户端端查询耗时比较 客户端查询耗时/ms10w20w30w40w50w60w100wES(RestHighLevelClient)153150139139142144141MongoDB(MongoTemplate,圆形查询(球体))91949496919591MongoDB(Mongo cilent,圆形查询(球体))60636665656367说明: 查询的数据集均创建过对应索引。 不同查询方式比较MongoDB中提供了对于圆形区域提供了不同方式的查询,以下是查询相同数据集的结果比较: MongoDB不同查询方式耗时/ms10w100wMongoDB(MongoTemplate,圆形查询(球体))8991MongoDB(MongoTemplate,圆形查询)9190MongoDB(Mongo cilent,圆形查询(球体))6067MongoDB(Mongo cilent,圆形查询)6264说明: 不同的查询方式需创建不同的索引,不然查询时间较长。 球面直线查询误差较大,查询结果中出现了许多不准确的坐标点,故不在对比结果中。 上面查询的耗时的前提是创建了对应格式的索引。 有无索引查询比较下面给出有无创建索引的查询耗时比较结果: MongoDB查询耗时/ms50w100wMongoDB(MongoTemplate,圆形查询(球体)),创建索引9187MongoDB(MongoTemplate,圆形查询(球体)),未创建索引7091358MongoDB(Mongo cilent,圆形查询(球体)),创建索引6367MongoDB(Mongo cilent,圆形查询(球体)),未创建索引6681310结论: 在相同地理数据集的情况下,mongo数据库的查询耗时比es数据库短大约30~40%。 spring data mongo提供了基于mongo driver的一层封装,使用起来更加简单便捷,如提供了序列化和反序列化的处理。原生的mongo client也提供了全面的查询方法,查询效率略高一些,不过在程序中需要增加一些处理代码,如序列化方法等,仅对结果简单处理时可以考虑使用。 有无创建索引,对于地理数据的查询耗时影响较大。 客户端查询耗时分析通过查看MongoTemplate源码,template是在client的基础上做了封装,为了保证了读写数据的安全和于查询结果的处理更加简单,添加了包括对查询结果的映射,包括嵌套数据;上锁保证线程安全等处理代码。添加的处理逻辑增加了一部分时间开销。如下是template查询时的核心代码块: private List executeFindMultiInternal(CollectionCallback collectionCallback, CursorPreparer preparer, DocumentCallback objectCallback, String collectionName) { try { MongoCursor cursor = null; try { cursor = preparer .initiateFind(getAndPrepareCollection(doGetDatabase(), collectionName), collectionCallback::doInCollection) .iterator();//获取查询的原始结果 List 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 |
CopyRight 2018-2019 实验室设备网 版权所有 |