通过按与给定参考点的距离对结果进行排序来改进搜索体验

已完成

通常,用户想要搜索与地理位置关联的项。 例如,他们可能想要查找距离他们最近的咖啡店。 为了帮助你比较地表位置,AI 搜索添加了可在查询中调用的地理空间函数。

在此,你将了解如何搜索物理点附近或边界区域内的对象。

什么是地理空间函数?

在本模块的上一单元中,你了解了用户如何通过指定要搜索的字段(例如 DescriptionCategory)来定位酒店:

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) 运算符。 请改用 ltlegtge

由于 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 子句中使用它。