特定の参照ポイントからの距離で結果を並べ替えることで、検索エクスペリエンスを向上させる
多くの場合、ユーザーは地理的な場所に関連付けられている項目を検索する必要があります。 たとえば、自分の場所に最も近いコーヒー ショップを見つけたいような場合です。 地表にある場所を比較できるように、AI Search には、クエリで呼び出すことができる地理空間関数が含まれています。
ここでは、物理的なポイントの近くまたは境界領域内にあるものを検索する方法について説明します。
地理空間関数とは
このモジュールの前のユニットでは、Description
や Category
のような検索対象フィールドを指定することで、ユーザーがホテルを見つける方法を見ました。
search=(Description:luxury OR Category:luxury)&$select=HotelId, HotelName, Category, Tags, Description&$count=true
ホテルを予約するときの重要な考慮事項は、その地理的な場所です。 たとえば、エッフェル塔を見るための旅行を予約する場合は、その近くにあるホテルを希望します。
位置情報に基づいて結果を返すように AI Search に指示するには、クエリで次の 2 つの関数を使用できます。
geo.distance
。 この関数は、指定したポイントから検索結果の場所までの、地球の表面を横切る直線距離を返します。geo.intersects
。 この関数は、検索結果の位置が指定した多角形内にある場合、true
を返します。
これらの関数を使うには、インデックスに結果の場所が含まれていることを確認します。 場所フィールドはデータ型が Edm.GeographyPoint
で、緯度と経度を含む必要があります。
geo.distance 関数を使用する
geo.distance
関数は、パラメーターとして 2 つのポイントを受け取り、それらの間の距離をキロメートル単位で返します。
エッフェル塔の近くにあるホテルを探しているとします。 上のクエリを変更し、新しいフィルターを追加できます。
search=(Description:luxury OR Category:luxury)$filter=geo.distance(location, geography'POINT(-122.131577 47.678581)') le 5&$select=HotelId, HotelName, Category, Tags, Description&$count=true
このクエリは、エッフェル塔から 5 キロメートル以内のインデックスですべての高級ホテルを返します。 クエリの内容は次のとおりです。
Location
は、ホテルの場所を格納するフィールドの名前です。geography'POINT(2.294481 48.858370)'
は、経度と緯度で示されたエッフェル塔の位置です。le 5
は、geo.distance
関数が 5 キロメートル以下の数値を返す場合に、結果にホテルを含める必要があることを指定します。
重要
geo.distance
をフィルターで使う場合、等しい (eq
) 演算子と等しくない (ne
) 演算子はサポートされません。 代わりに、lt
、le
、gt
、または ge
を使います。
geo.distance
は距離をキロメートル単位で返すので、orderby
句で使用することもできます。 たとえば、このクエリは、インデックス内のすべての高級ホテルを、エッフェル塔から近い順に返します。
search=(Description:luxury OR Category:luxury)&orderby=geo.distance(Location, geography'POINT(2.294481 48.858370)') asc&$select=HotelId, HotelName, Category, Tags, Description&$count=true
このクエリの asc
は、エッフェル塔からの距離の昇順で高級ホテルを返すように指定します。
geo.intersects 関数を使用する
エッフェル塔への旅行のため、パリの 7 区内に滞在することを決めたとします。 ホテルを検索するとき、できるだけ正確にこのエリアを指定する必要があります。 geo.intersects
関数を使って、そのようなクエリを作成できます。
geo.intersects
関数は、3 つ以上のポイントで指定された地球表面上の多角形と位置を比較します。 多角形を使うことで、区のようなエリアと密接に一致する図形を作成できます。 この多角形を使って、クエリに地理フィルターを追加します。
search=(Description:luxury OR Category:luxury) AND geo.intersects(Location, geography'POLYGON((2.32 48.91, 2.27 48.91, 2.27 48.60, 2.32 48.60, 2.32 48.91))')&$select=HotelId, HotelName, Category, Tags, Description&$count=true
このクエリは、エッフェル塔を囲む正方形内にあるすべての高級ホテルを返します。 4 つより多くのポイントを使って、より正確なエリアを作成できます。
重要
多角形では、ポイントを反時計回りの順序で指定する必要があり、多角形は閉じている必要があります。つまり、指定する最初のポイントと最後のポイントは同じである必要があります。
geo.intersects
はブール値を返すので、orderby
句で使うことはできません。