# 地理搜索

Typesense 支持对包含经纬度值的字段进行地理搜索,这些字段需指定为 geopointgeopoint[] 字段类型

让我们创建一个名为 places 的集合,其中包含一个 geopoint 类型的 location 字段。

现在让我们索引一个文档。

注意

请确保坐标顺序正确:[纬度, 经度]。GeoJSON 通常使用 [经度, 纬度] 的顺序,这在 Typesense 中是无效的!

# 半径范围内搜索

现在我们可以使用 filter_by 搜索参数来搜索给定经纬度坐标特定半径范围内的地点(使用 mi 表示英里,km 表示公里)。

此外,我们还可以对距离某个位置最近的记录进行排序(这个位置可以与过滤使用的经纬度坐标相同或不同)。

示例响应

上例使用了"5.1 km"作为半径,但你也可以使用英里单位,例如: location:(48.90615915923891, 2.3435897727061175, 2 mi)

# 在 Geo 多边形内搜索

你还可以筛选位于任意形状多边形内的文档。

需要将多边形的各个顶点坐标指定为纬度、经度对。

'filter_by' : 'location:(48.8662, 2.3255, 48.8581, 2.3209, 48.8561, 2.3448, 48.8641, 2.3469)'

# 地理多边形

你也可以使用 geopolygon 字段类型存储多边形地理区域,然后检查点是否位于这些区域内。

# 创建包含地理多边形的集合

让我们创建一个包含多边形区域字段的集合:

# 添加多边形区域

通过按逆时针(CCW)或顺时针(CW)顺序指定坐标来添加包含多边形区域的文档:

注意

坐标必须按正确的CCW或CW顺序指定才能形成有效的多边形。错误的顺序将导致错误。

# 在多边形中搜索点

您可以搜索多边形区域包含特定点的文档:

这将返回所有包含点(0.5, 0.5)的多边形。

示例响应

# 在半径范围内按附加属性排序

# exclude_radius(排除半径)

有时,我们需要对半径范围内的附近地点根据另一个属性(如 popularity)进行排序,然后在半径范围外按距离排序。这时可以使用 exclude_radius 选项。

'sort_by' : 'location(48.853, 2.344, exclude_radius: 2mi):asc, popularity:desc'

这会使 2 英里半径范围内的所有文档在距离值上"并列"。为了打破这种并列,这些记录将按照列表中的下一个字段 popularity:desc 进行排序。而 2 英里半径范围外的记录则像往常一样,先按距离排序,再按 popularity:desc 排序。

# precision(精度)

类似地,你可以使用 precision 参数将所有地理点分到不同的"组"中,这样同一组内的所有结果将具有相同的"地理距离分数"。

'sort_by' : 'location(48.853, 2.344, precision: 2mi):asc, popularity:desc'

这将把结果分到 2 英里为一组的区间中,并强制每个区间内的记录在"地理分数"上并列,从而可以使用 popularity 指标作为并列打破条件,对每个区间内的结果进行排序。