Solr空間搜索

2018-12-01 15:49 更新

Solr 支持用于空間/地理空間搜索的位置數(shù)據(jù)。

使用空間搜索,您可以:

  • 索引點(diǎn)或其他形狀
  • 按邊框或圓形或其他形狀過濾搜索結(jié)果
  • 根據(jù)點(diǎn)之間的距離或矩形之間的相對(duì)面積來排序或提高評(píng)分
  • 生成 heatmap 生成或點(diǎn)繪圖的 facet 計(jì)數(shù)的二維網(wǎng)格。

有以下四種可用于空間搜索的主要字段類型:

  • LatLonPointSpatialField
  • LatLonType (現(xiàn)已棄用)以及它的 non-geodetic twin PointType
  • SpatialRecursivePrefixTreeFieldType(簡稱 RPT),包括衍生的 RptWithGeometrySpatialField
  • BBoxField

LatLonPointSpatialField 是 lat-lon(經(jīng)緯度)點(diǎn)數(shù)據(jù)最常見的使用示例的理想字段類型。它取代了為了向后兼容而仍然存在的 LatLonType。對(duì)于更高級(jí)/自定義用例和多邊形和 heatmaps 等選項(xiàng),RPT 提供了更多的功能。

RptWithGeometrySpatialField 是用于索引和搜索非點(diǎn)數(shù)據(jù),盡管它也可以做點(diǎn)。它不能做 sort/boost。

BBoxField 用于索引邊界框、通過框進(jìn)行查詢、指定搜索謂詞(相交、內(nèi)部、包含、不相交、等于)以及相關(guān)性 sort/boost,類似 overlapRatio 或簡單的區(qū)域。

LatLonPointSpatialField

以下是 LatLonPointSpatialField(LLPSF)通常在架構(gòu)中配置的方式:

<fieldType name="location" class="solr.LatLonPointSpatialField" docValues="true"/>

LLPSF 支持來回切換 indexed、stored、docValues 和 multiValued。LLPSF 在啟用 “indexed”(默認(rèn))時(shí)內(nèi)部使用二維 Lucene “Points”(BDK 樹)索引。當(dāng)啟用 “docValues” 時(shí),經(jīng)緯度對(duì)被交織成 64 位,并放入 Lucene DocValues 中。docValues 數(shù)據(jù)的精確度約為一厘米。

索引點(diǎn)

為了索引大地測量點(diǎn)(緯度和經(jīng)度),通過“l(fā)at,lon”順序(逗號(hào)分隔)提供。

對(duì)于索引 non-geodetic 點(diǎn),這取決于:如果為 RPT 使用 x y(中間有空格);但是,對(duì)于 PointType,請(qǐng)使用 x,y(使用逗號(hào)分隔)。

如果您想使用標(biāo)準(zhǔn)的行業(yè)格式,Solr 支持 WKT 和 GeoJSON。然而它比這些簡單數(shù)據(jù)的原始坐標(biāo)大得多。(不贊成使用 LatLonType 或 PointType)

使用查詢解析器進(jìn)行搜索

有兩個(gè)用于地理空間搜索的空間 Solr “查詢解析器”:geofilt和bbox。他們采取以下參數(shù):

d 參數(shù)

徑向距離,通常以公里為單位。RPT 和 BBoxField 可以通過設(shè)置distanceUnits來設(shè)置其他單位。

pt 參數(shù)

如果緯度和經(jīng)度為中心,則使用格式“l(fā)at,lon”。否則,使用 PointType 的 “x,y” 或 RPT 字段類型的“x y”。

sfield 參數(shù)

空間索引字段。

score 參數(shù)

