今回は緯度経度の位置情報を用いた検索について説明します。

位置情報検索とは

Fessの位置情報検索は、緯度経度の位置情報を含めてドキュメントをインデックス化することで、位置情報で検索する機能です。 Googleマップなどの地図アプリと連携して検索結果を視覚化することも可能となっており、例えば、近くにある飲食店や宿泊施設検索などに利用することができます。

Fessでは位置情報を格納するフィールドとして「location」が定義されています。 位置情報検索を行いたい場合は、インデックス生成時に緯度経度を 「35.17614,-93.87341」のような形式でlocationフィールドに設定しておきます。

実際に検索する際は、検索リクエストのパラメータとして「geo.location.point」と「geo.location.distance」に値を指定します。geo.location.point に緯度/経度のペアを与え、geo.location.distanceにその地点からの距離を与えることで、 ある地点から一定の範囲内の位置情報を持つデータを対象に検索できます。

例えば、「geo.location.point=35.681,139.766&geo.location.distance=10.0km」をリクエストパラメータとして指定すると、 35.681,139.766の地点から半径10kmの範囲内の位置情報を持つドキュメントを対象として検索が可能です。

Fessの準備

では実際にFess 13.4.2を使ってインデックスを作成し、検索する方法について説明していきましょう。検索対象のデータには検索対象となるテキスト以外に位置情報も保持されている必要があるため、今回はCSVファイルのクロールで位置情報の検索を確認します。

インデックスの作成

まずは、位置情報を記載したCSVファイルをクロールしてインデックスを作成します。

今回はCSVファイルに以下を記載しています。 1番目のフィールドに位置情報、2番目のフィールドにタイトル、3番目のフィールドはコンテンツを記載しました。

"35.000,139.000","GEO 35:139.000","Test Message lat:35.000 lon:139.000"
"35.001,139.001","GEO 35:139.001","Test Message lat:35.001 lon:139.001"
"35.002,139.002","GEO 35:139.002","Test Message lat:35.002 lon:139.002"
"35.003,139.003","GEO 35:139.003","Test Message lat:35.003 lon:139.003"
"35.004,139.004","GEO 35:139.004","Test Message lat:35.004 lon:139.004"
"35.005,139.005","GEO 35:139.005","Test Message lat:35.005 lon:139.005"

(中略)

"35.996,139.996","GEO 35:139.996","Test Message lat:35.996 lon:139.996"
"35.997,139.997","GEO 35:139.997","Test Message lat:35.997 lon:139.997"
"35.998,139.998","GEO 35:139.998","Test Message lat:35.998 lon:139.998"
"35.999,139.999","GEO 35:139.999","Test Message lat:35.999 lon:139.999"

クロールの設定

次にクロール設定を作成します。Fessの管理画面から、「クローラ」>「データストア」>「新規作成」をクリックします。ハンドラ名は「CsvDataStore」を選択してください。

パラメータには、以下のように設定します。

directories=/tmp/csv
fileEncoding=UTF-8
quoteDisabled=false

作成したCSVファイルは「/tmp/csv/data.csv」に置いたので、「directories」にはCSVファイルのパスを指定しています。ファイルエンコードは作成したCSVファイルに合わせて入力してください。

続いてスクリプトには以下を記述します。

url="https://www.google.com/search?q=" + cell1
host="localhost"
site="localhost"
title=cell2
content=cell3
cache=cell3
digest=cell3
anchor=
content_length=cell3.length()
last_modified=new java.util.Date()
location=cell1

今回クロールするCSVファイルは、1フィールド目に位置情報を持っているので「cell1」をlocationフィールドに格納するように記述しています。

入力が終わったら、「作成」ボタンをクリックして設定内容を保存してください。

クロールの実行

クロール設定後、クロールを実行します。 「システム」 > 「スケジューラ」 > 「Default Crawler」 で「今すぐ開始」をクリックします。 クロールが完了するまでには少し時間がかかります。

クロールが終わったら、「http://localhost:8080/」にアクセスしてドキュメントを検索してみましょう。

通常の検索画面

では、リクエストパラメータに「geo.location.point=35.681,139.766&geo.location.distance=10.0km」を追加して検索してみます。 「http://localhost:8080/search/?num=10&sort=&q=geo&geo.location.point=35.681,139.766&geo.location.distance=10.0km」のように直接URLを入力しても構いません。

位置情報検索利用時の検索画面(URLにリクエストパラメータを追加)

このように、リクエストパラメータに「geo.location.point」と「geo.location.distance」を利用することで、指定した地点と範囲の位置情報を持つドキュメントだけを表示することができます。

∗ ∗ ∗

  今回は、Fessで緯度経度の位置情報を使って検索する方法を紹介しました。 検索サイト内で利用者の位置情報を取得すれば、「利用者の周辺にある位置座標を持つドキュメントを検索結果に表示させる」といったことも可能になります。