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个顶点的多边形复杂查询,毫秒级响应是没有问题的

参考

目录
相关文章
|
1天前
|
编解码 安全 Linux
网络空间安全之一个WH的超前沿全栈技术深入学习之路(10-2):保姆级别教会你如何搭建白帽黑客渗透测试系统环境Kali——Liinux-Debian:就怕你学成黑客啦!)作者——LJS
保姆级别教会你如何搭建白帽黑客渗透测试系统环境Kali以及常见的报错及对应解决方案、常用Kali功能简便化以及详解如何具体实现
|
1天前
|
人工智能 安全 Linux
网络空间安全之一个WH的超前沿全栈技术深入学习之路(4-2):渗透测试行业术语扫盲完结:就怕你学成黑客啦!)作者——LJS
网络空间安全之一个WH的超前沿全栈技术深入学习之路(4-2):渗透测试行业术语扫盲完结:就怕你学成黑客啦!)作者——LJS
|
1天前
|
安全 大数据 Linux
网络空间安全之一个WH的超前沿全栈技术深入学习之路(3-2):渗透测试行业术语扫盲)作者——LJS
网络空间安全之一个WH的超前沿全栈技术深入学习之路(3-2):渗透测试行业术语扫盲)作者——LJS
|
1天前
|
SQL 安全 网络协议
网络空间安全之一个WH的超前沿全栈技术深入学习之路(1-2):渗透测试行业术语扫盲)作者——LJS
网络空间安全之一个WH的超前沿全栈技术深入学习之路(1-2):渗透测试行业术语扫盲)作者——LJS
|
3月前
|
安全 应用服务中间件 网络安全
Python 渗透测试:漏洞的批量搜索与利用.(GlassFish 任意文件读取)
Python 渗透测试:漏洞的批量搜索与利用.(GlassFish 任意文件读取)
47 11
|
3月前
|
Web App开发 敏捷开发 测试技术
自动化测试框架的设计与实现探索操作系统的心脏:内核与用户空间的交互
【8月更文挑战第26天】本文旨在探讨自动化测试框架的设计原则、核心组件和实现方法。通过分析自动化测试的优势,我们深入讨论了框架设计的关键考虑因素,包括模块化、可重用性、可扩展性和易维护性。文章还介绍了如何利用流行的测试工具和编程语言来实现一个高效的自动化测试框架,并通过实例展示了框架的应用。
|
4月前
|
算法
基于Dijkstra算法的最优行驶路线搜索matlab仿真,以实际城市复杂路线为例进行测试
使用MATLAB2022a实现的Dijkstra算法在城市地图上搜索最优行驶路线的仿真。用户通过鼠标点击设定起点和终点,算法规划路径并显示长度。测试显示,尽管在某些复杂情况下计算路径可能与实际有偏差,但多数场景下Dijkstra算法能找到接近最短路径。核心代码包括图的显示、用户交互及Dijkstra算法实现。算法基于图论,不断更新未访问节点的最短路径。测试结果证明其在简单路线及多数复杂城市路况下表现良好,但在交通拥堵等特殊情况下需结合其他数据提升准确性。
|
6月前
|
消息中间件 测试技术
百度搜索:蓝易云【使用JMeter安装RabbitMQ测试插件的步骤】
以上是安装RabbitMQ测试插件的基本步骤。根据您的具体需求和JMeter版本,可能会有一些细微的差异,但总体流程应该是相似的。
127 1
|
6月前
|
Ubuntu 数据库 数据安全/隐私保护
百度搜索:蓝易云【ubuntu中编译安装opensips并测试】
以上是在Ubuntu中编译安装OpenSIPS并进行测试的基本步骤。请注意,这是一个简化的指南,实际操作中可能会有一些特定的配置和调整。建议参考OpenSIPS官方文档或其他详细教程以获得更全面和准确的信息。
100 1
|
6月前
|
人工智能 开发工具 git
语义搜索测试
语义搜索测试
67 0