(高級(jí)選項(xiàng);LatLonType(不建議使用)或 PointType 不支持)如果查詢用于記分環(huán)境(例如作為主查詢q),則此本地參數(shù)確定將生成什么分?jǐn)?shù)。有效值是:

  • none:固定分?jǐn)?shù)為1.0。(默認(rèn))

  • kilometers:字段值與指定中心點(diǎn)之間的距離(以公里為單位)

  • miles:字段值與指定中心點(diǎn)之間的距離(以英里為單位)

  • degrees:字段值與指定中心點(diǎn)之間的距離(以度為單位)

  • distance:字段值與為此字段配置的distanceUnits中的指定中心點(diǎn)之間的距離

  • recipDistance:1 / 距離

    注意:不要將其用于索引的非點(diǎn)形狀 (例如多邊形)。結(jié)果將是錯(cuò)誤的。而對(duì)于RPT,只建議多值點(diǎn)數(shù)據(jù),只推薦使用它,因?yàn)閷?shí)現(xiàn)不能很好地進(jìn)行擴(kuò)展, 而且對(duì)于單參數(shù)字段,您應(yīng)該改用單獨(dú)的非 RPT 字段來進(jìn)行距離排序。

    使用BBoxField時(shí),支持下列的選項(xiàng):

  • overlapRatio:索引形狀和查詢形狀之間的相對(duì)重疊。

  • area: haversine 基于為該字段配置的distanceUnits表示的重疊形狀的區(qū)域

  • area2D:基于為該字段配置的distanceUnits表示的重疊形狀的笛卡爾坐標(biāo)區(qū)域

filter 參數(shù)

(高級(jí)選項(xiàng);LatLonType(不建議使用)或 PointType 不支持)。如果您只希望查詢得分(使用上述score本地參數(shù)),而不是過濾,則將此本地參數(shù)設(shè)置為 false。

geofilt 過濾器

geofilt 過濾器可以根據(jù)地理空間距離(又名“大圈距離”)從給定的點(diǎn)來檢索結(jié)果。另一種看待它的方式是創(chuàng)建一個(gè)圓形的形狀濾鏡。例如,要查找給定經(jīng)緯度五公里內(nèi)的所有文件,可以輸入:&q=:&fq={!geofilt sfield=store}&pt=45.15,-93.85&d=5。此過濾器在初始點(diǎn)周圍的給定半徑的圓內(nèi)返回所有結(jié)果:

Solr空間搜索

bbox 過濾器

bbox 過濾器與 geofilt 非常相似,只是它使用要計(jì)算的圓的邊界框。請(qǐng)參閱下圖中的藍(lán)色框。它采用與 geofilt 相同的參數(shù)。

以下是一個(gè)示例查詢:

&q=:&fq={!bbox sfield=store}&pt=45.15,-93.85&d=5

矩形形狀的計(jì)算速度更快,所以它有時(shí)被用作替代 geofilt 當(dāng)它可以接受的返回點(diǎn)以外的半徑。但是,如果理想的目標(biāo)是一個(gè)圓圈,但是您希望它運(yùn)行得更快,那么請(qǐng)考慮使用 RPT 字段并嘗試一個(gè)大的 distErrPct 值,比如0.1(10%半徑)。這將返回半徑之外的結(jié)果,但它將在形狀周圍稍微均勻地進(jìn)行。

201712011135106837

當(dāng)邊界框包含一個(gè)極點(diǎn)時(shí),邊界框最終成為一個(gè) "邊界碗" (一個(gè)球形的帽子),它包含了在圓的最低緯度以北的所有值,如果它觸及北極 (或者如果它觸及南極的最高緯度的南部)。

通過任意矩形過濾

有時(shí),空間搜索要求需要在矩形區(qū)域中查找所有內(nèi)容,例如用戶正在查看的地圖所覆蓋的區(qū)域。對(duì)于這種情況,geofilt 和 bbox 不會(huì)將其切割。這是一個(gè)竅門,但是您可以使用 Solr 的范圍查詢語法,方法是將左下角作為范圍的開始,右上角作為范圍的結(jié)束。

下面是一個(gè)例子:

&q=:&fq=store:[45,-94 TO 46,-93]

LatLonType(不建議使用)不支持跨越國際日期變更線的矩形。對(duì)于 RPT 和 BBoxField,如果是非地理空間坐標(biāo)(geo="false"),那么必須引用由于空間的點(diǎn),例如"x y"。

優(yōu)化:是否緩存

將空間查詢放入 “fq” 參數(shù)中是最常見的過濾器查詢。默認(rèn)情況下,Solr 會(huì)將查詢緩存在過濾器緩存中。

如果您知道過濾器查詢(無論是否是空間)是相當(dāng)唯一的,并且不太可能獲得緩存命中,則指定 cache="false" 為本地參數(shù),如以下示例所示。LatLonPointSpatialField 和 LatLonType(不建議使用)是唯一受益于此技術(shù)的空間類型。在該字段上啟用 docValues(如果它尚未啟用)。LatLonType(不建議使用)還需要一個(gè) cost="100"(或多個(gè))本地參數(shù)。

