# 地理搜索
Typesense 支持对包含经纬度值的字段进行地理搜索,这些字段需指定为 geopoint
或 geopoint[]
字段类型。
让我们创建一个名为 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
指标作为并列打破条件,对每个区间内的结果进行排序。