国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Elasticsearch計(jì)算距離,根據(jù)距離排序,地理點(diǎn)和地理多邊形范圍查找

這篇具有很好參考價(jià)值的文章主要介紹了Elasticsearch計(jì)算距離,根據(jù)距離排序,地理點(diǎn)和地理多邊形范圍查找。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Elasticsearch 計(jì)算距離,根據(jù)距離排序,地理點(diǎn)和地理多邊形范圍查找

總結(jié)

Elasticsearch 計(jì)算并返回距離一共有兩種方法:sortscript_fields

環(huán)境概述

  • CentOS 7.6
  • Elasticsearch 7.10

創(chuàng)建索引

PUT /scenic_spot
{
  "mappings": {
    "properties": {
      "id": {
        "type": "keyword"
      },
      "name": {
        "type": "text"
      },
      "pin": {
        "properties": {
          "location": {
            "type": "geo_point"
          }
        }
      }
    }
  },
  "settings": {
    "number_of_replicas": 3,
    "number_of_shards": 3
  }
}

索引數(shù)據(jù)

PUT /scenic_spot/_doc/1
{
  "id": 1,
  "name": "恭王府景區(qū)",
  "pin": {
    "location": {
      "lat": 31.007925,
      "lon": 103.607572
    }
  }
}

PUT /scenic_spot/_doc/2
{
  "id": 2,
  "name": "故宮博物院",
  "pin": {
    "location": {
      "lat": 39.917248,
      "lon": 116.397176
    }
  }
}

PUT /scenic_spot/_doc/3
{
  "id": 3,
  "name": "天壇公園",
  "pin": {
    "location": {
      "lat": 39.881265,
      "lon": 116.410638
    }
  }
}

PUT /scenic_spot/_doc/4
{
  "id": 4,
  "name": "頤和園",
  "pin": {
    "location": {
      "lat": 39.991664,
      "lon": 116.271966
    }
  }
}

PUT /scenic_spot/_doc/5
{
  "id": 5,
  "name": "八達(dá)嶺長城",
  "pin": {
    "location": {
      "lat": 40.361375,
      "lon": 116.019809
    }
  }
}

Sort 返回距離

GET /scenic_spot/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "_geo_distance": {
        "pin.location": {
          "lat": 38.912780578039346,
          "lon": 120.18819440815733
        },
        "order": "asc",
        "unit": "km"
      }
    }
  ],
  "size": 1
}

響應(yīng)結(jié)果如下,hits 下的 sort 字段就是距離,單位:km。

{
  "took" : 4,
  "timed_out" : false,
  "_shards" : {
    "total" : 3,
    "successful" : 3,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 5,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [
      {
        "_index" : "scenic_spot",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : null,
        "_source" : {
          "id" : 3,
          "name" : "天壇公園",
          "pin" : {
            "location" : {
              "lat" : 39.881265,
              "lon" : 116.410638
            }
          }
        },
        "sort" : [
          341.96155623680716
        ]
      }
    ]
  }
}

Script_fields 返回距離

GET /scenic_spot/_search
{
  "query": {
    "match_all": {}
  },
  "_source": true,
  "script_fields": {
    "distance": {
      "script": {
        "lang": "painless",
        "params": {
          "lat": 38.912780578039346,
          "lon": 120.18819440815733
        },
        "source": "doc['pin.location'].arcDistance(params.lat, params.lon)/1000"
      }
    }
  },
  "size": 1
}

5.x 以前支持:distanceInKm(lat, lon) 函數(shù),后來被廢棄?,F(xiàn)在只支持 arcDistance(lat, lon) 函數(shù):計(jì)算兩點(diǎn)距離,單位為:m。響應(yīng)結(jié)果如下,hits 下的 fields.distance 字段就是距離,單位:km。

{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 3,
    "successful" : 3,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 5,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "scenic_spot",
        "_type" : "_doc",
        "_id" : "5",
        "_score" : 1.0,
        "_source" : {
          "id" : 5,
          "name" : "八達(dá)嶺長城",
          "pin" : {
            "location" : {
              "lat" : 40.361375,
              "lon" : 116.019809
            }
          }
        },
        "fields" : {
          "distance" : [
            391.55015001577397
          ]
        }
      }
    ]
  }
}