&q=…?mykeywords…?&fq=…?someotherfilters…?&fq={!geofilt cache=false}&sfield=store&pt=45.15,-93.85&d=5

LLPSF 不支持 Solr 的 “PostFilter”。

距離 sort 或 boost(函數(shù)查詢)

有四個(gè)距離函數(shù)查詢:

  • geodist:見下文,通常是最合適的
  • dist:計(jì)算多維向量之間的 p-norm 距離
  • hsin:計(jì)算球體上兩點(diǎn)之間的距離
  • sqedist:計(jì)算兩點(diǎn)之間的平方歐幾里得距離

有關(guān)這些功能的查詢的詳細(xì)信息,請(qǐng)參閱函數(shù)查詢部分。

geodist 距離函數(shù)

geodist 是一個(gè)距離函數(shù),需要三個(gè)可選參數(shù):(sfield、latitude、longitude)。您可以使用 geodist 函數(shù)按距離或分?jǐn)?shù)返回結(jié)果對(duì)結(jié)果進(jìn)行排序。

例如,要按距離遞增對(duì)結(jié)果進(jìn)行排序,請(qǐng)輸入:

…?&q=:&fq={!geofilt}&sfield=store&pt=45.15,-93.85&d=50&sort=geodist() asc

要將距離作為文檔分?jǐn)?shù)返回,請(qǐng)輸入:

…?&q={!func}geodist()&sfield=store&pt=45.15,-93.85&sort=score+asc。

Solr空間搜索示例

以下是更多關(guān)于 Solr 空間搜索的有用的例子。

用作子查詢來展開搜索結(jié)果

我們將在 Jacksonville、Florida 查詢結(jié)果,或在距離 45.15,-93.85(Buffalo, Minnesota 附近)50公里內(nèi)查詢結(jié)果:

&q=:&fq=(state:"FL" AND city:"Jacksonville") OR {!geofilt}&sfield=store&pt=45.15,-93.85&d=50&sort=geodist()+asc

通過距離分面(facet)

通過距離分面,您可以使用 Frange 查詢解析器:

&q=:&sfield=store&pt=45.15,-93.85&facet.query={!frange l=0 u=5}geodist()&facet.query={!frange l=5.001 u=3000}geodist()

還有其他方法可以做到這一點(diǎn),比如在每個(gè) facet.query 中使用:\ {!geofilt}。

提高最近的結(jié)果

使用 DisMax 或 Extended DisMax,您可以將空間搜索與提升功能結(jié)合起來,以提高最近的結(jié)果:

&q.alt=:&fq={!geofilt}&sfield=store&pt=45.15,-93.85&d=50&bf=recip(geodist(),2,200,20)&sort=score desc

RPT

RPT 是指 SpatialRecursivePrefixTreeFieldType(簡稱 RPT)和 擴(kuò)展版本 RptWithGeometrySpatialField(又名 RPT 幾何)。RPT 提供了比 LatLonPointSpatialField 更多的功能改進(jìn):

  • 非大地測量(Non-geodetic):geo = false,一般x和y(不是經(jīng)度和緯度)
  • 除了圓形和矩形之外,還可以通過多邊形和其他復(fù)雜形狀進(jìn)行查詢
  • 能夠索引非點(diǎn)形狀(如多邊形)以及點(diǎn) - 請(qǐng)參閱 RptWithGeometrySpatialField
  • heatmap 網(wǎng)格分面

RPT 與 LatLonPointSpatialField 分享共同的各種功能。有些在這里列出:

  • 緯度/經(jīng)度索引點(diǎn)數(shù)據(jù);可能是多值的
  • 使用 geofilt 過濾器、bbox 過濾器和范圍查詢快速過濾(支持日期線交叉)
  • 通過 geodist 來 sort/boost
  • 已知文本(WKT)形狀語法(用于指定多邊形和其他復(fù)雜形狀)和 GeoJSON。除了索引和搜索之外,它還可以與 wt=geojson (GeoJSON Solr 響應(yīng)寫入器)和 [geo f=myfield](geo Solr文檔轉(zhuǎn)換器)配合使用。

RPT 的架構(gòu)配置

