鍍金池/ 教程/ Java/ 地理距離過濾器
創(chuàng)建索引
文檔局部更新
映射
查詢與過濾條件的合并
取回階段
查詢地理形狀
相關(guān)性簡介
動態(tài)索引
處理沖突
geohash單元聚合器
主分片和復(fù)制分片如何交互
自定義分析器
下一步
過濾順序
空集群
數(shù)據(jù)吞吐
地理坐標(biāo)點
嵌套-映射
動態(tài)映射
在查詢中使用已索引的形狀
局部更新文檔
包含,而不是相等
范圍
檢索文檔
映射及分析
結(jié)語
結(jié)構(gòu)化查詢 Query DSL
驗證查詢
查找準(zhǔn)確值
Geohashes
結(jié)構(gòu)化搜索
復(fù)合核心字段類型
嵌套-集合
與Elasticsearch交互
請求體查詢
自定義動態(tài)索引
簡易搜索
索引一個文檔
地理形狀
緩存地理位置過濾器
多文檔模式
  • 1.
分布式搜索的執(zhí)行方式
安裝Elasticsearch
地理位置聚合
分析和分析器
元數(shù)據(jù):_all 字段
地理坐標(biāo)盒模型過濾器
類型和映射
合并段
查詢多個準(zhǔn)確值
嵌套-查詢
  • 1.
為什么是奇怪的格式?
Geohashes 映射
關(guān)于緩存
開始第一步
為了搜索,你懂的
分布式的特性
添加索引
確切值(Exact values) vs. 全文文本(Full text)
掃描和滾屏
相關(guān)性排序
教程小結(jié)
數(shù)據(jù)字段
增加故障轉(zhuǎn)移
按距離排序
索引管理
分布式文檔存儲
geohash單元過濾器
嵌套排序
檢索多個文檔
新建、索引和刪除文檔
Geohashes
檢索文檔
減少內(nèi)存占用
重新索引數(shù)據(jù)
檢索文檔
按距離聚合
什么是文檔?
繼續(xù)擴展
集群健康
入門
映射(mapping)
近實時搜索
地理形狀的過濾與緩存
集群內(nèi)部工作方式
應(yīng)對故障
范圍(邊界)聚合器
分析
分頁
刪除文檔
倒排索引
索引地理形狀
嵌套-對象
  • 1.
橫向擴展
查詢階段
元數(shù)據(jù):_source 字段
多索引和多類別
路由文檔到分片
索引設(shè)置
williamzhao
多值字段字符串排序
創(chuàng)建一個新文檔
配置分析器
地理形狀
更新整個文檔
面向文檔
處理 Null 值
映射地理形狀
使文本可以被搜索
索引別名和零停機時間
通過地理坐標(biāo)點過濾
地理距離過濾器
搜索——基本的工具
空搜索
搜索選項
更新時的批量操作
最重要的查詢過濾語句
結(jié)語
組合過濾
地理位置聚合
根對象
默認(rèn)映射
文檔 ID
持久化變更
檢查文檔是否存在
入門
地理坐標(biāo)點

地理距離過濾器

地理距離過濾器

地理距離過濾器geo_distance)以給定位置為圓心畫一個圓,來找出那些位置落在其中的文檔:


GET /attractions/restaurant/_search
{
  "query": {
    "filtered": {
      "filter": {
        "geo_distance": {
          "distance": "1km", <1>
          "location": { <2>
            "lat":  40.715,
            "lon": -73.988
          }
        }
      }
    }
  }
}
  • 找出所有與指定點距離在1公里(`1km`)內(nèi)的 `location` 字段。訪問 [Distance Units](http://bit.ly/1ynS64j) 查看所支持的距離表示單位

  • 中心點可以表示為字符串,數(shù)組或者(如示例中的)對象。詳見 [lat-lon-formats](/lat-lon-formats)。

地理距離過濾器計算代價昂貴。 為了優(yōu)化性能,Elasticsearch 先畫一個矩形框(邊長為2倍距離)來圍住整個圓形, 這樣就可以用消耗較少的盒模型計算方式來排除掉那些不在盒子內(nèi)(自然也不在圓形內(nèi))的文檔, 然后只對落在盒模型內(nèi)的這部分點用地理坐標(biāo)計算方式處理。

提示

你需要判斷你的使用場景,是否需要如此精確的使用圓模型來做距離過濾? 通常使用矩形模型是更高效的方式,并且往往也能滿足應(yīng)用需求。

更快的地理距離計算

兩點間的距離計算,有多種性能換精度的算法:

  • arc::

    最慢但是最精確是弧形arc)計算方式,這種方式把世界當(dāng)作是球體來處理。 不過這種方式精度還是有限,因為這個世界并不是完全的球體。

  • plane::

    平面plane)計算方式,((("plane distance calculation")))把地球當(dāng)成是平坦的。 這種方式快一些但是精度略遜;在赤道附近位置精度最好,而靠近兩極則變差。

  • sloppy_arc::

    如此命名,是因為它使用了 Lucene 的 SloppyMath 類。 這是一種用精度換取速度的計算方式,它使用 Haversine formula 來計算距離; 它比弧形arc)計算方式快4~5倍, 并且距離精度達(dá)99.9%。這也是默認(rèn)的計算方式。

你可以參考下例來指定不同的計算方式:


GET /attractions/restaurant/_search
{
  "query": {
    "filtered": {
      "filter": {
        "geo_distance": {
          "distance":      "1km",
          "distance_type": "plane", <1>
          "location": {
            "lat":  40.715,
            "lon": -73.988
          }
        }
      }
    }
  }
}
  • 使用更快但精度稍差的`平面`(`plane`)計算方式。

提示: 你的用戶真的會在意一個賓館落在指定圓形區(qū)域數(shù)米之外了嗎? 一些地理位置相關(guān)的應(yīng)用會有較高的精度要求;但大部分實際應(yīng)用場景中,使用精度較低但響應(yīng)更快的計算方式可能就挺好。

地理距離區(qū)間過濾器

地理距離過濾器geo_distance)和地理距離區(qū)間過濾器geo_distance_range)的唯一差別在于后者是一個環(huán)狀的,它會排除掉落在內(nèi)圈中的那部分文檔。

指定到中心點的距離也可以換一種表示方式: 指定一個最小距離(使用 gt或者gte)和最大距離(使用lt或者lte),就像使用區(qū)間range)過濾器一樣。


GET /attractions/restaurant/_search
{
  "query": {
    "filtered": {
      "filter": {
        "geo_distance_range": {
          "gte":    "1km", <1>
          "lt":     "2km", <1>
          "location": {
            "lat":  40.715,
            "lon": -73.988
          }
        }
      }
    }
  }
}
  • 匹配那些距離中心點超過`1公里`而小于`2公里`的位置。