地理點(diǎn)和地理多邊形范圍查找

Elasticsearch](https://so.csdn.net/so/search?q=Elasticsearch&spm=1001.2101.3001.7020) 是一個(gè)功能強(qiáng)大的搜索引擎,支持地理查詢,但并不是每個(gè)人都習(xí)慣于處理空間數(shù)據(jù)。 如果你對地理處理了解不多,或者想通過 Elasticsearch 了解地理處理,那么本文適合你。在我們的現(xiàn)實(shí)生活中,我們經(jīng)常使用的滴滴打車,美團(tuán)送餐,美國的 Uber, Lyft 打車,還有一些交友 apps 等等,它們都是使用 Elasticsearch 進(jìn)行位置搜索的例子。

地理距離查詢返回距離點(diǎn)最大距離的所有文檔,例如:Dolores 想認(rèn)識(shí)距離她約 300 米的所有人:

elasticsearch 計(jì)算距離,elasticsearch,搜索引擎,大數(shù)據(jù)

紅色圓圈的半徑為 300 米,我們可以看到只有 William 在圓圈內(nèi)。

讓我們來做一下 Elasticsearch 的實(shí)現(xiàn)。 首先,使用屬性 name 和 location 創(chuàng)建一個(gè) user_location 索引。

PUT user_location
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "location": {
        "type": "geo_point"
      }
    }
  }
}

location 的數(shù)據(jù)類型為 geo_point, 表示地球上的位置。 點(diǎn)具有經(jīng)度和緯度(坐標(biāo))。 你可以在官方文檔中檢查所有可接受的 geo_point 格式。

現(xiàn)在,讓我們?yōu)?William,Robert 和 Bernard 的位置創(chuàng)建文檔。我們使用 _bulk API 來導(dǎo)入數(shù)據(jù):

POST user_location/_bulk
{ "index" : { "_id" : "1" } }
{ "name" : "William", "location": "-25.443053, -49.238396" }
{ "index" : { "_id" : "2" } }
{ "name" : "Robert", "location": "-25.440173, -49.243169" }
{ "index" : { "_id" : "3" } }
{ "name" : "Bernard", "location": "-25.440262, -49.247720" }

為了說明問題的方便,我特地創(chuàng)建一個(gè)新的索引叫做 locations,它包含了 Dolores 的位置信息:

PUT locations
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "location": {
        "type": "geo_point"
      }
    }
  }
}
POST locations/_bulk
{ "index" : { "_id" : "1" } }
{ "name" : "William", "location": "-25.443053, -49.238396" }
{ "index" : { "_id" : "2" } }
{ "name" : "Robert", "location": "-25.440173, -49.243169" }
{ "index" : { "_id" : "3" } }
{ "name" : "Bernard", "location": "-25.440262, -49.247720" }
{ "index" : { "_id" : "4" } }
{ "name" : "Dolores", "location": "-25.442987, -49.239504" }

在上面的 _id 為 4 的文檔就是 Doloes 的位置信息。我們來創(chuàng)建一個(gè)叫做 locations 的索引模式:

elasticsearch 計(jì)算距離,elasticsearch,搜索引擎,大數(shù)據(jù)

我們打開 Maps 應(yīng)用:

elasticsearch 計(jì)算距離,elasticsearch,搜索引擎,大數(shù)據(jù)

elasticsearch 計(jì)算距離,elasticsearch,搜索引擎,大數(shù)據(jù)

elasticsearch 計(jì)算距離,elasticsearch,搜索引擎,大數(shù)據(jù)

elasticsearch 計(jì)算距離,elasticsearch,搜索引擎,大數(shù)據(jù)

elasticsearch 計(jì)算距離,elasticsearch,搜索引擎,大數(shù)據(jù)

elasticsearch 計(jì)算距離,elasticsearch,搜索引擎,大數(shù)據(jù)