要使用 RPT,必須在 schema.xml 中注冊(cè)和配置字段類型。這個(gè)字段類型有很多選項(xiàng)。

name

字段類型的名稱。

class

這應(yīng)該是solr.SpatialRecursivePrefixTreeFieldType。但請(qǐng)注意,Lucene 空間模塊除 RPT 之外還包含一些其他所謂的“空間策略”,特別是 TermQueryPT *,BBox,PointVector * 和 SerializedDV。Solr 需要一個(gè)字段類型才能并行使用它們。

spatialContextFactory

這是一個(gè) Java 類名稱,指向支持形狀定義和解析的內(nèi)部擴(kuò)展點(diǎn)。如果您需要多邊形支持,請(qǐng)將其設(shè)置為JTS- org.locationtech.spatial4j.context.jts.JtsSpatialContextFactory的別名;否則可以省略。請(qǐng)參閱下面有關(guān) JTS 的重要信息。(注意:在 Solr 6之前,“org.locationtech.spatial4j”部分是“com.spatial4j.core”,并且以前沒有方便的 JTS 別名)

geo

如果為true,則使用默認(rèn)的緯度和經(jīng)度坐標(biāo),數(shù)學(xué)模型通常是一個(gè)球體。如果為false,則在 2D 平面上使用歐氏/笛卡爾(Euclidean/Cartesian)幾何的坐標(biāo)將是一般的 X 和 Y。

format

定義要使用的形狀語法/格式。默認(rèn)為WKT但是GeoJSON是另一種流行的格式。Spatial4j 管理此功能并支持其他格式。如果一個(gè)給定的形狀可以解析為“l(fā)at,lon”或“x y”,那么它總是被支持的。

distanceUnits

這用于指定在整個(gè)使用此字段時(shí)使用的距離測量單位??梢允?code>degrees、kilometers或者miles。它適用于幾乎所有的距離測量涉及的領(lǐng)域:maxDistErrdistErr,dgeodistscore當(dāng)?shù)梅譃?code>distance,areaarea2d。但是,它并不影響嵌入 WKT 字符串中的距離,(例如BUFFER(POINT(200 10),0.2))仍然是度數(shù)。

distanceUnits默認(rèn)為kilometers如果geo是 TRUE;或degrees如果geofalse。

distanceUnits替換units屬性;現(xiàn)在已經(jīng)被棄用,并且與這個(gè)屬性互斥。

distErrPct

更大的distErrPct值將會(huì)使查詢更快但不太準(zhǔn)確。在查詢時(shí),這可以在查詢語法中被覆蓋,例如0.0,以便不近似于搜索形狀。RPT 字段的默認(rèn)值是0.025。

對(duì)于 RPTWithGeometrySpatialField (見下文),在序列化的幾何中總是有完全的精度,所以這并不能控制精度,因?yàn)樗刂屏怂饕龖?yīng)該有多大的權(quán)衡。distErrPct 默認(rèn)為該字段的0.15。

maxDistErr

定義索引數(shù)據(jù)所需的最高詳細(xì)級(jí)別。如果留空,默認(rèn)值是一米 - 僅略小于0.000009度。這個(gè)設(shè)置在內(nèi)部用來計(jì)算一個(gè)合適的 maxLevels(見下文)。

worldBounds

定義 x 和 y 的有效數(shù)值范圍,格式為ENVELOPE(minX, maxX, maxY, minY)。如果geo="true",則假定標(biāo)準(zhǔn)的經(jīng)緯度世界的邊界。如果geo=false,您應(yīng)該定義您的邊界。

distCalculator

定義距離計(jì)算算法。如果geo=true,則“haversine” 是默認(rèn)的。如果geo=false,則“cartesian”將是默認(rèn)的。其他可能的值是“l(fā)awOfCosines”,“vincentySphere”和“cartesian^2”。

prefixTree

定義空間網(wǎng)格實(shí)現(xiàn)。由于 PrefixTree(如 RecursivePrefixTree)將世界映射為一個(gè)網(wǎng)格,因此每個(gè)網(wǎng)格單元將被分解到另一個(gè)位于下一級(jí)的網(wǎng)格單元。

如果geo=true那么默認(rèn)的前綴樹是geohash,否則是quad。Geohash 每個(gè)級(jí)別有 32 個(gè)子級(jí),quad 有4個(gè)。Geohash 只能用于geo=true嚴(yán)格的地理空間。

