OpenSearch を使用すると、近くにいる人や場所を検索できます。このガイドでは、位置座標を使用して効率的に検索し、結果を距離でソートする方法について説明します。
ソリューション
-
アプリケーションスキーマで GEO_POINT フィールドを設定し、空間インデックスを使用して結果を取得します。
-
GEO_POINT フィールド用のデータ処理プラグインを設定します。
-
テスト検索の構文とソートの追加方法を学びます。
操作手順
1. アプリケーションスキーマの設定
OpenSearch の アプリケーションスキーマ で、地理座標用に DOUBLE 型の lon フィールドと lat フィールドを追加します。次に、company_lon_lat という名前の GEO_POINT フィールドを作成します (フィールド名はカスタマイズ可能です)。インデックススキーマ で、company_lon_lat のアナライザを地理位置アナライザに設定し、属性フィールドとして追加します。インデックスフィールドリストで、company_lng_lat という名前のインデックスを作成し、その含まれるフィールドを company_lon_lat に設定し、分析メソッドとして 地理位置アナライザ を選択します。アプリケーションスキーマの 属性フィールド リストで、company_lon_lat フィールドを見つけ、[属性フィールドとして追加] をクリックして追加します。アプリケーション作成プロセスの詳細については、クイックスタートガイドをご参照ください。
2. データソースの設定
フィールドマッピングを設定する際、company_lon_lat フィールドには StringCatenateExtractor データ処理プラグインを使用します。このプラグインは、既存の経度フィールド lon と緯度フィールド lat を連結します。次に、値をスペースで結合し、その結果をターゲットフィールド company_lon_lat に書き込みます。
備考: company_lon_lat ターゲットフィールドのマッピングは無視できます。
プラグインの詳細については、「データ処理プラグイン」をご参照ください。
3. 検索のテスト
例: query=name:'Alibaba' AND company_lon_lat:'circle(116.5806 39.99624, 1000)' 説明: このクエリは、座標 '116.5806 39.99624' から半径 1,000 メートル (1 km) 以内にある会社 "Alibaba" のドキュメントを検索します。構文: query=spatial_index:'circle(LON LAT,Radius)'
-
LONは経度、LATは緯度、radiusはメートル単位の検索半径です。最高のパフォーマンスを得るには、半径を 10 km 以下にすることを推奨します。この範囲を超えると、パフォーマンスが大幅に低下します。 -
特徴と構文の詳細については、「範囲検索」をご参照ください。
4. 高度ソート式の追加
距離でソートするには、ユーザーの座標を kvpairs パラメーターで渡します: kvpairs=long_lat_in_query:'120.34256 30.56982'
高度ソート式は次のとおりです:
-distance(company_lon_lat, long_lat_in_query)
構文:
distance(location1, location2, outputname, defaultvalue)
パラメーター:
-
location1: GEO_POINT 型のフィールド名。 -
location2: クエリ文字列のkvpairs句で設定されたフィールド名。値は GEO_POINT フィールドで必須のLON LATフォーマットである必要があります。 -
outputname: オプション。計算された距離を結果で返すための名前を指定します。
-
defaultvalue: オプション。ドキュメント内の
location1フィールドが無効な場合に返す距離を指定します。省略した場合のデフォルト値は 100000 です。
備考: この例では、long_lat_in_query を kvpairs で設定する必要があります。例: kvpairs=long_lat_in_query:120.34256 30.56982