我們發(fā)現(xiàn)這四個(gè)位置位于南美的某個(gè)地方。我們編輯 location 層的設(shè)置,當(dāng)我們點(diǎn)擊該位置的時(shí)候,顯示名字及 id。我們調(diào)整合適的 zoom 大?。?/p>

elasticsearch 計(jì)算距離,elasticsearch,搜索引擎,大數(shù)據(jù)

elasticsearch 計(jì)算距離,elasticsearch,搜索引擎,大數(shù)據(jù)

從上面的圖中,我們很清楚地看到每個(gè)人的相對的位置。離 Dolores 最近的就是 Willam,也就是那個(gè)被蓋著的那個(gè),接著就是 Robert。最遠(yuǎn)的就是 Bernard。請注意,我們上面的展示都是以 locations 這個(gè)索引來進(jìn)行展示的。它里面含有 Dolores。我們現(xiàn)在使用 user_location 索引來進(jìn)行搜索:

GET user_location/_search
{
  "query": {
    "bool": {
      "filter": {
        "geo_distance": {
          "distance": "300m",
          "location": "-25.442987, -49.239504"
        }
      }
    }
  }
}

在上面,我們針對 Dolores 來進(jìn)行搜索。顯示的結(jié)果是:

{
  "took" : 55,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.0,
    "hits" : [
      {
        "_index" : "user_location",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.0,
        "_source" : {
          "name" : "William",
          "location" : "-25.443053, -49.238396"
        }
      }
    ]
  }
}

也就是說在 Dolores 方圓 300m 之內(nèi),只有 William。如果我們把半徑增加到 600 m,那么我可以看到 Robert:

elasticsearch 計(jì)算距離,elasticsearch,搜索引擎,大數(shù)據(jù)

GET user_location/_search
{
  "query": {
    "bool": {
      "filter": {
        "geo_distance": {
          "distance": "600m",
          "location": "-25.442987, -49.239504"
        }
      }
    }
  }
}
{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 0.0,
    "hits" : [
      {
        "_index" : "user_location",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.0,
        "_source" : {
          "name" : "William",
          "location" : "-25.443053, -49.238396"
        }
      },
      {
        "_index" : "user_location",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.0,
        "_source" : {
          "name" : "Robert",
          "location" : "-25.440173, -49.243169"
        }
      }
    ]
  }
}

地理多邊形查詢可獲取多邊形內(nèi)的文檔。

“多邊形是具有直邊的封閉形狀。 矩形,三角形,六邊形和八邊形都是多邊形的例子?!?/p>

它由點(diǎn)列表表示。 兩點(diǎn)之間最接近的路徑是一條直線。 多邊形的起點(diǎn)和終點(diǎn)均相同。 在下面的圖上檢查下面的植物園多邊形。

elasticsearch 計(jì)算距離,elasticsearch,搜索引擎,大數(shù)據(jù)

請注意,Elasticsearch 上的地理查詢會(huì)檢查文檔的 geo_point 屬性是否在多邊形內(nèi)。 例:Dolores 想知道植物園內(nèi)的每個(gè)人。

elasticsearch 計(jì)算距離,elasticsearch,搜索引擎,大數(shù)據(jù)

GET user_location/_search
{
  "query": {
    "bool": {
      "filter": {
        "geo_polygon": {
          "location": {
            "points": [
              "-25.44373,-49.24248",
              "-25.44297,-49.24230",
              "-25.44177,-49.23642",
              "-25.43961,-49.23822",
              "-25.43991,-49.23781",
              "-25.44170,-49.23647",
              "-25.44210,-49.23586",
              "-25.44218,-49.23506",
              "-25.44358,-49.23491",
              "-25.44406,-49.24139",
              "-25.44373,-49.24248"
            ]
          }
        }
      }
    }
  }
}

上面的搜索返回的結(jié)果:文章來源地址http://www.zghlxwxcb.cn/news/detail-705978.html

{
  "took" : 15,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.0,
    "hits" : [
      {
        "_index" : "user_location",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.0,
        "_source" : {
          "name" : "William",
          "location" : "-25.443053, -49.238396"
        }
      }
    ]
  }
}