第三個(gè)選擇是packedQuad,一般來說quad,如果有很多層次(大概20個(gè)或更多層次),效率就會(huì)更高。

maxLevels

設(shè)置索引數(shù)據(jù)的最大網(wǎng)格深度。相反,通過指定maxDistErr來計(jì)算適當(dāng)?shù)?maxLevels 通常更直觀。

還有其他的一些選項(xiàng):normWrapLongitude、datelineRule、validationRule、autoIndex、allowMultiOverlap、precisionModel。有關(guān)更多信息,請(qǐng)參閱下面有關(guān) spatialContextFactory 實(shí)現(xiàn)的說明,尤其是指向基于 JTS 的鏈接。

JTS 和多邊形

如上所示,spatialContextFactory 必須設(shè)置為多邊形支持的 JTS,包括多邊形。

所有其他形狀 (包括偶數(shù)行字符串) 都不受 JTS 支持。JTS 代表 JTS Topology Suite,由于其 LGPL 許可證,不包含 Solr。您必須下載(JAR 文件),并將它放到 Solr 特殊的地理位置內(nèi)部:SOLR_INSTALL/server/solr-webapp/webapp/WEB-INF/lib/。您可以隨時(shí)在此下載:https: //repo1.maven.org/maven2/com/vividsolutions/jts-core/。如果放置在其他更典型的 Solr 庫目錄中,則不起作用。

激活時(shí),還有其他配置屬性可用;對(duì)于 Javadoc,請(qǐng)參閱 org.locationtech.spatial4j.context.jts.JtsSpatialContextFactory,并記住也要查看超類的選項(xiàng)。一個(gè)選項(xiàng),尤其是您應(yīng)該最有可能啟用 autoIndex(即使用 JTS 的 PreparedGeometry),因?yàn)樗驯蛔C明是非平凡多邊形的主要性能提升。

<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" />

一旦字段類型被定義,定義一個(gè)使用它的字段。

下面是一個(gè)可以是 solr 的字段 "geo" 的多邊形查詢示例,SpatialRecursivePrefixTreeFieldType 或 RptWithGeometrySpatialField:

&q=*:*&fq={!field f=geo}Intersects(POLYGON((-10 30, -40 40, -10 -20, 40 20, 0 0, -10 30)))

在搜索謂詞后面的括號(hào)內(nèi)是形狀定義。該形狀的格式由字段類型的“format”屬性管理,默認(rèn)為 WKT。如果您喜歡 GeoJSON,則可以指定。

在這個(gè)參考指南和 Spatila4j's 文檔之外, 還有一些詳細(xì)信息保留在 http://wiki.apache.org/solr/SolrAdaptersForLuceneSpatial4 的 Solr Wiki 上。

RptWithGeometrySpatialField 字段類型

RptWithGeometrySpatialField 字段類型是由 SpatialRecursivePrefixTreeFieldType 衍生的,它還將原始幾何存儲(chǔ)在 Lucene DocValues 內(nèi)部,它用來實(shí)現(xiàn)精確的搜索。它也可以用于索引點(diǎn)字段。Intersects 謂詞(默認(rèn)值)特別快,因?yàn)樵S多搜索結(jié)果可以作為精確的命中返回而不需要幾何檢查。除了默認(rèn) distErrPct 值為 0.15(高于0.025)外,此字段類型的配置與 RPT類似,因?yàn)榫W(wǎng)格方塊純粹是為了性能,而不是從根本上表示形狀。

可以在 solrconfig.xml 定義一個(gè)可選的內(nèi)存中緩存,當(dāng)數(shù)據(jù)傾向于具有多個(gè)頂點(diǎn)的形狀時(shí),應(yīng)進(jìn)行此操作。假設(shè)您將字段命名為“geom”,則可以通過添加以下內(nèi)容在 solrconfig.xml 中配置可選緩存 - 注意緩存名稱的后綴:

<cache name="perSegSpatialFieldCache_geom"
           class="solr.LRUCache"
           size="256"
           initialSize="0"
           autowarmCount="100%"
           regenerator="solr.NoOpRegenerator"/>

