SolrCloud空间搜索测试

简介: 空间查询是是利用点,线和多边形等地理信息获得满足特定空间关系的数据,广泛应用于新型农业、零售、服务和安全等领域。本文的业务背景也是基于活动轨迹的多边形查询。

概述

空间查询是是利用点,线和多边形等地理信息获得满足特定空间关系的数据,广泛应用于新型农业、零售、服务和安全等领域。本文的业务背景也是基于活动轨迹的多边形查询。


一、空间搜索类型

Solr目前主要支持以下空间搜索类型:

  • 索引点或其他形状
  • 用边界框或圆形或其他形状过滤搜索结果
  • 通过点之间的距离或矩形之间的相对面积来排序或提升得分
  • 二维网格上生成热图或者点绘。

本次测试主要是针对多变形的intersect和within查询。

二、配置SOLR并导入测试数据

创建测试collection:geo_test, 步骤如下:

1. 配置schema

拷贝一份默认的schma配置SOLR_INSTALL/server/solr/configsets/_default到新目录geo_configs

在geo_configs目录下的managed-schema文件中增加新字段geo, 并修改location_rptfieldType

<!-- add field geo -->
<field name="geo" type="location_rpt" indexed="true" stored="true" multiValued="true" />

<!-- modify field type to support polygon -->
<fieldType name="location_rpt"   
   class="solr.SpatialRecursivePrefixTreeFieldType"
   spatialContextFactory="org.locationtech.spatial4j.context.jts.JtsSpatialContextFactory"
   autoIndex="true"
   validationRule="repairBuffer0"
   distErrPct="0.025"
   maxDistErr="0.001"
   distanceUnits="kilometers" />

为了支持doc id的自动生成,需要配置eo_configs目录下的solrconfig.xml文件。

<updateRequestProcessorChain>
 <processor class="solr.UUIDUpdateProcessorFactory"><str name="fieldName">id</str></processor>
 <processor class="solr.LogUpdateProcessorFactory" />
 <processor class="solr.RunUpdateProcessorFactory" />
</updateRequestProcessorChain>

2.创建schema

此处可以先上传conf到zk上,也可以直接通过solr命令中-d选项指定配置目录。

cd ${SOLR_HOME}
./server/scripts/cloud-scripts/zkcli.sh \
  -zkhost emr-header-1:2181 \
  -cmd upconfig \
  -confname geo_test \
  -confdir ../data/geo_configs/conf

bin/solr create -c geo_test -n geo_test -s 8

3.导入数据

使用curl导入所有的数据

# total 50k documents in this directory
cd geodata

for file in `ls small_data_*`
do
    echo "loading data file: $file.."
    curl  'http://localhost:8983/solr/geo_test/update/csv?commit=true&separator=%2C&fieldnames=geo,MSOA11NM_s,MSOA11CD_s&header=true' \
      -H 'Content-type:text/csv; charset=utf-8' \
      --data-binary @$file
    ((counter++))
done

通过访问http://spark:8983/solr/#/geo_test/query ,查看导入的数据。

四、测试

Solr Cloud环境

  • 共4个节点
  • 每个节点JVM MEMORY 4G

测试表:geo_test

  • 8个shard
  • 每个节点2个shard
  • 每个doc都的geo字段包含几百个顶点的多边形
  • 测试数据分别为10万、100万、2000万

通过Python脚本随机生成不同顶点个数的多边形,对Intersect和within的多边形查询进行测试。

#!/usr/bin/python
import random
import requests
import json

url = "http://localhost:8983/solr"
collection = 'geo_test'

def query(vertices_numbers, pattern, isPolygon = False):
    data=[ ]
    first_group = ''
    for i in range(vertices_numbers - 1):
        latitude = random.randint(-4677000, 4643800) / 100000
        longitude = random.uniform(-2470650, -2349470) / 100000
        group = "{}%20{}".format(latitude, longitude)
        data.append(group)
        if i == 0:
            first_group = group

    if vertices_numbers > 1 :
        data.append(first_group)

    query_data = ''
    if isPolygon:
        query_data ="POLYGON(({}))".format(",".join(data))
    else:
        query_data = " ".join(data)
    condition = "geo:%22{}({})%22&q=*:*".format(pattern, query_data)
    request = "{}/{}/select?fq={}".format(url, collection, condition)
    response = requests.get(request)
    json_data = json.loads(response.text)
    return "query time:{}(ms)".format(json_data['responseHeader']['QTime'])

def polygonIntersectsQuery(vertices_numbers):
    return "Polygon have:{} vertices. Polygon intersect {}".format(vertices_numbers, query(vertices_numbers, 'Intersects', True))

