苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

分布式系统框架(V1.3) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper万能框架(V2.3-含.netcore) HttpHelper官方出品,无敌框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 最牛的爬虫类,没有爬不到只有想不到 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 378|回复: 3

[搜索引擎] 43-Elasticsearch 地理距离聚合

[复制链接]
发表于 2019-1-8 08:57:19 | 显示全部楼层 |阅读模式
geo_distance 聚合 对一些搜索非常有用,例如找到所有距离我 1km 以内的披萨店。搜索结果应该也的确被限制在用户指定 1km 范围内,但是我们可以添加在 2km 范围内找到的其他结果:
[C#] 纯文本查看 复制代码
GET /attractions/restaurant/_search

{

  "query": {

    "bool": {

      "must": {

        "match": { 

          "name": "pizza"

        }

      },

      "filter": {

        "geo_bounding_box": {

          "location": { 

            "top_left": {

              "lat":  40.8,

              "lon": -74.1

            },

            "bottom_right": {

              "lat":  40.4,

              "lon": -73.7

            }

          }

        }

      }

    }

  },

  "aggs": {

    "per_ring": {

      "geo_distance": { 

        "field":    "location",

        "unit":     "km",

        "origin": {

          "lat":    40.712,

          "lon":   -73.988

        },

        "ranges": [

          { "from": 0, "to": 1 },

          { "from": 1, "to": 2 }

        ]

      }

    }

  },

  "post_filter": { 

    "geo_distance": {

      "distance":   "1km",

      "location": {

        "lat":      40.712,

        "lon":     -73.988

      }

    }

  }

}



  • 主查询查找名称中含有 pizza 的饭店。
  • geo_bounding_box 筛选那些只在纽约区域的结果。
  • geo_distance 聚合统计距离用户 1km 以内,1km 到 2km 的结果的数量。
  • 最后,post_filter 将结果缩小至那些在用户 1km 范围内的饭店。

前面的请求 响应如下:
[C#] 纯文本查看 复制代码
"hits": {

  "total":     1,

  "max_score": 0.15342641,

  "hits": [ 

     {

        "_index": "attractions",

        "_type":  "restaurant",

        "_id":    "3",

        "_score": 0.15342641,

        "_source": {

           "name": "Mini Munchies Pizza",

           "location": [

              -73.983,

              40.719

           ]

        }

     }

  ]

},

"aggregations": {

  "per_ring": { 

     "buckets": [

        {

           "key":       "*-1.0",

           "from":      0,

           "to":        1,

           "doc_count": 1

        },

        {

           "key":       "1.0-2.0",

           "from":      1,

           "to":        2,

           "doc_count": 1

        }

     ]

  }

}



  • post_filter 已经将搜索结果缩小至仅在用户 1km 范围以内的披萨店。
  • 聚合包括搜索结果加上其他在用户 2km 范围以内的披萨店。

在这个例子中,我们计算了落在每个同心环内的饭店数量。当然,我们可以在 per_rings 聚合下面嵌套子聚合来计算每个环的平均价格、最受欢迎程度,等等。

发表于 2019-1-8 09:38:55 | 显示全部楼层
发表于 2019-1-8 16:41:43 | 显示全部楼层
发表于 2019-1-9 14:49:09 | 显示全部楼层
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备17001017号-1)

GMT+8, 2019-9-17 10:42

© 2017-2018

快速回复 返回顶部 返回列表