You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:51:04