OpenSearch は、人物や場所などのエンティティに対する近接検索をサポートしています。座標を渡すことで検索効率を向上させ、結果を距離でソートできます。このトピックでは、この機能の設定方法について説明します。
ソリューション
-
アプリケーションスキーマで
GEO_POINT型のフィールドと、結果を取得するための地理位置情報インデックスを設定します。 -
GEO_POINTフィールドに対してデータソース処理プラグインを設定します。 -
検索構文を使用してクエリをテストし、ソート機能を追加します。
操作手順
-
アプリケーションスキーマの設定
OpenSearch のアプリケーションスキーマで、地理座標用のフィールドとして、DOUBLE 型の lon と DOUBLE 型の lat を追加します。次に、GEO_POINT 型の company_lon_lat という名前のフィールドを作成します。インデックススキーマで、company_lon_lat フィールドを含む company_lon_lat という名前のインデックスを追加し、そのアナライザとして [地理位置情報アナライザ] を選択します。属性フィールドリストで、company_lon_lat フィールドを見つけ、[属性フィールドとして追加] をクリックします。これにより、このフィールドは filter、aggregate、sort、および distinct 句で使用できるようになります。アプリケーション作成の全プロセスについては、アプリケーションの構築をご参照ください。
-
データソースの設定
フィールドマッピングを設定する際、アプリケーションスキーマの company_lon_lat フィールドに対して StringCatenateExtractor プラグインを使用します。このプラグインは、lon (経度) フィールドと lat (緯度) フィールドを連結し、その結果をターゲットフィールドの company_lon_lat に書き込みます。
[フィールドデリミタ] テキストボックスに、半角スペースを 1 つ入力します。
注意:ターゲットフィールド company_lon_lat のマッピングフィールドは空のままにできます。
プラグインの詳細については、データソースプラグインをご参照ください。
コンソールでは、ターゲットフィールド company_lon_lat のマッピングは空のままにします。
-
検索のテスト
クエリ例:query=name:'Alibaba' AND company_lon_lat:'circle(116.5806 39.99624, 1000)'。
説明:このクエリは、会社名が Alibaba であり、かつ場所が座標 '116.5806 39.99624' から 1,000 メートル (1 km) 以内にあるドキュメントを検索します。
構文:query=spatial_index:'circle(LON LAT,Radius)'。
-
LONは経度、LATは緯度、Radiusは半径 (単位:メートル) を表します。最適なパフォーマンスを得るには、半径を 10 km 以内にすることを推奨します。半径が 10 km を超えると、パフォーマンスが大幅に低下します。 -
特徴と構文の詳細については、範囲クエリをご参照ください。
-
詳細なソート式の追加
式の例:(distance(company_lon_lat,long_lat_in_query,distance)+1))*10000。
機能:取得したドキュメントを距離でソートします。
構文: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。