すべてのプロダクト
Search
ドキュメントセンター

OpenSearch:近接検索

最終更新日:Jun 22, 2026

OpenSearch は、人物や場所などのエンティティに対する近接検索をサポートしています。座標を渡すことで検索効率を向上させ、結果を距離でソートできます。このトピックでは、この機能の設定方法について説明します。

ソリューション

  1. アプリケーションスキーマで GEO_POINT 型のフィールドと、結果を取得するための地理位置情報インデックスを設定します。

  2. GEO_POINT フィールドに対してデータソース処理プラグインを設定します。

  3. 検索構文を使用してクエリをテストし、ソート機能を追加します。

操作手順

  1. アプリケーションスキーマの設定

OpenSearch のアプリケーションスキーマで、地理座標用のフィールドとして、DOUBLE 型の lonDOUBLE 型の lat を追加します。次に、GEO_POINT 型の company_lon_lat という名前のフィールドを作成します。インデックススキーマで、company_lon_lat フィールドを含む company_lon_lat という名前のインデックスを追加し、そのアナライザとして [地理位置情報アナライザ] を選択します。属性フィールドリストで、company_lon_lat フィールドを見つけ、[属性フィールドとして追加] をクリックします。これにより、このフィールドは filteraggregatesort、および distinct 句で使用できるようになります。アプリケーション作成の全プロセスについては、アプリケーションの構築をご参照ください。

  1. データソースの設定

フィールドマッピングを設定する際、アプリケーションスキーマの company_lon_lat フィールドに対して StringCatenateExtractor プラグインを使用します。このプラグインは、lon (経度) フィールドと lat (緯度) フィールドを連結し、その結果をターゲットフィールドの company_lon_lat に書き込みます。

[フィールドデリミタ] テキストボックスに、半角スペースを 1 つ入力します。

注意:ターゲットフィールド company_lon_lat のマッピングフィールドは空のままにできます。

プラグインの詳細については、データソースプラグインをご参照ください。

コンソールでは、ターゲットフィールド company_lon_lat のマッピングは空のままにします。

  1. 検索のテスト

クエリ例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 を超えると、パフォーマンスが大幅に低下します。

  • 特徴と構文の詳細については、範囲クエリをご参照ください。

  1. 詳細なソート式の追加

式の例(distance(company_lon_lat,long_lat_in_query,distance)+1))*10000

機能:取得したドキュメントを距離でソートします。

構文distance(location1, location2, outputname, defaultvalue)

  • location1GEO_POINT 型のフィールド名。

  • location2:クエリ文字列の kvpairs 句からの変数名。その値は、GEO_POINT 型で必須の LON LAT フォーマットである必要があります。

  • outputname:オプション。計算された距離を結果で返す必要がある場合は、出力フィールドの名前を指定します。

  • defaultvalue:オプション。ドキュメントの location1 の値が無効な場合に返す距離の値を指定します。このパラメーターが指定されていない場合、デフォルト値は 100000 です。

注意:この例では、long_lat_in_querykvpairs 句で設定する必要があります。例:kvpairs=long_lat_in_query:120.34256 30.56982