Solr的空间索引

article/2025/9/24 17:54:36

一、Solr空间搜索的目的

(1)索引空间点数据和其他形状的数据

(2)通过圆形、正方形或者其他形状进行过滤搜索结果

(3)通过两个点之间的距离或者是两个多边形的形状进行排序或者评分

二、Solr空间搜索的域类型(FieldType)

1 、LatLonType与POINT

这两种类型都是数据点类型。LatLonType类型存储一个点在地图上的经纬度信息。POINT类型则是存储一个点在坐标上的x y位置。点类型数据的表达方式为lat(x),lon(y)。

2、SpatialRecursivePrefixTreeFieldType类型(缩写为RPT类型)

A、RPT除了能够在圆形和正方形外,还能在多边形和其他复杂的形状进行搜索

B、对点和多边形(线、多边形)进行索引创建。

C、多值的距离上的排序和评分boost

RPT域类型使用时,需要在模式文件中进行创建:

(1)下载JTS

JTS的下载地址:http://download.csdn.net/detail/u011518678/9613072

将JTS下载后,直接将jts的jar放入到solr web工程下的lib文件夹即可。

(2)配置RPT域类型,创建多边形域

<fieldType name="shape_rpt" class="solr.SpatialRecursivePrefixTreeFieldType" spatialContextFactory="com.spatial4j.core.context.jts.JtsSpatialContextFactory" distErrPct="0.025" maxDistErr="0.000009" units="degrees"></fieldType>
<field name="shape" type="shape_rpt" indexed="true" stored="true"></field>

field的定义不在过多描述,下面主要介绍RPT域类型相关的属性:

name:域类型的名称

class:该类型的数据有那个类进行处理,这里使用solr.SpatialRecursivePrefixTreeFieldType

spatialContextFactory:solr本身只支持点和矩形的形状处理,需要通过JTS工具来扩展多边形的功能。如果需要的话则需要扩展JTS jar中的JtsSapatialContextFactory对象。需要注意的是,solr5.x和solr6.x版本中的ContexntFacotory的package路径是不一样的,solr5:com.spatial4j.core.context.jts.JtsSpatialContextFactory,solr6:org.locationtech.spatial4j.context.jts.JtsSpati,所以用户在配置RPT域类型时要根据自己的solr版本配置不同的包路径。

maxDistErr:定义索引数据的最高界别,默认是地面1米(0.000009度)。

unutis:索引的数据所使用的单位,可以定义为degrees,kilometers和miles,默认值为kilometers

distErrPct:0-0.5之间的范围,定义了距离的经度,当值越消失,则精度越高。

(3)操作多边形数据

创建索引:

在创建索引时,需要注意多边形在索引数据中的表达方式:

点的表达方式为:POINT(0 0)

线的表达方式为:LINESTRING(0 0,1 0,0 0),线段由多个点组成,线段当含有多个点时,则是折线

多边形的表达方式:POLYGON(0 0,1 0,1 1,1 0,0 0 ),多边形的表达方式需要形成闭合图形,但是笔者没有证明POLYGON(0 0,1 0,1 1,1 0,0 0 )是否和POLYGON(0 0,1 1,0 1,1 0,0 0 )是否为同一个图形

关于空间类型的WKT表示方法,详细请看如下地址:https://en.wikipedia.org/wiki/Well-known_text