使用此字段類型時(shí),您可能不希望將該字段標(biāo)記為已存儲(chǔ),因?yàn)樗c DocValues 數(shù)據(jù)是多余的,并且由于格式化(無論是 WKT 還是 GeoJSON),它肯定更大。要從 DocValue 檢索搜索結(jié)果中的空間數(shù)據(jù),請(qǐng)使用[geo]轉(zhuǎn)換 -? 轉(zhuǎn)換結(jié)果文檔。

Heatmap Faceting

RPT 字段支持為每個(gè)網(wǎng)格單元中具有空間數(shù)據(jù)的文檔生成一個(gè)二維的分面計(jì)數(shù)網(wǎng)格。對(duì)于高細(xì)節(jié)網(wǎng)格,這可以用來繪制點(diǎn),而對(duì)于較小的細(xì)節(jié),它可以用于生成 heatmap。網(wǎng)格單元根據(jù) RPT的配置在索引時(shí)間確定。在分面計(jì)數(shù)時(shí),遍歷感興趣區(qū)域中的索引單元格,并且對(duì)應(yīng)于每個(gè)單元格的計(jì)數(shù)器網(wǎng)格遞增。Solr 可以在整數(shù)的直接 2D 數(shù)組中或在 PNG 中返回?cái)?shù)據(jù),也可以在較大數(shù)據(jù)集壓縮的 PNG 中返回?cái)?shù)據(jù),但必須解碼。

Solr 的分面功能可以訪問 heatmap 功能。作為分面的一部分,它支持 key 本地參數(shù)以及不包括標(biāo)記的過濾器查詢,就像其他類型的分面一樣。這允許在具有不同過濾器的同一字段上返回多個(gè) heatmap。

facet

設(shè)置true為啟用刻面。

facet.heatmap

RPT 類型的字段名稱。

facet.heatmap.geom

計(jì)算 heatmap 的區(qū)域,使用矩形范圍語法或 WKT 指定。它默認(rèn)為世界。例如:["-180 -90" TO "180 90"]。

facet.heatmap.gridLevel

一個(gè)特定的網(wǎng)格層次,決定每個(gè)網(wǎng)格單元的大小。默認(rèn)為通過distErrPct(或distErr)計(jì)算。

facet.heatmap.distErrPct

用于計(jì)算 gridLevel 的幾何大小的一小部分。默認(rèn)為 0.15。它的計(jì)算方式與 RPT 中一個(gè)類似命名的參數(shù)相同。

facet.heatmap.distErr

用于間接選取網(wǎng)格級(jí)別的單元格錯(cuò)誤距離。它的計(jì)算方式與 RPT 中一個(gè)類似命名的參數(shù)相同。

facet.heatmap.format

格式,可以是ints2D(默認(rèn))或png。

Tip:您將試驗(yàn)不同的 distErrPct 值 (可能是 0.10-0.20) 與各種輸入幾何,直到默認(rèn)大小為您要找的值。它的計(jì)算方法的具體細(xì)節(jié)并不重要。對(duì)于在點(diǎn)繪制中使用的 high-detail 網(wǎng)格 (每像素松散一個(gè)單元格),將 distErr 設(shè)置為幾個(gè)像素的十進(jìn)制數(shù),或者顯示地圖的數(shù)量。此外,您可能不希望使用 geohash-based 網(wǎng)格,因?yàn)榫W(wǎng)格級(jí)別之間的單元格方向 flip-flops 介于正方形和矩形之間。

以下是 JSON 中的一些示例輸出(為了簡潔,插入了“...”):

{gridLevel=6,columns=64,rows=64,minX=-180.0,maxX=180.0,minY=-90.0,maxY=90.0,
counts_ints2D=[[0, 0, 2, 1, ....],[1, 1, 3, 2, ...],...]}

輸出顯示的 gridLevel 很有趣,因?yàn)樗ǔJ菑钠渌麉?shù)計(jì)算的。如果正在開發(fā)的接口允許明確的分辨率增加/減少特性,則后續(xù)請(qǐng)求可以明確指定 gridLevel。

minX,maxX,minY,maxY 報(bào)告了這一地區(qū)的數(shù)量。這是 geom 在目標(biāo)網(wǎng)格級(jí)輸入的最小包圍矩形。這可能會(huì)包裝日期。columns 和 rows 值是輸出矩形要平均劃分的列和行數(shù)。注意:如果 geo = true,或者 geo = false,則單元格被賦值,因此單元格數(shù)據(jù)在十進(jìn)制度數(shù)的坐標(biāo)空間中時(shí),不要均勻劃分屏幕上投影的地圖矩形以繪制這些矩形/點(diǎn)。這可以被安排成與屏幕上的地圖相同,但不一定是這樣。

