OpenSearch では、近くの人や場所を検索できます。このトピックでは、特定の人または場所の座標に基づいて近くの人または場所を検索する方法について説明します。これは、検索効率の向上に役立ちます。さらに、検索結果をソートすることもできます。
解決策
アプリケーションのスキーマに GEO_POINT タイプのフィールドを設定し、データ取得用の地理位置情報インデックスを設定します。
GEO_POINT タイプのフィールドにデータ処理プラグインを設定します。
検索テスト構文を使用し、結果をソートします。
手順
1. アプリケーションスキーマを設定します。
OpenSearch コンソールにログインします。設定するアプリケーションを見つけ、[アクション] 列の [設定] をクリックします。 アプリケーション スキーマインデックススキーマOpenSearch コンソールでアプリケーションを作成する方法の詳細については、 ステップで、経度と緯度を示す DOUBLE タイプの lon フィールドと lat フィールドを追加します。次に、GEO_POINT タイプの company_lon_lat フィールドを追加します。必要に応じて、フィールドの名前を設定できます。 ステップで、company_lon_lat フィールドの分析方法として [地理位置情報アナライザー] を選択し、このフィールドを属性フィールドとして追加します。 OpenSearch コンソールでアプリケーションを作成する方法の詳細については、「」をご参照ください。
2. データソースを設定します。
フィールドマッピングを設定する場合は、company_lon_lat フィールドに StringCatenateExtractor プラグインを使用して、lon フィールドと lat フィールドを連結します。フィールドのデリミタとしてスペースを使用し、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 メートル以内の Alibaba のドキュメントを検索します。 構文: query=spatial_index:'circle(LON LAT,Radius)'。
LON は経度を指定します。LAT は緯度を指定します。Radius は検索の半径を指定します。単位: メートル。最適な検索効果を得るには、ソースの場所から 10 km 以内の半径を指定することをお勧めします。
特定の機能と構文の詳細については、「範囲検索」をご参照ください。
4. 高度ソート式を追加します。
この例では、座標は次の kvpairs 句を使用して指定されます。kvpairs=longtitude_in_query:120.34256, latitude_in_query:30.56982
検索結果は、次の高度ソート式を使用して距離でソートされます。
-distance(longitude_in_doc,latitude_in_doc,longtitude_in_query, latitude_in_query, distance_value)
構文:
distance(location1, location2, outputname, defaultvalue)
searcher_cache 句には、次のパラメーターを含めることができます。
location1: GEO_POINT タイプのフィールドの名前。
location2: クエリ文字列の kvpairs 句で設定されるフィールドの名前。フィールドの値は、GEO_POINT タイプのフィールドと同じ形式です。経度 緯度。
outputname: 戻り値。このパラメーターは省略可能です。このパラメーターを指定すると、検索結果で計算された距離を取得できます。
defaultvalue: location1 パラメーターの値が無効な場合に返される距離の値。このパラメーターは省略可能です。このパラメーターが指定されていない場合は、デフォルトで 100000 が返されます。
説明: この例では、long_lat_in_query パラメーターは kvpairs 句を使用して指定されます。例: kvpairs=long_lat_in_query:120.34256 30.56982。