/*** @author wozipa* @throws IOException * @throws SolrServerException * @Date 2016-8-24 9:53* @see 所以多边形文件* POLYGON((0 0,0 1,1 1,1 0,0 0))* POIN(0 0)* LINESTRING(0 0,1 0,0 0)*/public void indexPolygon() throws SolrServerException, IOException{HttpSolrClient client=new HttpSolrClient("http://192.98.12.36:8983/solr/Test");SolrInputDocument document=new SolrInputDocument();document.addField("id", "test4");document.addField("shape", "POIN(0 0)");  //空间点表示方法:POIN(0 0)document.addField("shape", "LINESTRING(0 0,1 0,0 0)"); //空间线表示方法:LINESTRING(0 0,1 0,0 0),三个点,形成闭合图形document.addField("shape", "POLYGON((0 0,0 1,1 1,1 0,0 0))");  //空间多边形表示方法:POLYGON((0 0,0 1,1 1,1 0,0 0)),这里表示一个四边形//五个点,形成闭合图形client.add(document);client.commit();}

索引的结果为:

 {"id": "test4","shape": "LINESTRING(0 0,1 0,0 0)","_version_": 1543642553156370400}

创建查询:

多边形的查询则为两个多边形的关系,主要包括:相交(Intersects),包含(Contains),被包含(Within),相等(Equals)和相拒(Disjoint),查询的基本公式为:

"action+polygon":例如

"Intersects(POLYGON(0 0,1 0,1 1,0 1,0 0))"
空间索引数据查询的代码为:

/*** @author wozipa* @Date 2016-8-24 10:12* @see 对该多边形就行查询*/public void queryPolygon(){HttpSolrClient client=new HttpSolrClient("http://192.98.12.36:8983/solr/Test");SolrQuery query=new SolrQuery();query.setQuery("shape:\"Intersects(POLYGON((0 0,0 0.5,0.5 0.5,0.5 0,0 0)))\"");try {SolrResponse response=client.query(query);System.out.println(response.toString());} catch (SolrServerException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** @author wozipa* @Date 2016-8-24 11:08* @see 查询点*/public void queryPoint(){HttpSolrClient client=new HttpSolrClient("http://192.98.12.36:8983/solr/Test");SolrQuery query=new SolrQuery();query.setQuery("shape:\"Intersects(POINT(2.1 2.1))\"");try {SolrResponse response=client.query(query);System.out.println(response.toString());} catch (SolrServerException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

3、BBoxField

该类型是solr6版本中新增加的,是一个RPT类型的一个变种(我认为是简化版本),对举行表示式发生了改变:ENVELOPE(minX,maxX,maxY,minY)

ENVELOPE(-10, 20, 15, 10)

该类型的使用方式基本和POLYGON是相同的,主要为数据的定义:

<field name="bbox" type="bbox" />
<fieldType name="bbox" class="solr.BBoxField"geo="true" units="kilometers" numberType="_bbox_coord" storeSubFields="false"/>
<fieldType name="_bbox_coord" class="solr.TrieDoubleField" precisionStep="8" docValues="true" stored="false"/>

笔者没有对该类型进行研究,就是简单的提示一下solr用户,在solr6中新增加了一种矩形的表达方式。

三、过滤器

在空间搜索中,solr还提供了两种常用的filter,用来对结果集进行过滤筛选,过滤器拥有共同的参数类型,下面先介绍一下各个参数类型

1、参数

(1)d

两个多边形之间的线性距离,默认使用单位为千米(1km=0.009度),可以d进行单位定义

(2)pt

中心点位置,使用x,y进行点的表示。

(3)sfield

进行空间过滤的域名城,即该名称的空间数据将被用于数据过滤

(4)filter

过滤器名城,主要有两种类型,geofilter和bbox

通过这四个参数可以确定一个范围,该范围外的数据将被过滤掉。

2、过滤器类型

(1)geofilt

该类型将生成一个以pt为中点,以d为半径,形成一个圆形,该圆形中的数据符合过滤器的条件,不会被过滤掉。

使用例子为:fq={!geofilt sfield=store}&pt=45.15,-93.85&d=5,可以将所有的条件数据写入到大括号内:fq={!geofilt sfield=storept=4515,-93.85 d=5}

(2)bbox

该过滤器,会先画一个域geofilt相同的圆,然后形成一个与圆外切的正方形,该正方形中的数据通过过滤器,起范围表示为下图中的蓝色方框:

使用方式为:fq={!bbox sfield=store}&pt=45.15,-93.85&d=5,其用法如上:


四、总结

该问主要讲解了solr对多边形(点、线、多边形)数据的索引与搜索,同时还提供了空间搜索中相关的过滤器,希望大家共同学习,如果有什么不正确的地方,还望大家指出。


http://chatgpt.dhexx.cn/article/D2Hr22uW.shtml

相关文章

Soler

特点&#xff1a;首队香港孖生兄弟乐队&#xff0c;Julio和Dino是意大利与缅甸的混血儿。现场演出极煽情、极具爆发力。 风格&#xff1a;Soul,Acoustic,Pop Rock. 所有作品由组合自己创作。 专辑&#xff1a;《双声道》中文专辑 语言&#xff1a;广东话、国语、英语、意大利…

Solr空间搜索

空间搜索原理 空间搜索&#xff0c;又名Spatial Search&#xff0c;基于空间搜索技术&#xff0c;可以做到&#xff1a; 1&#xff09;对Point&#xff08;经纬度&#xff09;和其他的几何图形建索引 2&#xff09;根据距离排序 3&#xff09;根据矩形&#xff0c;圆形或者…

FAQ详解“Meltdown和Spectre”问题,接踵而来的“Skyfall和Solace”是否仅是骗局?

在Google公司安全团队Project Zero披露Intel处理器Meltdown(熔毁) 和Spectre(幽灵)漏洞后&#xff0c;该漏洞在2018年初震动了计算机世界。现在据说还有两个漏洞:Skyfall和Solace(他们的命名来源于詹姆斯邦德电影的灵感)。据消息来源称&#xff0c;这些漏洞也是物理芯片的问题&…

如何用Jmeter发送消息到Solace JNDI - 自定义配置

如何用Jmeter发送消息到Solace JNDI - 自定义配置 1. 引包2. 配置Solace JNDI3. 配置JMS Publisher 上一篇文章 如何用Jmeter发送消息到Solace JNDI 默认是发到 Default 的 VPN 且对用户名密码没有要求&#xff0c;假如想要发到非 default 的VPN或者是有验证要求的该怎么发呢&…

sola

Solr调研总结 开发类型 全文检索相关开发 Solr版本 4.2 文件内容 本文介绍solr的功能使用及相关注意事项;主要包括以下内容:环境搭建及调试;两个核心配置文件介绍;维护索引;查询索引,和在查询中可以应用的高亮显示、拼写检查、搜索建议、分组统计、拼音检索等功能的使用方…

Docker拉取Solace pubsub+镜像timeout的问题

资料 Solace PubSub 官网 Solace docker-compose.yml 模板下载 遇到的问题 拉取Solace pubsub镜像一直timeout 我的镜像源地址用的是阿里云的&#xff0c;同事也没有遇到过同样的问题。 我切换了各种国内的镜像源地址&#xff0c;都是timeout。最终又切换回阿里云的镜像源地…

如何用Jmeter发送消息到Solace JNDI

如何用Jmeter发送消息到Solace JNDI 缘由1. 引包2. 配置Solace JNDI3. 配置JMS Publisher4. 测试 缘由 最近有个需求&#xff0c;要对Solace的queue发大量的消息&#xff0c;然后就想到用Jmeter&#xff0c;但是国内国外基本都搜不到这部分的内容&#xff0c;于是在这Mark一下…

基于硬件的消息队列中间件 Solace 简介之二

小短篇介绍关于Solace https://blog.csdn.net/aqudgv83/article/details/79495489 . 前面简单介绍了Solace来自于哪家公司, 主要能做哪些事情. 本篇主要进一步介绍Solace作为消息传递的中间件如何工作的. 传统意义上来讲, 每当我们谈到消息中间件时, 首先想到的是基于Message…

JMS,ActiveMQ,Solace和RxJava记录

目录 JMS ActiveMQ 用Java代码实现收发消息 1. 使用JMS方式发送接收消息 ​编辑 2. 在SpringBoot中使用ActiveMQ Solace RxJava 除了本人另外一篇博客的 Kafka 记录&#xff08;https://blog.csdn.net/Beth_Chan/article/details/111189133&#xff09;外&#xff0c;其…

“去中心化”和“分布式”的区别

区块链对于很多人来说&#xff0c;是一个概念性的、未来的事物&#xff0c;经常可以听到区块链有着“分布式、去中心化、可信任、匿名性、信息不可逆”等特点&#xff0c;这些特点看起来相互关联&#xff0c;又有所差异。而以太坊创始人V神近日就在推特上表示&#xff0c;尝试用…

为什么说去中心化很重要

去中心化是与中心化相对的一个概念&#xff0c;简单的来说中心化的意思&#xff0c;是中心决定节点。节点必须依赖中心&#xff0c;节点离开了中心就无法生存。去中心化恰恰相反&#xff0c;在一个分布有众多节点的系统中&#xff0c;每个节点都具有高度自治的特征&#xff0c;…

去中心化金融(DeFi)的发展历史

随着Web3.0的兴起&#xff0c;去中心化金融&#xff08;Decentralized Finance&#xff0c;DeFi&#xff09;正逐渐成为金融领域的热门话题。DeFi旨在通过区块链技术和智能合约&#xff0c;实现无需信任的金融交易和服务&#xff0c;摆脱传统金融中心化的限制。然而&#xff0c…

去中心化及其局限性

去中心化及其局限性 这张表总结了一部分新的 P2P 网络中的去中心化工具。区块链就是其中的一个&#xff01; 本次演讲我将提出三个问题&#xff1a;&#xff08;1&#xff09;去中心化是什么&#xff1f;我们真的知道答案吗&#xff1f;&#xff08;2&#xff09;我们真的想要去…

去中心化究竟是什么意思?

链接&#xff1a; 去中心化究竟是什么意思&#xff1f;怎样能真正实现去中心化&#xff1f; - 知乎https://zhuanlan.zhihu.com/p/39854232 感谢分享&#xff0c;仅供参考。

区块链去中心化和传统去中心化的区别

去中心化在我们生活中其实并不是一个新概念&#xff0c;也许你没有注意&#xff0c;但是我们生活中早已充斥着去中心化的产物。现实中的微博啊&#xff0c;社交媒体啊这些其实都是去中心化的产物。 在了解去中心化之前&#xff0c;首先我们得知道&#xff0c;什么是中心化&…

一文讲明白互联网如何去中心化

本文不是巧立名目&#xff0c;虚设概念&#xff0c;而是在汉语中找了最恰当的一个词来定义互联网的“去中心化”&#xff0c;因为现实的单调&#xff0c;在“去中心化”议题里浸淫久了会发现&#xff0c;如果目标一致&#xff0c;一切表达都会是趋同的&#xff0c;比如说有一天…

关于去中心化技术实现的意义

谈起去中心化&#xff0c;我们首先得知晓何谓中心化&#xff1f;所谓中心化就是一切以中央为转移。古代的皇权社会就是典型的中心化组织&#xff0c;天下以皇帝为权力中心&#xff0c;一切经济、文化、政治等天下大事都以皇帝为转移&#xff0c;才算合法合规&#xff0c;不然就…

去中心化模型

文章目录 前言 一、去中心化是什么&#xff1f; 二、比特币如何实现去中心化 三、去中心化优点及意义 总结 前言 比特币引用了一个去中心化的模型&#xff0c;这个模型有何意义&#xff1f; 一、去中心化是什么&#xff1f; 在说“货币”时&#xff0c;我们讨论的是数字世界…

去中心化和非去中心化的区别?

什么是中心化&#xff1f;什么是非中心&#xff1f; 中心化的话如下图&#xff1a; 中心化服务所有的请求都围绕中心节点&#xff0c;然后再进行&#xff0c;一但中心节点出现故障那就都整个服务不可用。可以说导致整体崩溃。 注&#xff1a;现在的nacos、zk、等注中心&#xf…

去中心化结构的相关理解

去中心化结构 前言一、C/S架构二、去中心化架构总结 前言 去中心化结构可以与C/S(Client/Server)架构&#xff0c;客户机与服务器这种衣服武器为中心的架构进行对比学习。 一、C/S架构 C/S架构如下图所示&#xff1a; 将整个应用托辊到云端或者租用的VPS主机上。 用户通过客…