通过按与给定参考点的距离对结果进行排序来改进搜索体验
通常,用户想要搜索与地理位置关联的项。 例如,他们可能想要查找距离他们最近的咖啡店。 为了帮助你比较地表位置,AI 搜索添加了可在查询中调用的地理空间函数。
在此,你将了解如何搜索物理点附近或边界区域内的对象。
什么是地理空间函数?
在本模块的上一单元中,你了解了用户如何通过指定要搜索的字段(例如 Description
和 Category
)来定位酒店:
search=(Description:luxury OR Category:luxury)&$select=HotelId, HotelName, Category, Tags, Description&$count=true
预订酒店时,一个重要考虑因素是它的地理位置。 例如,如果要预订参观埃菲尔铁塔,则需要一家靠近它的酒店。
若要求 AI 搜索根据其位置信息返回结果,可以在查询中使用两个函数:
geo.distance
。 此函数返回从指定点到搜索结果位置的地表直线距离。geo.intersects
。 如果搜索结果的位置位于指定的多边形内,则此函数返回true
。
若要使用这些函数,请确保索引包含结果的位置。 位置字段应具有数据类型 Edm.GeographyPoint
并存储经纬度。
使用 geo.distance 函数
geo.distance
函数采用两个点作为参数,并返回二者之间的距离,以公里为单位。
假设你正在寻找埃菲尔铁塔附近的酒店。 可以修改上述查询,添加新筛选器:
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
此查询返回索引中埃菲尔铁塔五公里内的所有豪华酒店。 在查询中:
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 函数
假设你已经决定留在巴黎第七区游览埃菲尔铁塔。 搜索酒店时,你希望尽可能准确地指定此区域。 可以使用 geo.intersects
函数来构建此类查询。
geo.intersects
函数将一个位置与地表的多边形进行比较,可以用三个或更多点指定该多边形。 通过使用多边形,可以创建与区域(如区)紧密匹配的形状。 使用此多边形向查询添加地理筛选器:
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
子句中使用它。