elasticsearch 经纬度查询

curl -XPUT "http://localhost:9200/shop/" -d '{
  "mappings": {
    "shop": {
      "properties": {
        "name": {
          "type": "string"
        },
        "location": {
          "type": "geo_point",//经纬度类型
"lat_lon": true,
"fielddata": {
      "format":    "compressed", //压缩模式,节省内存
      "precision": "3m"
    }
        }
      }
    }
  }
}';

curl -XPUT http://localhost:9200/shop/shop/1 -d'
{"name": "北京", "location" : "39.9047253699,116.4072154982"}
';

curl -XPUT http://localhost:9200/shop/shop/2 -d'
{"name": "顺义", "location" : "40.1299127031,116.6569478577"}
';

curl -XPUT http://localhost:9200/shop/shop/3 -d'
{"name": "天津", "location" : "39.0850853357,117.1993482089"}
';

curl -XPUT http://localhost:9200/shop/shop/4 -d'
{"name": "上海", "location" : "31.2304324029,121.4737919321"}
';

curl -XGET "http://localhost:9200/shop/shop/_search?pretty" -d '{
  "query": {
    "filtered": {
      "filter": {
        "geo_distance": {
          "distance": "28km",
  "type":    "indexed",
  "distance_type": "sloppy_arc",
          "location": { 
            "lat":  39.9682060617,
            "lon":  116.4107280170
          }
        }
      }
    }
  },
  "sort": [     //按距离排序
    {
      "_geo_distance": {
        "location": { 
          "lat":  39.9682060617,
          "lon":  116.4107280170
        },
        "order":         "asc",
        "unit":          "km", 
        "distance_type": "sloppy_arc" //推荐适应此模式 plane 不准,精度太差
      }
    }
  ]
}'

再举一个更加实际的例子

curl -XGET "http://localhost:9200/shop/shop/_search?pretty" -d '{
  "query" : {
    "function_score" : {
      "query" : {
        "bool" : {
          "filter" : {
"geo_distance": {
"distance": "28km",
"type":    "indexed",
"distance_type": "sloppy_arc",
"location": { 
            "lat":  39.9682060617,
            "lon":  116.4107280170
}
}
          }
        }
      },
      "functions" : [ {
        "script_score" : {
          "script" : {
            "inline" : "return 0"
          }
        }
      },{
     "gauss": {   //按举例远近打分
                  "location": {
                     "origin": "39.9682060617,116.4107280170",
                     "scale": "5km",
                     "offset": "0",
                     "decay": 0.5
                  }
               },
               "weight": "1"
      } ],
      "score_mode" : "sum",
      "boost_mode" : "replace"
    }
  }
}'

此时你会看到北京的得分是0.25分,因为差5公里,衰减0.5, 北京距此坐标7公里,所以取值0.25.

时间: 2024-10-02 19:43:17

elasticsearch 经纬度查询的相关文章

基于百度地图SDK和Elasticsearch GEO查询的地理围栏分析系统(1)

本文描述了一个系统,功能是评价和抽象地理围栏(Geo-fencing),以及监控和分析核心地理围栏中业务的表现. 技术栈:Spring-JQuery-百度地图WEB SDK 存储:Hive-Elasticsearch-MySQL-Redis 什么是地理围栏? LBS系统中,地理围栏指的是虚拟边界围成的部分. tips:这只是一个demo,支撑实习生的本科毕设,不代表生产环境,而且数据已经做了脱密处理,为了安全还是隐去了所有数据. 功能描述 1.地理围栏的圈选 (1)热力图 热力图展示的是,北京市

根据经纬度查询附近企业 | SQL

--第一种 SELECT ent_id, ent_name, longitude, latitude, ROUND( 6378.138 * 2 * ASIN( SQRT( POW( SIN( ( 40.042307 * PI() / 180 - latitude * PI() / 180 ) / 2 ), 2 ) + COS(40.042307 * PI() / 180) * COS(latitude * PI() / 180) * POW( SIN( ( 116.317205 * PI() /

根据经纬度查询当前地点,百度google接口

<?php /** 百度 API   -----根据经纬度查询当前地点  **/      header("Content-Type: text/html; charset=UTF-8");    function getBaiduAPIAddress($lat,$lng){  //纬度,经度        $location = $lat.','.$lng;          $url = 'http://api.map.baidu.com/geocoder/v2/?locat

根据经纬度查询附近的点

大致思想:根据给定经纬度(lat,lng)求出其左上角(left_top),右上角(right_top),左下角(left_bottom),右下角(right_bottom)的四个位置.所有在这个区域的范围都在该点附近.参照:http://blog.charlee.li/location-search/ package com.show.common.util; public class Location { private double latitude; private double lon

百度地图经纬度查询-ABCDEFGHIJKMHNOPQRSTUVWXYZ

百度地图经纬度查询-ABCDEFGHIJKMHNOPQRSTUVWXYZ: 搜索:<input type="text" size="20" name="keyword" id="keyword" /> <input type="submit" value="提交" onclick="MblogDotccMap(document.getElementById('

根据经纬度查询最近距离,mysql查询经纬度附近范围

public class Test{ private static List<LocalAddress> ilist = new ArrayList<LocalAddress>(); public static void main(String[] args) { Test test3 = new Test(); Double localDouble = 0.0; //定义一个二维数组存放经纬度 Double[][] doubles = { { 22.6036906766, 113

Elasticsearch 连接查询

在一般的关系型数据库中,都支持连接操作. 在ES这种分布式方案中进行连接操作,代价是十分昂贵的. 不过ES也提供了相类似的操作,支持水平任意扩展,实现连接的效果. 其他内容,参考Elasticsearch官方指南整理 ES中的连接 在ES中支持两种连接方式:嵌套查询 和 has_child.has_parent父子查询 嵌套查询: 文档中包含嵌套的字段,这些字段以数组的形式保存对象,这样每个嵌套的子对象都可以被搜索. has_child.has_parent父子查询: 父子文档是存储在同一个索引

分布式搜索引擎Elasticsearch的查询与过滤

一.写入 先来一个简单的官方例子,插入的参数为 -XPUT ,插入一条记录. curl -XPUT'http://localhost:9200/test/users/1' -d'{ "user": "test", "post_date": "2009-11-15T14:12:12", "message": "Elastic Search" }' { "_index":

[Elasticsearch] 过滤查询以及聚合(Filtering Queries and Aggregations)

本章翻译自Elasticsearch官方指南的Filtering Queries and Aggregations一章. 过滤查询以及聚合 A natural extension to aggregation scoping is filtering. Because the aggregation operates in the context of the query scope, any filter applied to the query will also apply to the