Flutter中如何基于地理位置过滤Algolia搜索结果?
问题描述
在Flutter项目中使用Algolia包实现了搜索功能,但不知道如何基于地理位置过滤搜索结果,希望只显示距离指定经纬度50公里范围内的内容。
当前索引配置:已将location字段设置为Geopoint类型(用于存储经纬度数据)。
现有需要修改的函数代码:
Future<List<T>> getItems<T>( {required String index, required String locality, required T Function(Map<String, dynamic> data, String documentId) builder, required String searchValue}) async { final result = algolia.instance.index(index).query(searchValue).setHitsPerPage(10); final filtered = result.filters('//How to write a filter here?'); final snap = await filtered.getObjects(); return snap.hits .map((snapshot) => builder(snapshot.data, snapshot.objectID)) .where((value) => value != null) .toList(); }
解决方案
Algolia提供了专门的地理范围搜索API,无需通过普通filters实现,直接使用setAroundLatLng和setAroundRadius方法即可完成需求:
1. 调整函数参数与核心逻辑
- 添加目标经纬度参数,用于指定搜索中心点
- 调用Algolia地理搜索方法设置半径与中心点
- 若你的地理字段不是Algolia默认的
_geoloc(此处为location),需额外指定字段名
修改后的完整代码:
Future<List<T>> getItems<T>( {required String index, required String locality, required double targetLat, // 新增:目标位置纬度 required double targetLng, // 新增:目标位置经度 required T Function(Map<String, dynamic> data, String documentId) builder, required String searchValue}) async { final result = algolia.instance .index(index) .query(searchValue) .setHitsPerPage(10) // 设置搜索中心点:格式为"纬度,经度" .setAroundLatLng('$targetLat,$targetLng') // 设置搜索半径:50公里 = 50000米 .setAroundRadius(50000) // 指定自定义地理字段名(你的索引中是location) .setAroundLatLngVia('location'); // 若需结合其他过滤条件,可继续链式调用filters,例如: // .filters('locality:"$locality"'); final snap = await result.getObjects(); return snap.hits .map((snapshot) => builder(snapshot.data, snapshot.objectID)) .where((value) => value != null) .toList(); }
关键说明
setAroundRadius接收米为单位的数值,50公里对应50000米setAroundLatLngVia用于指定索引中存储地理数据的字段名,必须与你配置的location字段一致- 如果需要同时过滤其他业务字段,可继续添加
filters方法组合条件
内容的提问来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