counts_ints2D 鍵有一個(gè)整數(shù)的二維數(shù)組。初始外部級(jí)別按行順序(從上到下),內(nèi)部數(shù)組是列(從左到右)。如果任何數(shù)組將全部為零,則返回 null,以提高效率。如果沒有匹配的空間數(shù)據(jù),則整個(gè)值為 null。

如果 format=png,那么輸出鍵是 counts_png。它是一個(gè)4字節(jié)的 PNG 的64位編碼的字符串。PNG 邏輯上保存與 ints2D 格式相同的數(shù)據(jù)。請(qǐng)注意,alpha 通道字節(jié)會(huì)翻轉(zhuǎn),以便于查看PNG 用于診斷目的,否則計(jì)數(shù)將不得不超過2 ^ 24,然后才會(huì)變?yōu)椴幌喾R虼?,大于這個(gè)值的計(jì)數(shù)將變得不透明。

BBoxField

BBoxField 對(duì)每個(gè)文檔字段的單個(gè)矩形(邊界框)進(jìn)行索引,并支持通過邊界框搜索。它支持大多數(shù)空間搜索謂詞,它基于搜索矩形和索引矩形之間的重疊或區(qū)域,增強(qiáng)了相關(guān)性模式。它特別適用于它的關(guān)聯(lián)模式。要在架構(gòu)中配置它,使用像這樣的配置:

<field name="bbox" type="bbox" />

<fieldType name="bbox" class="solr.BBoxField"
           geo="true" distanceUnits="kilometers" numberType="pdouble" />
<fieldType name="pdouble" class="solr.DoublePointField" docValues="true"/>

BBoxField 實(shí)際上是基于由 numberType 引用的另一個(gè)字段類型的4個(gè)實(shí)例。它也使用布爾值來標(biāo)記日期線十字。假設(shè)您想要使用相關(guān)性功能,則需要 docValues。一些屬性與 RPT 字段(如geo、units、worldBounds 和 spatialContextFactory)是相同的,因?yàn)樗鼈児蚕硪恍┫嗤目臻g基礎(chǔ)結(jié)構(gòu)。

如果要為某個(gè)框進(jìn)行索引,請(qǐng)將字段值添加到作為 WKT / CQL ENVELOPE 語法中的字符串的 bbox 字段中。例如:ENVELOPE(-10, 20, 15, 10),這是minX,maxX,maxY,minY的順序。參數(shù)排序是不直觀的,但這是規(guī)范要求的?;蛘撸梢栽?WKT 中提供一個(gè)矩形多邊形(如果您設(shè)置了 set format="GeoJSON",??則為 GeoJSON)。

如果要進(jìn)行搜索,可以使用{!bbox}查詢解析器或范圍語法:[10,-10 TO 15,20],或者使用帶引導(dǎo)搜索謂詞的圓括號(hào)中的 ENVELOPE 語法。后者是選擇 Intersects 以外的謂詞的唯一方法。例如:

&q={!field f=bbox}Contains(ENVELOPE(-10, 20, 15, 10))

現(xiàn)在,按相關(guān)性模式之一對(duì)結(jié)果進(jìn)行排序,如下所示:

&q={!field f=bbox score=overlapRatio}Intersects(ENVELOPE(-10, 20, 15, 10))

該 score 本地參數(shù)可以是一個(gè) overlapRatio,area 和 area2D。區(qū)域比分由文件區(qū)域使用 surface-of-a 球面(假定 geo=true)數(shù)學(xué),area2D 使用簡單的寬度*高度。overlapRatio 根據(jù)相對(duì)于文檔區(qū)域和查詢區(qū)域存在多少重疊來計(jì)算 [0-1] 距離分?jǐn)?shù)。javadocs 的 BBoxOverlapRatioValueSource 有更多的信息的公式。還有一個(gè)額外的參數(shù) queryTargetProportion 允許您將公式的查詢端加權(quán)到公式的索引(目標(biāo))端。您也可以使用 &debug=results 查看有用的分?jǐn)?shù)計(jì)算信息。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)