def polygonWithIn(vertices_numbers):
    return "Polygon have:{} vertices. Polyton within {}".format(vertices_numbers, query(vertices_numbers, 'WithIn', True))


if __name__ == '__main__':
    # polygon intersect query
    vertices_set = [10, 50, 100, 150, 200, 250]
    for v in vertices_set:
        print(polygonIntersectsQuery(v))

    # polygon within query
    for v in vertices_set:
        print(polygonWithIn(v))

五、结论

不同数据量、不同顶点多边形intersect的测试结果:

Screen_Shot_2018_04_20_at_20_00_09

不同数据量、不同顶点多边形within的测试结果:

image

千万级别内的数据量,200-300个顶点的多边形复杂查询,毫秒级响应是没有问题的

参考

目录
相关文章
|
2月前
|
安全 应用服务中间件 网络安全
Python 渗透测试:漏洞的批量搜索与利用.(GlassFish 任意文件读取)
Python 渗透测试:漏洞的批量搜索与利用.(GlassFish 任意文件读取)
37 11
|
2月前
|
Web App开发 敏捷开发 测试技术
自动化测试框架的设计与实现探索操作系统的心脏:内核与用户空间的交互
【8月更文挑战第26天】本文旨在探讨自动化测试框架的设计原则、核心组件和实现方法。通过分析自动化测试的优势,我们深入讨论了框架设计的关键考虑因素,包括模块化、可重用性、可扩展性和易维护性。文章还介绍了如何利用流行的测试工具和编程语言来实现一个高效的自动化测试框架,并通过实例展示了框架的应用。
|
3月前
|
算法
基于Dijkstra算法的最优行驶路线搜索matlab仿真,以实际城市复杂路线为例进行测试
使用MATLAB2022a实现的Dijkstra算法在城市地图上搜索最优行驶路线的仿真。用户通过鼠标点击设定起点和终点,算法规划路径并显示长度。测试显示,尽管在某些复杂情况下计算路径可能与实际有偏差,但多数场景下Dijkstra算法能找到接近最短路径。核心代码包括图的显示、用户交互及Dijkstra算法实现。算法基于图论,不断更新未访问节点的最短路径。测试结果证明其在简单路线及多数复杂城市路况下表现良好,但在交通拥堵等特殊情况下需结合其他数据提升准确性。
|
5月前
|
消息中间件 测试技术
百度搜索:蓝易云【使用JMeter安装RabbitMQ测试插件的步骤】
以上是安装RabbitMQ测试插件的基本步骤。根据您的具体需求和JMeter版本,可能会有一些细微的差异,但总体流程应该是相似的。
120 1
|
5月前
|
人工智能 开发工具 git
语义搜索测试
语义搜索测试
59 0
|
5月前
|
Ubuntu 数据库 数据安全/隐私保护
百度搜索:蓝易云【ubuntu中编译安装opensips并测试】
以上是在Ubuntu中编译安装OpenSIPS并进行测试的基本步骤。请注意,这是一个简化的指南,实际操作中可能会有一些特定的配置和调整。建议参考OpenSIPS官方文档或其他详细教程以获得更全面和准确的信息。
98 1
|
10月前
|
Java 测试技术 持续交付
百度搜索:蓝易云【NetMock简介:简化 Java,Android和Kotlin多平台中的HTTP请求测试?】
使用NetMock,您可以在单元测试、集成测试和端到端测试中轻松地模拟和验证HTTP请求和响应,而无需实际发送请求到外部服务。这样可以提高测试的可靠性和可控性,并加快测试执行的速度。无论是在开发过程中还是在持续集成环境中,NetMock都可以帮助您更轻松地进行HTTP请求测试,提高代码质量和稳定性。
57 1
|
11月前
|
缓存 Ubuntu Linux
百度搜索:蓝易云【Varnish开源HTTP反向代理缓存服务器、部署安装、测试】
通过按照上述步骤部署和配置Varnish,您可以将其作为反向代理缓存服务器来提高Web应用程序的性能和响应速度。记住,在实际部署中,您可能需要进一步调整Varnish的配置以满足您的具体需求。
88 2
|
10月前
|
算法 测试技术 C#
C++前缀和算法的应用:装包裹的最小浪费空间 原理源码测试用例
C++前缀和算法的应用:装包裹的最小浪费空间 原理源码测试用例
|
11月前
|
缓存 Linux 开发者
百度搜索:蓝易云【Varnish开源HTTP反向代理缓存服务器、部署安装、测试。】
通过以上步骤,你可以成功部署和安装Varnish,并对Web应用程序进行测试。请根据具体需求进行适当的配置和调整,以确保Varnish能够按预期工作并提升Web应用程序的性能。
64 0
下一篇
无影云桌面