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

Elasticsearch动态距离筛选查询需求及扩展场景咨询

Elasticsearch 动态距离筛选解决方案

基础需求:按文档自身最大距离筛选

直接使用Painless脚本过滤器,计算目标位置与文档location的距离,再与文档的maxDistanceInKm比较:

GET /your_index/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "script": {
            "source": """
              double distance = doc['location'].arcDistance(params.target_lat, params.target_lon) / 1000;
              return distance < doc['maxDistanceInKm'].value;
            """,
            "params": {
              "target_lat": 14.5, // 替换为传入的目标纬度
              "target_lon": 60.5   // 替换为传入的目标经度
            },
            "cache": true // 开启脚本缓存提升性能
          }
        }
        // 这里可添加你已有的其他筛选条件
      ]
    }
  }
}

说明:

  • arcDistance方法返回米为单位的距离,除以1000转为千米,与文档的maxDistanceInKm单位匹配
  • 确保location字段是geo_point类型,否则无法调用地理距离计算方法

扩展需求:取文档最大距离与传入值的最小值筛选

修改脚本,通过Math.min()获取两个值的最小值,再进行距离比较:

GET /your_index/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "script": {
            "source": """
              double distance = doc['location'].arcDistance(params.target_lat, params.target_lon) / 1000;
              double allowedDistance = Math.min(doc['maxDistanceInKm'].value, params.alternateMaxDistance);
              return distance < allowedDistance;
            """,
            "params": {
              "target_lat": 14.5,
              "target_lon": 60.5,
              "alternateMaxDistance": 30 // 替换为传入的替代最大距离
            },
            "cache": true
          }
        }
        // 其他筛选条件
      ]
    }
  }
}

注意事项

  • 若索引数据量极大,脚本筛选的性能会略低于原生地理查询,但因每个文档的允许距离动态变化,这是唯一可行的方案
  • 提前确认maxDistanceInKm字段为数值类型,避免脚本类型转换错误

内容的提问来源于stack exchange,提问作者Julien O

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 19:38:31