到了這里,關(guān)于Elasticsearch計(jì)算距離,根據(jù)距離排序,地理點(diǎn)和地理多邊形范圍查找的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 根據(jù)經(jīng)緯度計(jì)算兩點(diǎn)之間的距離

    根據(jù)經(jīng)緯度計(jì)算兩點(diǎn)之間的距離

    前言 在我們平時(shí)使用美團(tuán),餓了么等app進(jìn)行訂餐,或者使用貓眼進(jìn)行訂電影票的時(shí)候,都有一個(gè)距離的排序,表明該家店距離我們當(dāng)前的位置,這種基于地理位置的服務(wù),統(tǒng)一被稱為LBS(Location Based Service),而LBS的實(shí)現(xiàn)則是借助于GIS,WC(無線通信)等信息技術(shù)來實(shí)現(xiàn)。而今

    2024年02月05日
    瀏覽(62)
  • 根據(jù)經(jīng)緯度計(jì)算地球上兩點(diǎn)之間的距離——Haversine公式介紹及計(jì)算步驟

    根據(jù)經(jīng)緯度計(jì)算地球上兩點(diǎn)之間的距離——Haversine公式介紹及計(jì)算步驟

    目錄 摘要 1.半正矢公式(Haversine Formula)介紹 2.半正矢公式應(yīng)用 3.半正矢公式計(jì)算 3.1 主要思路 3.2 計(jì)算步驟 3.2.1 平面向量計(jì)算方法 3.2.2 空間向量計(jì)算方法 寫本文的出發(fā)點(diǎn)是需要在Qlik中根據(jù)經(jīng)緯度計(jì)算地球上兩點(diǎn)間的距離。我在社區(qū)上搜到了相關(guān)公式的分享,這個(gè)公式叫做

    2023年04月10日
    瀏覽(18)
  • ElasticSearch DSL語句(bool查詢、算分控制、地理查詢、排序、分頁、高亮等)

    ElasticSearch DSL語句(bool查詢、算分控制、地理查詢、排序、分頁、高亮等)

    查詢所有:查詢所有數(shù)據(jù),一般在測試時(shí)使用。march_all,但是一般顯示全部,有一個(gè)分頁的功能 全文檢索(full text)查詢:利用分詞器對用戶的輸入內(nèi)容進(jìn)行分詞,然后去倒排索引庫匹配。例如: match_query mutil_match_query 精確查詢:根據(jù)精確詞條值查詢數(shù)據(jù),一般查找的時(shí)k

    2024年02月12日
    瀏覽(23)
  • Elasticsearch 地理空間計(jì)算

    Elasticsearch 地理空間計(jì)算

    ? 地理位1置搜索:使用查詢API進(jìn)行搜索 1、Geo Distance Query Geo Distance Query是在給定的距離范圍內(nèi)搜索數(shù)據(jù)的查詢。例如,可以搜索給定地理位置附近指定距離內(nèi)的所有文檔。 2、?Geo Bounding Box Query Geo Bounding Box Query是一種以四邊形形式搜索地理坐標(biāo)數(shù)據(jù)的查詢。它可以定義頂點(diǎn)

    2024年02月12日
    瀏覽(28)
  • ElasticSearch如何使用以及java代碼如何查詢并排序ES中的數(shù)據(jù)(距離排序)

    ElasticSearch如何使用以及java代碼如何查詢并排序ES中的數(shù)據(jù)(距離排序)

    import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.geo.GeoDistance; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.TransportAddress; import org.elasticsearch.common.unit.DistanceUnit; import org.elasticsearch.common.unit.

    2024年04月12日
    瀏覽(25)
  • uniapp微信小程序,根據(jù)用戶當(dāng)前位置計(jì)算用戶到附近機(jī)構(gòu)/商店的距離

    1、首先要弄清楚后端傳過來的經(jīng)緯度是屬于哪一類,一共有三大類,分別是:WGS84,GCJ02,BD09 WGS84:為一種大地坐標(biāo)系,也是目前廣泛使用的GPS全球衛(wèi)星定位系統(tǒng)使用的坐標(biāo)系。 GCJ02:又稱火星坐標(biāo)系,是由中國國家測繪局制定的地理坐標(biāo)系統(tǒng),是由WGS84加密后得到的坐標(biāo)系

    2024年02月15日
    瀏覽(82)
  • 空間分析實(shí)戰(zhàn)指南:點(diǎn)到多邊形的最短距離

    在我們最近的項(xiàng)目中,出現(xiàn)了一個(gè)新的需求:需要驗(yàn)證現(xiàn)場拍攝的照片的經(jīng)緯度與實(shí)際地塊之間的最短距離,以確保業(yè)務(wù)員在地塊的一公里范圍內(nèi)進(jìn)行拍照。 實(shí)現(xiàn)這個(gè)功能有兩種方式,一種是在前臺(tái)APP中校驗(yàn),一種是在后臺(tái)進(jìn)行校驗(yàn),接下來我會(huì)分別介紹這兩種方式。 在我

    2024年02月13日
    瀏覽(22)
  • matlab做經(jīng)濟(jì)地理、地理距離、經(jīng)濟(jì)距離空間權(quán)重矩陣

    matlab做經(jīng)濟(jì)地理、地理距離、經(jīng)濟(jì)距離空間權(quán)重矩陣

    首先講下地理加權(quán)空間權(quán)重矩陣: 該矩陣的經(jīng)濟(jì)含義是通過不同點(diǎn)的坐標(biāo)系之間的距離遠(yuǎn)近來衡量兩地之間的關(guān)系重要程度,當(dāng)兩點(diǎn)之間距離較遠(yuǎn),所占的權(quán)重越低,而距離越近,權(quán)重越高。故操作如下: 首先需要導(dǎo)入坐標(biāo)數(shù)據(jù): A=csvread(\\\'JWD.csv\\\',1,0); % JWD.csv是文件名,csvrea

    2023年04月12日
    瀏覽(24)
  • 285個(gè)地級市空間權(quán)重矩陣(空間鄰接、地理距離、經(jīng)濟(jì)距離、經(jīng)濟(jì)地理嵌套矩陣)

    285個(gè)地級市空間權(quán)重矩陣(空間鄰接、地理距離、經(jīng)濟(jì)距離、經(jīng)濟(jì)地理嵌套矩陣)

    285個(gè)地級市空間權(quán)重矩陣(空間鄰接、地理距離、經(jīng)濟(jì)距離、經(jīng)濟(jì)地理嵌套矩陣) 1、范圍:285個(gè)地級市 2、數(shù)據(jù)包括:包括空間鄰接矩陣、空間地理距離矩陣、空間經(jīng)濟(jì)距離矩陣、空間經(jīng)濟(jì)地理嵌套矩陣 其中空間經(jīng)濟(jì)距離矩陣根據(jù)2003-2019年人均GDP得到 3、指標(biāo)說明: 空間權(quán)

    2024年02月16日
    瀏覽(18)
  • mysql如何實(shí)現(xiàn)根據(jù)經(jīng)緯度判斷某一個(gè)坐標(biāo)是否在一個(gè)多邊形區(qū)域范圍內(nèi)

    mysql如何實(shí)現(xiàn)根據(jù)經(jīng)緯度判斷某一個(gè)坐標(biāo)是否在一個(gè)多邊形區(qū)域范圍內(nèi)

    要根據(jù)經(jīng)緯度判斷一個(gè)坐標(biāo)是否在一個(gè)多邊形區(qū)域內(nèi),MySQL提供了幾種函數(shù)來處理地理空間數(shù)據(jù),其中包括用于處理多邊形區(qū)域的函數(shù)。 首先,創(chuàng)建一個(gè)表來存儲(chǔ)多邊形區(qū)域。可以使用 ST_GeomFromText 函數(shù)將多邊形的坐標(biāo)轉(zhuǎn)換為地理空間對象。我們給他插入兩條數(shù)據(jù),默認(rèn)id第一

    2024年02月08日
    瀏覽(135)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包