空間搜尋

Solr 支援位置資料,用於空間/地理空間搜尋。

使用空間搜尋,您可以

  • 為點或其他形狀建立索引

  • 依據邊界框或圓形或其他形狀篩選搜尋結果

  • 依據點之間的距離或矩形之間的相對面積來排序或加強評分

  • 產生 2D 格線的分面計數數字,用於熱圖產生或點繪圖。

空間搜尋有四種主要欄位類型可用

  • LatLonPointSpatialField(預設已啟用 docValues

  • PointType

  • SpatialRecursivePrefixTreeFieldType(簡稱 RPT),包括衍生類型 RptWithGeometrySpatialField

  • BBoxField

LatLonPointSpatialField 是用於經緯度點資料最常見使用案例的理想欄位類型。RPT 為更進階/自訂的使用案例和選項(例如多邊形和熱圖)提供更多功能。

RptWithGeometrySpatialField 用於索引和搜尋非點資料,雖然它也可以處理點。它無法進行排序/加強。

BBoxField 用於索引邊界框、依框查詢、指定搜尋述詞(相交、在內、包含、不相交、等於)以及相關性排序/加強(例如重疊比例或僅僅是面積)。

本指南中未提及的一些深奧細節,可在 Solr Wiki 的空間搜尋章節中找到。

LatLonPointSpatialField

以下是 LatLonPointSpatialField (LLPSF) 在結構描述中通常應如何組態

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

LLPSF 支援切換 indexedstoreddocValuesmultiValued。當啟用「indexed」(預設值)時,LLPSF 在內部會使用 2 維的 Lucene「點」(BDK 樹)索引。當啟用「docValues」(預設值)時,經度和緯度對會以位元交錯成 64 位元,並放入 Lucene DocValues 中。docValues 資料的準確度約為一公分。

索引點

為了索引大地測量點(經度和緯度),請以「lat,lon」順序(逗號分隔)提供。

為了索引非大地測量點,這取決於情況。如果使用 RPT,請使用 x y(一個空格)。但是,對於 PointType,請使用 x,y(一個逗號)。

如果您偏好使用標準的業界格式,Solr 支援 WKTGeoJSON。然而,對於如此簡單的資料來說,它們比原始座標要龐大得多。(PointType 不支援)

索引 GeoJSON 和 WKT

使用 bin/solr post 工具

$ bin/solr post -t "application/json" -url "https://127.0.0.1:8983/solr/mycollection/update?format=geojson" /path/to/geojson.file

您的請求中要傳入的關鍵參數是

format

選填

預設值:true

要傳入的檔案格式。可接受的值:WKTgeojson

使用查詢解析器進行搜尋

Solr 有兩個用於地理空間搜尋的「查詢解析器」:geofiltbbox。它們接受以下參數

d

必填

預設值:無

徑向距離,通常以公里為單位。RPT & BBoxField 可以透過設定 distanceUnits 來設定其他單位。

pt

必填

預設值:無

中心點,如果使用緯度和經度,格式為 lat,lon。否則,PointType 使用 "x,y",RPT 欄位類型使用 "x y"。

sfield

必填

預設值:無

一個已建立索引的空間欄位。

score

選填

預設值:none

如果查詢用於評分環境中(例如,作為 q 中的主要查詢),此 local param 會決定產生的分數。進階選項;PointType 不支援。

有效的值為

  • none:固定的分數 1.0

  • kilometers:欄位值與指定的中心點之間的距離(以公里為單位)。

  • miles:欄位值與指定的中心點之間的距離(以英里為單位)。

  • degrees:欄位值與指定的中心點之間的距離(以度為單位)。

  • distance:欄位值與指定的中心點之間的距離(以針對此欄位設定的 distanceUnits 為單位)。

  • recipDistance:1 / 距離。

    請勿將此用於索引的非點形狀(例如,多邊形)。結果將會錯誤。對於 RPT,僅建議用於多值點資料,因為實作的擴展性不太好,而對於單值欄位,您應該改用一個單獨的非 RPT 欄位來專門進行距離排序。

    當與 BBoxField 一起使用時,支援其他選項

  • overlapRatio:索引的形狀與查詢形狀之間的相對重疊比例。

  • area:根據 haversine 計算的重疊形狀的面積,以針對此欄位設定的 distanceUnits 表示。

  • area2D:根據笛卡爾座標計算的重疊形狀的面積,以針對此欄位設定的 distanceUnits 表示。

filter

選填

預設值:true

如果您只希望查詢進行評分(使用上述 score 本機參數),而不是進行篩選,請將此本機參數設定為 false。進階選項;PointType 不支援。

geofilt

geofilt 篩選器允許您根據與給定點的地理空間距離(又稱「大圓距離」)來檢索結果。另一種看待它的方式是,它會建立一個圓形形狀篩選器。例如,若要尋找在給定緯度/經度點五公里內的所有文件,您可以輸入

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

此篩選器會傳回初始點周圍給定半徑的圓內的所有結果

5KM radius

bbox

bbox 篩選器與 geofilt 非常相似,只是它使用計算出的圓的邊界框。請參閱下圖中的藍色框。它接受與 geofilt 相同的參數。

以下是一個範例查詢

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

矩形形狀的計算速度更快,因此有時會在允許傳回半徑以外的點時用作 geofilt 的替代方案。但是,如果理想的目標是圓形,但您希望它執行得更快,則請考慮改用 RPT 欄位,並嘗試較大的 distErrPct 值,例如 0.1(半徑的 10%)。這將會傳回半徑以外的結果,但它會在形狀周圍以某種程度的均勻方式執行。

Bounding box

當邊界框包含一個極點時,邊界框最終會變成一個「邊界碗」(一個球面蓋),如果它接觸北極,則包含圓形最低緯度以北的所有值(如果它接觸南極,則包含最高緯度以南的所有值)。

依任意矩形篩選

有時,空間搜尋要求會需要尋找矩形區域中的所有內容,例如使用者正在檢視的地圖所涵蓋的區域。在這種情況下,geofilt 和 bbox 無法滿足需求。這有點像技巧,但您可以針對此使用 Solr 的範圍查詢語法,方法是將左下角作為範圍的開頭,右上角作為範圍的結尾。

以下是一個範例

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

對於 RPT 和 BBoxField,如果您不使用緯度/經度座標 (geo="false"),則必須引用這些點,因為它們之間有空格,例如 "x y"

最佳化:是否快取

最常見的做法是將空間查詢放入「fq」參數 - 一個篩選查詢。預設情況下,Solr 會將查詢快取在篩選器快取中。

如果您知道篩選查詢(無論是否為空間查詢)相當獨特,不太可能命中快取,請指定 cache="false" 作為本機參數,如以下範例所示。唯一可以從這項技術中獲益的空間類型是具有 docValues 的類型,例如 LatLonPointSpatialField 或 BBoxField。

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

距離排序或增強(函數查詢)

有四個距離函數查詢

  • geodist,請參閱下文,通常是最適合的;

  • dist,用於計算多維向量之間的 p-norm 距離;

  • hsin,用於計算球體上兩點之間的距離;

  • sqedist,用於計算兩點之間的平方歐幾里得距離。

如需更多關於這些函數查詢的資訊,請參閱 函數查詢 的章節。

geodist

geodist 是一個距離函數,它接受三個選填參數:(sfield,latitude,longitude)。您可以使用 geodist 函數按距離排序結果或為傳回結果評分。

例如,若要按遞增距離排序結果,請使用如下的請求

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

若要將距離作為文件分數傳回,請使用如下的請求

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

更多空間搜尋範例

以下是一些關於您可以在 Solr 中使用空間搜尋執行哪些操作的更多實用範例。

作為子查詢使用以擴展搜尋結果

在這裡,我們將查詢佛羅里達州傑克遜維爾的結果,或是在 45.15,-93.85(明尼蘇達州水牛城附近)50 公里內的結果

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

依距離分面

若要依距離分面,您可以使用 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()

還有其他方法可以執行此操作,例如在每個 facet.query 中使用 {!geofilt}

增強最近的結果

使用 DisMax 查詢解析器擴充 DisMax (eDisMax) 查詢解析器,您可以將空間搜尋與增強函數結合以增強最近的結果

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

將距離作為欄位傳回

若要將距離作為虛擬欄位傳回,您可以在欄位清單中使用 geodist() 函數。

&fl=distance:geodist()

RPT

RPT 指的是 SpatialRecursivePrefixTreeFieldType(又稱 RPT)和擴充版本:RptWithGeometrySpatialField(又稱具有幾何圖形的 RPT)。RPT 提供了數個優於 LatLonPointSpatialField 的功能改進

  • 非大地測量 - geo=false 一般 x & y(不是緯度和經度) — 如果需要

  • 透過多邊形和其他複雜形狀進行查詢,除了圓形和矩形之外

  • 能夠為非點形狀(例如,多邊形)以及點建立索引 – 請參閱 RptWithGeometrySpatialField

  • 熱圖網格分面

RPT 與 LatLonPointSpatialField共用各種功能。以下列出了一些

  • 緯度/經度索引點資料;可能是多值的

  • 透過 geofiltbbox 篩選器和範圍查詢語法進行快速篩選(支援日期變更線交叉)

  • Well-Known-Text (WKT) 形狀語法(指定多邊形和其他複雜形狀時需要)和 GeoJSON。除了建立索引和搜尋之外,這也適用於 wt=geojson (GeoJSON Solr 回應寫入器) 和 [geo f=myfield] (geo Solr 文件轉換器)。

  • 透過 geodist 排序/增強 — 雖然不建議

儘管 RPT 支援距離排序/增強,但它在這方面的效率極低,未來可能會移除此功能。幸好,您可以同時使用 LatLonPointSpatialField 和 RPT。使用 LLPSF 進行距離排序/增強;它只需要為此提供 docValues;可以停用 index 屬性,因為不會使用它。

RPT 的結構描述設定

若要使用 RPT,必須在集合的結構描述中註冊和設定欄位類型。此欄位類型有很多選項。

name

必填

預設值:無

欄位類型的名稱。

class

必填

預設值:無

應該為 solr.SpatialRecursivePrefixTreeFieldType。但請注意,Lucene 空間模組包含一些 RPT 以外的其他所謂的「空間策略」,特別是 TermQueryPT*、BBox、PointVector* 和 SerializedDV。Solr 需要對應的欄位類型才能使用這些策略。帶星號的那些有。

spatialContextFactory

選填

預設值:無

這是 Java 類別名稱,指向管理形狀定義和剖析支援的內部擴充點。針對已知的實作有兩個內建別名:Geo3DJTS。預設空白值不支援多邊形。

geo

選填

預設值:true

如果 true,將使用緯度和經度座標,且數學模型通常會是一個球體。如果 false,座標將會是 2D 平面上的通用 X 和 Y 座標,使用歐幾里得/笛卡爾幾何。

format

選填

預設值:WKT

定義要使用的形狀語法/格式。預設為 WKT,但 GeoJSON 是另一種流行的格式。Spatial4j 管理此功能,並支援其他格式。如果給定的形狀可解析為「lat,lon」或「x y」,則始終支援該格式。

distanceUnits

選填

預設值:無

此設定用於指定此欄位中使用的距離測量的單位。可以是 degreeskilometersmiles。它適用於幾乎所有涉及該欄位的距離測量:maxDistErrdistErrdgeodist 以及當 score 為 distanceareaarea2d 時的 score。但是,它不會影響嵌入在 WKT 字串中的距離(例如,BUFFER(POINT(200 10),0.2)),這些距離仍以度為單位。

如果 geotruedistanceUnits 預設為 kilometers;如果 geofalse,則預設為 degrees

distanceUnits 取代了 units 屬性;後者現在已棄用,並且與此屬性互斥。

distErrPct

選填

預設值:請參閱說明

定義非點形狀(索引和查詢)的預設精度,介於 0.0(完全精確)到 0.5 之間的分數。此數字越接近零,形狀就越精確。但是,更精確的索引形狀會使用更多磁碟空間,並且索引時間更長。

較大的 distErrPct 值會使查詢更快,但精度較低。在查詢時,可以在查詢語法中覆蓋此值,例如設為 0.0,以避免近似搜尋形狀。RPT 欄位的預設值為 0.025

對於 RPTWithGeometrySpatialField(請參閱下文),序列化的幾何圖形始終具有完全的準確性,因此這並不是控制準確性,而是控制索引大小的權衡。該欄位的 distErrPct 預設值為 0.15
maxDistErr

選填

預設值:請參閱說明

定義索引資料所需的最高細節層級。如果留空,預設值為一公尺,略小於 0.000009 度。此設定會在內部用於計算適當的 maxLevels(請參閱下文)。

worldBounds

選填

預設值:無

ENVELOPE(minX, maxX, maxY, minY) 的格式定義 x 和 y 的有效數值範圍。如果 geo="true",則假設為標準的緯度-經度世界邊界。如果 geo=false,則應定義您的邊界。

distCalculator

選填

預設值:請參閱說明

定義距離計算演算法。如果 geo=true,則預設為 haversine。如果 geo=false,則預設為 cartesian。其他可能的值為 lawOfCosinesvincentySpherecartesian^2

prefixTree

選填

預設值:請參閱說明

定義空間網格實作。由於 PrefixTree(例如 RecursivePrefixTree)將世界地圖映射為網格,因此每個網格單元會在下一級分解為另一組網格單元。

如果 geo=true,則預設的前綴樹為 geohash,否則為 quad。Geohash 在每一級有 32 個子節點,quad 有 4 個。Geohash 只能用於 geo=true,因為它嚴格來說是地理空間的。

第三種選擇是 packedQuad,它通常比 quad 更有效率,前提是有許多層級,可能超過 20 個。

maxLevels

選填

預設值:無

設定索引資料的最大網格深度。相反地,通常更直觀的做法是透過指定 maxDistErr 來計算適當的 maxLevels。

還有其他設定: normWrapLongitudedatelineRulevalidationRuleautoIndexallowMultiOverlapprecisionModel。如需更多資訊,請參閱下方有關上述參考的 spatialContextFactory 實作的說明,尤其是指向基於 JTS 的實作的連結。

標準形狀

RPT 欄位類型支援一組標準形狀:點、圓形(又稱緩衝點)、包絡(又稱矩形或邊界框)、線串、多邊形以及這些形狀的「多個」變體。包絡和線串是歐幾里得/笛卡爾(平面 2D)形狀。Solr 底層是實作這些形狀的 Spatial4j 程式庫。為了支援其他形狀,您可以在欄位類型上設定 spatialContextFactory 屬性,以參考其他選項。有兩個選項可用:JTS 和 Geo3D。

JTS 和多邊形 (平面)

JTS 拓樸套件是一個流行的計算幾何程式庫,具有歐幾里得/笛卡爾(平面 2D)模型。它支援各種形狀,包括多邊形、緩衝形狀和一些無效多邊形修復的回退。在 Spatial4j(隨附於 Solr)的協助下,多邊形支援日期變更線(反子午線)跨越。您必須下載它(一個 JAR 檔案)並將其放入 Solr 內部的一個特殊位置:SOLR_INSTALL/server/solr-webapp/webapp/WEB-INF/lib/。您可以從此處輕鬆下載它:https://mvnrepository.com/artifact/org.locationtech.jts/jts-core/1.17.1如果將其放置在其他更典型的 Solr lib 目錄中,則無法運作。

在欄位類型上將 spatialContextFactory 屬性設定為 JTS

啟用後,還有其他可用的設定屬性;請參閱 org.locationtech.spatial4j.context.jts.JtsSpatialContextFactory 的 Javadocs,並記住也要查看超類別的選項。您最有可能啟用的一個選項是 autoIndex(即使用 JTS 的 PreparedGeometry),因為它已被證明對於非平凡多邊形來說是一個主要的效能提升。

<fieldType name="location_rpt"   class="solr.SpatialRecursivePrefixTreeFieldType"
               spatialContextFactory="JTS"
               autoIndex="true"
               validationRule="repairBuffer0"
               distErrPct="0.025"
               maxDistErr="0.001"
               distanceUnits="kilometers" />

定義欄位類型後,定義使用該類型的欄位。

以下是欄位「geo」的多邊形查詢範例,該欄位可以是 solr.SpatialRecursivePrefixTreeFieldType 或 RptWithGeometrySpatialField

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

搜尋述詞後面的括號內是形狀定義。該形狀的格式由欄位類型上的 format 屬性控制,預設為 WKT。如果您偏好 GeoJSON,則可以改為指定該格式。

除了本參考指南和 Spatila4j 的文件之外,Solr Wiki 上還有一些詳細資訊,網址為 https://cwiki.apache.org/confluence/display/solr/SolrAdaptersForLuceneSpatial4

Geo3D 和多邊形(在橢球體上)

Geo3D 是 Lucene spatial-3d 模組的俗稱,包含在 Solr 中。它是一個計算幾何程式庫,在球體或 WGS84 橢球體上實作各種形狀(包括多邊形)。Geo3D 特別適合用於幾何圖形涵蓋全球大範圍距離或靠近兩極的空間應用程式。Geo3D 之所以如此命名,是因為其內部實作使用地心座標 (X,Y,Z),而不是用於不支援的 3 維幾何圖形。儘管有這些內部細節,您仍然可以像在 Solr 中一樣正常供應緯度和經度。

在欄位類型上將 spatialContextFactory 屬性設定為 Geo3D

<fieldType name="geom"
  class="solr.SpatialRecursivePrefixTreeFieldType"
  spatialContextFactory="Geo3D"
  prefixTree="s2"
  planetModel="WGS84"/><!-- or "sphere" -->

定義欄位類型後,定義使用該類型的欄位。

prefixTree="s2" 設定是選用的,而且只能與 Geo3D 一起使用。它是專為 Geo3D 而開發的,比其他網格更有效率。

使用 Geo3D 時,多邊形點的順序很重要!您必須遵循所謂的「右手定則」:外部環必須是逆時針順序,而內部孔必須是順時針順序。如果順序錯誤,則會反轉解釋,因此多邊形會被解釋為包含地球的大部分區域。

RptWithGeometrySpatialField

RptWithGeometrySpatialField 欄位類型是 SpatialRecursivePrefixTreeFieldType 的衍生類型,它也會將原始幾何圖形內部儲存在 Lucene DocValues 中,後者會用於實現精確搜尋。它也可以用於索引點欄位。Intersects 述詞(預設值)速度特別快,因為可以將許多搜尋結果作為精確的點擊傳回,而無需進行幾何檢查。此欄位類型的設定方式與 RPT 相同,只是預設的 distErrPct 為 0.15(高於 0.025),因為網格正方形僅用於效能,而不是從根本上表示形狀。

可以在 solrconfig.xml 中定義選用的記憶體快取,當資料往往具有許多頂點的形狀時,應執行此操作。假設您將欄位命名為「geom」,您可以透過新增以下內容在 solrconfig.xml 中設定選用的快取,請注意快取名稱的後綴

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

使用此欄位類型時,您可能希望將欄位標記為已儲存,因為它與 DocValues 資料重複,並且由於格式化(無論是 WKT 或 GeoJSON)而肯定更大。若要從 DocValues 擷取搜尋結果中的空間資料,請使用 [geo 轉換器]。

熱圖分面

RPT 欄位支援為每個網格單元中具有空間資料的文件產生 2D 分面計數網格。對於高細節網格,這可以用於繪製點,對於較低細節,則可以用於熱圖產生。網格單元會在索引時根據 RPT 的設定來判斷。在分面計數時,會遍歷感興趣區域中的索引單元,並遞增對應於每個單元的計數器網格。Solr 可以以直接的 2D 整數陣列形式傳回資料,或以 PNG 形式傳回資料,後者可以更好地壓縮較大的資料集,但必須進行解碼。

可以從 Solr 的標準分面功能和 JSON Facet API 存取熱圖功能。我們現在將繼續進行標準分面。作為分面的一部分,它支援 key 本機參數以及排除標記的篩選查詢,就像其他類型的分面一樣。這允許在具有不同篩選器的相同欄位上傳回多個熱圖。

facet

選填

預設值:false

設定為 true 以啟用標準分面。

facet.heatmap

必填

預設值:無

RPT 類型的欄位名稱。

facet.heatmap.geom

選填

預設值:無

使用矩形範圍語法或 WKT 指定要計算熱圖的區域。預設值為世界。例如:["-180 -90" TO "180 90"]

facet.heatmap.gridLevel

選填

預設值:請參閱說明

一個特定的網格層級,它會決定每個網格單元的大小。預設值是透過 distErrPct(或 distErr)計算得出。

facet.heatmap.distErrPct

選填

預設值:0.15

用於計算 gridLevel 的 geom 大小的一部分。它的計算方式與 RPT 的類似命名參數相同。

facet.heatmap.distErr

選填

預設值:無

用於間接選擇網格層級的單元格錯誤距離。它的計算方式與 RPT 的類似命名參數相同。

facet.heatmap.format

選填

預設值:ints2D

格式,可以是 ints2Dpng

您將使用不同的 distErrPct 值(可能介於 0.10 - 0.20 之間)和各種輸入幾何圖形進行實驗,直到預設大小符合您的需求。它的計算方式的具體細節並不重要。對於用於點繪圖(每個像素大約一個單元格)的高細節網格,請將 distErr 設定為要顯示地圖的幾個像素的十進制度數。此外,您可能不希望使用基於 geohash 的網格,因為網格層級之間的單元格方向會在正方形和矩形之間來回切換。Quad 具有一致性並且具有更多層級,但代價是索引更大。

以下是一些 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,這點很有趣,因為它通常是從其他參數計算得來的。如果正在開發的介面允許明確的解析度增加/減少功能,那麼後續的請求可以明確指定 gridLevel。

minXmaxXminYmaxY 報告計數所在的區域。這是目標網格級別上輸入 geom 的最小包圍邊界矩形。這可能會跨越日期變更線。columnsrows 值表示輸出矩形將被均勻劃分的列數和行數。注意:不要均勻劃分螢幕上投影的地圖矩形來繪製這些矩形/點,因為單元格數據的坐標空間是十進制度(如果 geo=true)或如果 geo=false 則給定的任何單位。這可以安排成與螢幕上的地圖相同,但並不一定如此。

counts_ints2D 鍵具有一個二維整數數組。初始外部層次是按行順序(由上而下),然後內部數組是列(由左而右)。如果任何數組都是全零,則為了效率起見,會返回 null 值。如果沒有匹配的空間數據,則整個值為 null。

如果 format=png,則輸出鍵為 counts_png。它是一個 4 位元 PNG 的 base-64 編碼字串。PNG 在邏輯上與 ints2D 格式包含完全相同的數據。請注意,alpha 通道位元已翻轉,以方便查看 PNG 進行診斷,因為否則計數必須超過 2^24 才會變得不透明。因此,大於此值的計數將變得不透明。

BBoxField

BBoxField 欄位類型為每個文檔欄位索引一個矩形(邊界框),並支援透過邊界框進行搜尋。它支援大多數空間搜尋謂詞,並且具有基於搜尋矩形和索引矩形之間的重疊或面積的增強相關性模式。它對於相關性模式特別有用。若要在架構中設定它,請使用如下組態:

<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 實際上是基於另一個由 numberType 引用的欄位類型的 4 個實例。它還使用一個布林值來標記日期變更線交叉。假設您要使用相關性功能,則需要 docValues(預設情況下啟用)。某些屬性與 RPT 欄位(如 geo、units、worldBounds 和 spatialContextFactory)相同,因為它們共享一些相同的空間基礎結構。

若要索引一個框,請將欄位值新增到一個 bbox 欄位,該欄位是 WKT/CQL ENVELOPE 語法中的字串。範例:ENVELOPE(-10, 20, 15, 10),其順序為 minX、maxX、maxY、minY。參數順序不直觀,但這是規範所要求的。或者,您可以使用 WKT(或如果設定 format="GeoJSON" 則使用 GeoJSON)提供一個矩形多邊形。

若要搜尋,您可以使用 {!bbox} 查詢剖析器或範圍語法,例如 [10,-10 TO 15,20],或使用括號包圍並帶有前導搜尋謂詞的 ENVELOPE 語法。後者是選擇 Intersects 以外的謂詞的唯一方法。例如

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

現在,若要依據其中一種相關性模式排序結果,請這樣使用:

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

score 本機參數可以是 overlapRatioareaarea2D 之一。area 使用球體表面(假設 geo=true)數學來計算文件面積的分數,而 area2D 則使用簡單的寬度 * 高度。overlapRatio 計算一個 [0-1] 範圍的分數,該分數基於相對於文件面積和查詢面積存在的重疊量。BBoxOverlapRatioValueSource 的 javadocs 中提供了有關公式的更多資訊。還有一個額外的參數 queryTargetProportion,允許您將公式的查詢端加權到公式的索引(目標)端。您也可以使用 &debug=results 來查看有用的分數計算資訊。