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

参考

目录
相关文章
|
6月前
|
存储 缓存 Linux
百度搜索:蓝易云【如何在Linux系统服务器中测试存储/磁盘I/O性能?】
这些工具可以帮助你测试磁盘的读取和写入性能,并提供各种性能指标和统计数据。请注意,在运行这些测试时,确保没有重要的数据存储在被测试的磁盘上,并谨慎操作以避免对系统和数据造成不必要的影响。
88 0
|
3月前
|
人工智能 开发工具 git
语义搜索测试
语义搜索测试
28 0
|
4月前
|
消息中间件 测试技术
百度搜索:蓝易云【使用JMeter安装RabbitMQ测试插件的步骤】
以上是安装RabbitMQ测试插件的基本步骤。根据您的具体需求和JMeter版本,可能会有一些细微的差异,但总体流程应该是相似的。
53 1
|
4月前
|
Ubuntu 数据库 数据安全/隐私保护
百度搜索:蓝易云【ubuntu中编译安装opensips并测试】
以上是在Ubuntu中编译安装OpenSIPS并进行测试的基本步骤。请注意,这是一个简化的指南,实际操作中可能会有一些特定的配置和调整。建议参考OpenSIPS官方文档或其他详细教程以获得更全面和准确的信息。
53 1
|
4月前
|
Java 测试技术 持续交付
百度搜索:蓝易云【NetMock简介:简化 Java,Android和Kotlin多平台中的HTTP请求测试?】
使用NetMock,您可以在单元测试、集成测试和端到端测试中轻松地模拟和验证HTTP请求和响应,而无需实际发送请求到外部服务。这样可以提高测试的可靠性和可控性,并加快测试执行的速度。无论是在开发过程中还是在持续集成环境中,NetMock都可以帮助您更轻松地进行HTTP请求测试,提高代码质量和稳定性。
41 1
|
5月前
|
缓存 Ubuntu Linux
百度搜索:蓝易云【Varnish开源HTTP反向代理缓存服务器、部署安装、测试】
通过按照上述步骤部署和配置Varnish,您可以将其作为反向代理缓存服务器来提高Web应用程序的性能和响应速度。记住,在实际部署中,您可能需要进一步调整Varnish的配置以满足您的具体需求。
45 2
|
5月前
|
缓存 Linux 开发者
百度搜索:蓝易云【Varnish开源HTTP反向代理缓存服务器、部署安装、测试。】
通过以上步骤,你可以成功部署和安装Varnish,并对Web应用程序进行测试。请根据具体需求进行适当的配置和调整,以确保Varnish能够按预期工作并提升Web应用程序的性能。
33 0
|
10月前
|
JSON 自然语言处理 数据可视化
Elasticsearch 搜索测试与集成Springboot3
它能够一定程度上解决,在一个普通数据库处理上亿条数据时的查询效率低下的同时无法优秀地排列好用户所需要的数据,一次性上亿条数据没有经过正确地排列,用户很难找到想要的数据。并且,用户输入的数据可能不太准确,它也能够进行模糊查询,这种模糊查询是依靠计算得来的,而不是简单地匹配数据。本系列博文将从零开始一步步实现将 ES 集成到 springboot3 中,并在一个社区项目中进行实际应用测试,本文为系列第一篇,后续,博文仍在整理,请持续关注博主,了解更多相关知识。
129 0
Elasticsearch 搜索测试与集成Springboot3
|
10月前
|
算法 Java
数学建模常用算法:变邻域搜索算法(VNS)求解tsp问题+att48算例测试【java实现--详细注释】
数学建模常用算法:变邻域搜索算法(VNS)求解tsp问题+att48算例测试【java实现--详细注释】
112 0
|
11月前
|
存储 缓存 索引
《Elastic(中国)基础开发宝典》——大规模测试新的 Elasticsearch 冷层可搜索快照
《Elastic(中国)基础开发宝典》——大规模测试新的 Elasticsearch 冷层可搜索快照
《Elastic(中国)基础开发宝典》——大规模测试新的 Elasticsearch 冷层可搜索快照