空間検索
Solr は、空間/地理空間検索で使用するための位置データをサポートしています。
空間検索を使用すると、次のことができます。
-
点またはその他の形状のインデックス作成
-
境界ボックス、円、またはその他の形状による検索結果のフィルター処理
-
点間の距離、または長方形間の相対面積によるソートまたはスコアリングのブースト
-
ヒートマップの生成または点プロット用のファセットカウント数の 2D グリッドの生成。
空間検索には、主に 4 つのフィールドタイプが利用可能です。
-
LatLonPointSpatialField -
PointType -
SpatialRecursivePrefixTreeFieldType(略して RPT)、および派生型であるRptWithGeometrySpatialField -
BBoxField
LatLonPointSpatialField は、緯度経度の点データに関する最も一般的なユースケースに最適なフィールドタイプです。RPT は、ポリゴンやヒートマップなどの高度な/カスタムのユースケースおよびオプションに対して、より多くの機能を提供します。
RptWithGeometrySpatialField は、点データだけでなく、点以外のデータのインデックス作成と検索に使用されます。ソート/ブーストを行うことはできません。
BBoxField は、境界ボックスのインデックス作成、ボックスによるクエリ、検索述語 (Intersects、Within、Contains、Disjoint、Equals) の指定、および overlapRatio や単純な面積のような関連性によるソート/ブーストに使用されます。
このガイドに記載されていない一部の専門的な詳細については、Solr Wiki の空間検索セクションをご覧ください。
LatLonPointSpatialField
以下は、スキーマで LatLonPointSpatialField (LLPSF) を通常構成する方法です。
<fieldType name="location" class="solr.LatLonPointSpatialField" docValues="true"/>
LLPSF は、indexed、stored、docValues、および multiValued の切り替えをサポートします。LLPSF は、"indexed" が有効になっている場合 (デフォルト)、内部的に 2 次元 Lucene "Points" (BDK ツリー) インデックスを使用します。"docValues" が有効になっている場合、緯度と経度のペアは 64 ビットにビットインターリーブされ、Lucene DocValues に格納されます。docValues データの精度は、約 1 センチメートルです。
点のインデックス作成
クエリパーサーを使用した検索
地理空間検索には、geofilt と bbox の 2 つの空間 Solr "クエリパーサー" があります。これらのパラメーターは次のとおりです。
d-
必須
デフォルト: なし
半径距離。通常はキロメートル単位。RPT および BBoxField では、
distanceUnits設定を介して他の単位を設定できます。 pt-
必須
デフォルト: なし
緯度と経度の場合は
lat,lon形式を使用する中心点。それ以外の場合は、PointType の場合は "x,y"、RPT フィールドタイプの場合は "x y"。 sfield-
必須
デフォルト: なし
インデックス付き空間フィールド。
score-
任意
デフォルト:
noneクエリがスコアリングのコンテキストで使用されている場合(例:
qのメインクエリとして)、このローカルパラメータは、生成されるスコアを決定します。高度なオプションです。PointTypeではサポートされていません。有効な値は次のとおりです。
-
none:1.0の固定スコア。 -
kilometers: フィールド値と指定された中心点との間の距離(キロメートル)。 -
miles: フィールド値と指定された中心点との間の距離(マイル)。 -
degrees: フィールド値と指定された中心点との間の距離(度)。 -
distance: フィールド値と、このフィールドに設定されたdistanceUnitsで指定された単位での中心点との間の距離。 -
recipDistance: 1 / 距離。インデックスされた非ポイントシェイプ(例:ポリゴン)にはこれを使用しないでください。結果は誤ったものになります。また、RPTでは、実装がうまくスケールしないため、マルチバリューポイントデータにのみ推奨されます。シングルバリューフィールドでは、代わりに距離ソート専用の別の非RPTフィールドを使用する必要があります。
BBoxFieldと一緒に使用する場合、追加のオプションがサポートされます。 -
overlapRatio: インデックスされたシェイプとクエリシェイプの相対的な重複率。 -
area: このフィールドに設定されたdistanceUnitsで表される、重複するシェイプのハバーサインに基づく面積。 -
area2D: このフィールドに設定されたdistanceUnitsで表される、重複するシェイプのデカルト座標に基づく面積。
-
filter-
任意
デフォルト:
trueクエリをフィルタリングではなくスコアリング(上記の
scoreローカルパラメータを使用)のみに使用する場合は、このローカルパラメータをfalseに設定します。高度なオプションです。PointTypeではサポートされていません。
geofilt
geofilt フィルタを使用すると、指定された点からの地理空間距離(別名「大円距離」)に基づいて結果を取得できます。別の見方をすると、円形のシェイプフィルタを作成します。たとえば、指定された緯度/経度ポイントから5キロメートル以内のすべてのドキュメントを検索するには、次のように入力します。
&q=*:*&fq={!geofilt sfield=store}&pt=45.15,-93.85&d=5
このフィルタは、初期点の周りの指定された半径の円内にあるすべての結果を返します。
bbox
bbox フィルタは、計算された円の境界ボックスを使用することを除いて、geofilt と非常によく似ています。下の図の青いボックスを参照してください。geofilt と同じパラメータを取ります。
以下はクエリのサンプルです。
&q=*:*&fq={!bbox sfield=store}&pt=45.15,-93.85&d=5
長方形の形状は計算が速いため、半径外の点を返すことが許容される場合は、geofilt の代替として使用されることがあります。ただし、理想的な目標が円でありながら、高速に実行したい場合は、代わりにRPTフィールドを使用し、distErrPct 値を 0.1 (半径の10%)などの大きな値にすることを検討してください。これにより、半径外の結果が返されますが、シェイプの周りで均一に結果が返されます。
|
境界ボックスに極が含まれる場合、境界ボックスは、北極に触れる場合は円の最も低い緯度より北のすべての値(または南極に触れる場合は最も高い緯度より南のすべての値)を含む「境界ボウル」(球面キャップ)になります。 |
任意の長方形によるフィルタリング
空間検索の要件として、ユーザーが表示しているマップでカバーされる領域など、長方形の領域内のすべてを検索する必要がある場合があります。この場合、geofilt と bbox は役に立ちません。これは一種のトリックですが、範囲の開始として左下隅を指定し、範囲の終了として右上隅を指定することで、Solr の範囲クエリ構文を使用できます。
以下に例を示します。
&q=*:*&fq=store:[45,-94 TO 46,-93]
RPT および BBoxField の場合、緯度/経度座標を使用しない場合(geo="false")、スペースがあるため、ポイントを引用符で囲む必要があります。例:"x y"。
最適化:キャッシュするかどうか
空間クエリを "fq" パラメータ(フィルタクエリ)に入れるのが最も一般的です。デフォルトでは、Solr はフィルタキャッシュにクエリをキャッシュします。
フィルタクエリ(空間的かどうかに関わらず)がかなりユニークであり、キャッシュヒットが得られる可能性が低い場合は、次の例に示すように、cache="false" をローカルパラメータとして指定します。このテクニックからメリットを得られる空間タイプは、LatLonPointSpatialField や BBoxField などの docValues を持つタイプのみです。
&q=...mykeywords...&fq=...someotherfilters...&fq={!geofilt cache=false}&sfield=store&pt=45.15,-93.85&d=5
距離ソートまたはブースト(関数クエリ)
4つの距離関数クエリがあります。
これらの関数クエリの詳細については、関数クエリのセクションを参照してください。
geodist
geodist は、3つのオプションパラメータ (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 クエリパーサーまたはExtended DisMax (eDisMax) クエリパーサーを使用すると、空間検索とブースト関数を組み合わせて、最近傍の結果をブーストできます。
&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とも呼ばれる)または拡張版であるRptWithGeometrySpatialField(ジオメトリ付きRPTとも呼ばれる)を指します。RPTは、LatLonPointSpatialFieldよりもいくつかの機能的な改善を提供します。
-
非測地 - geo=false 一般的なx & y (緯度と経度ではありません) - 必要に応じて
-
円と長方形に加えて、ポリゴンやその他の複雑な形状によるクエリ
-
ポイントだけでなく、非ポイントシェイプ(例:ポリゴン)をインデックス化する機能 - RptWithGeometrySpatialField を参照
-
ヒートマップグリッドファセット
RPTは、LatLonPointSpatialField と共通のさまざまな機能を共有しています。以下にいくつかを示します。
-
インデックス付き緯度/経度ポイントデータ。マルチバリューの可能性があります。
-
geofilt、bboxフィルタ、および範囲クエリ構文を使用した高速フィルタリング(日付変更線越えがサポートされています) -
Well-Known-Text(WKT)シェイプ構文(ポリゴンやその他の複雑な形状を指定するために必要)、およびGeoJSONも同様です。インデックス作成と検索に加えて、これは
wt=geojson(GeoJSON Solrレスポンスライター)および[geo f=myfield](geo Solrドキュメントトランスフォーマー)で機能します。 -
geodistによるソート/ブースト - ただし、推奨されません
|
RPTは距離ソート/ブーストをサポートしていますが、これを行う効率が非常に悪いため、将来的には削除される可能性があります。幸いなことに、RPTだけでなくLatLonPointSpatialFieldも使用できます。距離ソート/ブーストにはLLPSFを使用します。これにはdocValuesのみが必要です。使用されないため、index属性は無効にできます。 |
RPTのスキーマ構成
RPTを使用するには、フィールドタイプをコレクションのスキーマに登録して構成する必要があります。このフィールドタイプには多くのオプションがあります。
name-
必須
デフォルト: なし
フィールドタイプの名前。
class-
必須
デフォルト: なし
これは
solr.SpatialRecursivePrefixTreeFieldTypeである必要があります。ただし、Lucene空間モジュールには、RPT以外に、TermQueryPT*、BBox、PointVector*、SerializedDVなど、他のいわゆる「空間戦略」が含まれていることに注意してください。Solrでは、これらの戦略を使用するために対応するフィールドタイプが必要です。アスタリスク付きのものはそれを持っています。 spatialContextFactory-
任意
デフォルト: なし
これは、シェイプ定義と解析のサポートを管理する内部拡張ポイントへのJavaクラス名です。既知の実装には、
Geo3DおよびJTSの2つの組み込みエイリアスがあります。デフォルトの空白値はポリゴンをサポートしていません。 geo-
任意
デフォルト:
truetrueの場合、緯度と経度の座標が使用され、数学モデルは一般に球になります。falseの場合、座標はユークリッド/デカルト幾何学を使用した2D平面上の一般的なX&Yになります。 format-
任意
デフォルト:
WKT使用するシェイプ構文/形式を定義します。デフォルトは
WKTですが、GeoJSONも別の一般的な形式です。Spatial4j はこの機能を管理し、その他の形式をサポートします。指定されたシェイプが「lat,lon」または「x y」として解析可能な場合、それは常にサポートされます。 distanceUnits-
任意
デフォルト: なし
これは、このフィールドの使用全体で使用される距離測定の単位を指定するために使用されます。これは、
degrees、kilometers、またはmilesにできます。これは、フィールドに関連するほぼすべての距離測定に適用されます。maxDistErr、distErr、d、geodist、およびスコアがdistance、area、またはarea2dの場合のscoreです。ただし、WKT文字列に埋め込まれた距離には影響しません(例:BUFFER(POINT(200 10),0.2))。これらはまだ度単位です。distanceUnitsのデフォルトは、geoがtrueの場合はkilometers、geoがfalseの場合はdegreesのいずれかです。distanceUnitsはunits属性を置き換えます。units属性は非推奨になり、この属性と相互に排他的になりました。 distErrPct-
任意
デフォルト: 説明を参照
非ポイントシェイプ(インデックスとクエリの両方)のデフォルト精度を、
0.0(完全に正確)から0.5の間の分数として定義します。この数値がゼロに近いほど、シェイプはより正確になります。ただし、より正確にインデックス化されたシェイプは、より多くのディスク領域を使用し、インデックス作成に時間がかかります。distErrPctの値を大きくすると、クエリは高速になりますが、精度は低下します。クエリ時に、検索形状を近似しないように0.0などとしてクエリ構文でこれをオーバーライドできます。RPT フィールドのデフォルトは0.025です。RPTWithGeometrySpatialField (下記参照) の場合、シリアライズされたジオメトリでは常に完全な精度が得られるため、これは精度を制御するというよりも、インデックスのサイズをどの程度にするかのトレードオフを制御します。 distErrPctのデフォルト値は、そのフィールドでは0.15です。 maxDistErr-
任意
デフォルト: 説明を参照
インデックスされたデータに必要な詳細度の最高レベルを定義します。空白のままにすると、デフォルトは 1 メートル (わずか 0.000009 度未満) です。この設定は、適切な maxLevels (下記参照) を計算するために内部的に使用されます。
worldBounds-
任意
デフォルト: なし
x および y の有効な数値範囲を
ENVELOPE(minX, maxX, maxY, minY)の形式で定義します。geo="true"の場合、標準的な緯度経度の範囲が想定されます。geo=falseの場合は、境界を定義する必要があります。 distCalculator-
任意
デフォルト: 説明を参照
距離計算アルゴリズムを定義します。
geo=trueの場合、haversineがデフォルトです。geo=falseの場合、cartesianがデフォルトになります。その他の可能な値は、lawOfCosines、vincentySphere、cartesian^2です。 prefixTree-
任意
デフォルト: 説明を参照
空間グリッドの実装を定義します。PrefixTree (RecursivePrefixTree など) は世界をグリッドとしてマッピングするため、各グリッドセルは次のレベルで別のグリッドセルのセットに分解されます。
geo=trueの場合、デフォルトのプレフィックスツリーはgeohashで、それ以外の場合はquadです。Geohash は各レベルで 32 個の子を持ち、quad は 4 個の子を持ちます。Geohash は厳密に地理空間であるため、geo=trueの場合にのみ使用できます。3 番目の選択肢は
packedQuadであり、一般に、レベル数が多数 (おそらく 20 以上) ある場合はquadよりも効率的です。 maxLevels-
任意
デフォルト: なし
インデックスされたデータの最大グリッド深度を設定します。代わりに、
maxDistErrを指定して適切な maxLevels を計算する方が、通常はより直感的です。
その他にも次のようなものがあります。 normWrapLongitude、datelineRule、validationRule、autoIndex、allowMultiOverlap、precisionModel。詳細については、上記で参照されている spatialContextFactory の実装に関する以下の注記、特に JTS ベースのものへのリンクを参照してください。
標準形状
RPT フィールドタイプは、一連の標準形状をサポートしています。点、円 (別名、バッファ付き点)、エンベロープ (別名、長方形または境界ボックス)、ラインストリング、ポリゴン、およびこれらの「マルチ」バリアントです。エンベロープとラインストリングは、ユークリッド/直交座標 (フラット 2D) 形状です。基盤となる Solr は、それらを実装する Spatial4j ライブラリです。他の形状をサポートするには、フィールドタイプの spatialContextFactory 属性を設定して、他のオプションを参照できます。JTS と Geo3D の 2 つが利用可能です。
JTS とポリゴン (フラット)
JTS Topology Suite は、ユークリッド/直交座標 (フラット 2D) モデルを備えた一般的な計算幾何学ライブラリです。ポリゴン、バッファリング形状、およびいくつかの無効なポリゴン修復フォールバックを含む、さまざまな形状をサポートしています。Solr に付属の Spatial4j の助けを借りて、ポリゴンはデータライン (子午線) の横断をサポートします。それを (JAR ファイル) ダウンロードして、Solr の内部の特別な場所に配置する必要があります: SOLR_INSTALL/server/solr-webapp/webapp/WEB-INF/lib/。ここで簡単にダウンロードできます: https://mvnrepository.com/artifact/org.locationtech.jts/jts-core/1.15.0。他の一般的な Solr lib ディレクトリに配置しても機能しませんので、ご注意ください。
フィールドタイプの spatialContextFactory 属性を JTS に設定します。
有効にすると、追加の構成属性が利用可能になります。Javadocs については org.locationtech.spatial4j.context.jts.JtsSpatialContextFactory を参照し、スーパークラスのオプションも必ず参照してください。特に有効にする可能性が高いオプションの 1 つは autoIndex (つまり、JTS の PreparedGeometry を使用) です。これは、複雑なポリゴンに対して大幅なパフォーマンス向上になることが示されています。
<fieldType name="location_rpt" class="solr.SpatialRecursivePrefixTreeFieldType"
spatialContextFactory="JTS"
autoIndex="true"
validationRule="repairBuffer0"
distErrPct="0.025"
maxDistErr="0.001"
distanceUnits="kilometers" />
フィールドタイプが定義されたら、それを使用するフィールドを定義します。
以下は、solr.SpatialRecursivePrefixTreeFieldType または RptWithGeometrySpatialField のいずれかである可能性のあるフィールド「geo」のポリゴンクエリの例です。
&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 は、Solr に含まれる Lucene spatial-3d モジュールの通称です。これは、球体または WGS84 楕円体上のさまざまな形状 (ポリゴンを含む) を実装する計算幾何学ライブラリです。Geo3D は、ジオメトリが地球全体にわたる長距離をカバーする場合や、極に近い空間アプリケーションに特に適しています。Geo3D は、3 次元ジオメトリをサポートしていないにもかかわらず、ジオセントリック座標 (X、Y、Z) を使用する内部実装が原因でそのように命名されています。これらの内部的な詳細にもかかわらず、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 ファセット 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.15gridLevel の計算に使用される geom のサイズの割合。RPT の同様の名前のパラメーターと同じように計算されます。
facet.heatmap.distErr-
任意
デフォルト: なし
間接的にグリッドレベルを選択するために使用されるセルエラー距離。RPT の同様の名前のパラメーターと同じように計算されます。
facet.heatmap.format-
任意
デフォルト:
ints2D形式は
ints2Dまたはpngのいずれかです。
|
デフォルトのサイズが探しているものになるまで、さまざまな入力ジオメトリを使用して、さまざまな |
以下は 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 を明示的に指定できます。
minX、maxX、minY、maxY は、カウントが行われる領域を報告します。これは、ターゲットグリッドレベルでの入力 geom の最小包含境界長方形です。これは日付線を折り返す場合があります。columns および rows の値は、出力長方形を均等に分割する列と行の数です。注: セルデータが geo=true の場合は小数点以下の度数、geo=false の場合は指定された単位の座標空間にあるため、これらの長方形/点をプロットするために画面に投影されたマップ長方形を均等に分割しないでください。これは画面上のマップと同じように配置できますが、必ずしもそうであるとは限りません。
counts_ints2D キーには、整数の 2D 配列があります。最初の外側のレベルは行順 (上から下) で、内側の配列は列 (左から右) です。配列がすべてゼロになる場合は、効率上の理由から代わりに null が返されます。一致する空間データがない場合、値全体が null になります。
format=png の場合、出力キーは counts_png です。これは、4 バイトの PNG を base-64 エンコードした文字列です。この PNG は、論理的には ints2D 形式とまったく同じデータを保持しています。アルファチャネルのバイトは、診断目的で PNG を見やすくするために反転されていることに注意してください。反転されていない場合、counts が 2^24 を超えるまで不透明にならないためです。したがって、この値を超える counts は不透明になります。
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 を共有しています。これは、同じ空間インフラストラクチャの一部を共有しているためです。
ボックスをインデックス化するには、WKT/CQL ENVELOPE 構文の文字列であるフィールド値を bbox フィールドに追加します。例: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 ローカルパラメーターには、overlapRatio、area、および area2D のいずれかを指定できます。area は、球の表面(geo=true の場合)の数学を使用してドキュメントの面積でスコアを付けるのに対し、area2D は単純な幅 * 高さを使用します。overlapRatio は、ドキュメントの面積とクエリの面積に対してどれだけの重複が存在するかに基づいて、[0-1] の範囲のスコアを計算します。BBoxOverlapRatioValueSource の JavaDoc に、数式の詳細が記載されています。さらに、数式のクエリ側をインデックス(ターゲット)側に重み付けできる追加のパラメーター queryTargetProportion があります。また、&debug=results を使用して、役立つスコア計算情報を表示することもできます。