Apache Solr

 

solrjでSpatialSearchの実装をする

solrjでSpatial Searchの実装をします。solrjを使えばサークル・ボックス検索を手軽に実装する事ができます。Spatial Searchを使うと距離によるソートができる等のメリットがあります。

新サイト、tree-mapsを公開しました!!

tree-maps: 地図のWEB TOOLの事ならtree-mapsにお任せ!

地図に関するWEB TOOL専門サイトです!!

大画面で大量の緯度経度を一気にプロット、ジオコーディング、DMS<->DEGの相互変換等ができます!

◯ 広告

solrには空間検索をする機能があり、円形・四角形の範囲内のデータを、座標を元に検索する事ができます。

それをSpatial Searchと呼びます。

今回はそのSpatial Searchをsolrjで実装してみましょう。

Spatial Searchをするためにはいくつか設定が必要になるので、以下の記事を元に設定をしましょう。

solrでSpatialSearchするためのschema.xml設定(LatLonType)

Spatial Search対象のフィールド(solr.LatLonType)は「latlng」とします。

/**
 * JR秋葉原駅から半径3km圏内のデータを距離の近い順に検索する
 */
 public SolrSearchResult<AddressDocument> getSpatialCircle() {
    SolrQuery solrQuery = new SolrQuery();
    solrQuery.setQuery("*:*");
    solrQuery.setFilterQueries("{!geofilt}");
    solrQuery.setParam("sfield", "latlng");
    solrQuery.setParam("pt", "35.698683,139.774219");
    solrQuery.setParam("d", "3");
    solrQuery.setSortField("geodist()", SolrQuery.ORDER.asc);
    solrQuery.setRows(500);
    return getResultList(solrQuery, AddressDocument.class);
}

1点注意があります。

setFilterQueriesの引数ですが、以下ではgeodist()による距離ソートが効きません。

// 正
solrQuery.setFilterQueries("{!geofilt}");
// 誤
solrQuery.setFilterQueries("{!geofilt sfield=latlng}");

「誤」の書き方だと、solrjではsfieldが認識できずgeodist()のソートができません。(ver4.1)

では検索し、地図にプロットして確認してみましょう。

solrjのSpatialSearchでサークル検索結果をプロット

プロットし過ぎて紫マーカーのJR秋葉原駅が見えませんが、きっちりサークル検索になってますね。

続いてボックス(四角形)検索です。バウンディングボックス検索とも言います。

public SolrSearchResult<AddressDocument> getSpatialSquare() {
    SolrQuery solrQuery = new SolrQuery();
    solrQuery.setQuery("*:*");
    solrQuery.setFilterQueries("{!bbox}");
    solrQuery.setParam("sfield", "latlng");
    solrQuery.setParam("pt", "35.698683,139.774219");
    solrQuery.setParam("d", "2");
    solrQuery.setSortField("geodist()", SolrQuery.ORDER.asc);
    solrQuery.setRows(500);
    return getResultList(solrQuery, AddressDocument.class);
}

サークル検索の場合はfilterQueryは「geoflit」ですが、ボックスは「bbox」となります。

bboxはバウンディングボックスの略ですね。

では検索し、地図にプロットして確認してみましょう。

solrjのSpatialSearchでボックス検索結果をプロット

プロットし過ぎて紫マーカーのJR秋葉原駅が見えませんが、きっちりボックス検索になってますね。

◯ 広告