[Solr] Spatial Search

3.5K Views

June 03, 22

スライド概要

Solrの地理空間検索の機能について説明しました

profile-image

LIFULL HOME'Sを運営する株式会社LIFULLのアカウントです。 LIFULLが主催するエンジニア向けイベント「Ltech」等で公開されたスライド等をこちらで共有しております。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

[Solr] Spatial Search 株式会社LIFULL 社内技術勉強会 加藤 宏脩

2.

目次 空間検索でできること フィールドタイプ スキーマの設定の仕方 検索の仕方 クエリパーサ その他利用事例

3.

できること - インデックスポイント、その他の形状 - バウンディングボックスや円、その他の形状で検索結果をフィルタリングする - ポイント間の距離、または長方形間の相対領域でスコアを並び替えたりブーストしたりする - ヒートマップ作成やポイントプロット用に、ファセット・カウント番号の 2次元グリッドを生成します。

4.

フィールドタイプ LatLonPointSpatialField ⇛緯度経度のポイントデータを扱うのにいいフィールドタイプ。LatLonTypeの代わりのフィールド LatLonType (非推奨) とその非測地系であるPointType? SpatialRecursivePrefixTreeFieldType (RPT for short), including RptWithGeometrySpatialField, a derivative ⇛ポリゴン、ヒートマップなどのカスタムのユースケース等のいくつかの機能がある BBoxField ⇛バウンディングボックスのインデックス作成、ボックスによるクエリ、検索述語(Intersects, Within, Contains, Disjoint, Equals)の指 定、overlapRatioや単なる面積などの関連性のソートやブーストを行うためのもの

5.
[beta]
スキーマの設定の仕方
schema.xml
# フィールドタイプ
<fieldType name="latlon" class="solr.LatLonPointSpatialField" />
# データポイントを格納するためのフィールド
<field name="location" type="latlon" indexed="true" stored="true" docValues="true" />

# ドキュメント
<field name="location">45.17614,-93.87341</field> <!-- Buffalo store -->
<field name="location">40.7143,-74.006</field>

<!-- NYC store -->

<field name="location">37.7752,-122.4232</field> <!-- San Francisco store -->

6.
[beta]
検索の仕方

curl
"http://localhost:8983/solr/bukken/select?fl=pkey%2Clocation&fq=%7B!geofilt%20pt%3D35.941185791789%2C139.30592365219%20d%3D5%20sfield%
3Dlocation%7D&q=*%3A*&rows=1"
{!geofilt pt=35.941185791789,139.30592365219 d=5 sfield=location}
{
"responseHeader":{
"zkConnected":true,
"status":0,
"QTime":2},
"response":{"numFound":92,"start":0,"numFoundExact":true,"docs":[
{
"pkey":"BSale_1024840000096",
"location":"35.941185791789,139.30592365219"}
}

7.
[beta]
クエリパーサ: geofilt

指定した緯度経度から、指定した距離にあるドキュメントを検索する
&q=*:*&fq={!geofilt sfield=location}&pt=45.15,-93.85&d=5

8.
[beta]
クエリパーサ: bbox

指定した緯度経度から、指定した距離にあるドキュメントを検索(円の外も含む)
円の形に絞る必要がないので計算が早い
できるだけ円に近づけたいけど速く実行できるようにしたい場合
→ RPTフィールドの検討
&q=*:*&fq={!bbox sfield=store}&pt=45.15,-93.85&d=5

9.

クエリパーサーのパラメーター d: 半径方向の距離。単位はキロメートル pt: 緯度経度の場合はlat,lonの中心点。 PointTypeの場合はx,y。RPTの場合はxy sfield: spatial indexed field

10.

クエリパーサーのパラメーター score: 生成するスコアの設定値 none: 1.0の固定スコア(デフォルト) kilometers: フィールド値と指定した中心点の間のキロメートル単位の距離 miles: フィールド値と指定した中心点の間のマイル単位の距離 degrees: フィールド値と指定した中心点の間の度単位の距離? distance distanceUnits: フィールド値と、このフィールド用に構成した点との間の距離 overlapRatio: インデックス月シェイプとクエリシェイプ間の相対的なオーバーラップ area distanceUnits: このフィールドように構成されたもので表された、重なり合う形状の半正矢ベースの領域 area2D distanceUnits: このフィールドように構成されたもので表された、重なり合う形状の座標ベースの領域

11.

四角形によるフィルタリング 四角形の中にあるドキュメントを検索することができる クエリ:&q=*:*&fq=location:[45,-94 TO 46,-93] 指定する値“左上 TO 右下”

12.
[beta]
距離の並び替え、Boosting(function query)

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

dist: 多次元ベクトル間のpノルム距離を計算
hsin: 球上の2点間の距離を計算
sqedist: 2点間のユークリッド距離の2乗を計算

13.
[beta]
距離によるファセット

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()

14.

JTSとポリゴン Geo3Dとポリゴン ヒートマップファセット

15.

JTSとポリゴン JTS Topology Suite を組み合わせてポリゴンが作れるらしい(未検証)

16.

Geo3Dとポリゴン Geo3Dは、Solrに含まれているLuceneSpatial-3dモジュールの通称 地球全体の長距離の検索ができる

17.

ヒートマップファセット RPTフィールドは、各グリッドセルに空間データを持つドキュメントのファセットカウントの 2dグリッドの生成をサポートしている https://issues.apache.org/jira/browse/SOLR-7005

18.

参考 Spatial Search | Apache Solr Reference Guide 8.10