• 地理坐标盒模型过滤器
    • 优化盒模型

    地理坐标盒模型过滤器

    这是目前为止最有效的 地理坐标过滤器了,因为它计算起来非常简单。
    你指定一个矩形的 顶部top), 底部bottom), 左边界left), 和 右边界right),
    然后它只需判断坐标的经度是否在左右边界之间,纬度是否在上下边界之间。(译注:原文似乎写反了)

    1. GET /attractions/restaurant/_search
    2. {
    3. "query": {
    4. "filtered": {
    5. "filter": {
    6. "geo_bounding_box": {
    7. "location": { <1>
    8. "top_left": {
    9. "lat": 40.8,
    10. "lon": -74.0
    11. },
    12. "bottom_right": {
    13. "lat": 40.7,
    14. "lon": -73.0
    15. }
    16. }
    17. }
    18. }
    19. }
    20. }
    21. }
    • <1> 盒模型信息也可以用 bottom_left(左下方点)和 top_right(右上方点) 来表示。

    优化盒模型

    地理坐标盒模型过滤器不需要把所有坐标点都加载到内存里。
    因为它要做的只是简单判断 纬度经度 坐标数值是否在给定的范围内,所以它可以用倒排索引来做一个范围(range)过滤。

    要使用这种优化方式,需要把 geo_point 字段用 纬度lat)和经度lon)方式表示并分别索引。

    1. PUT /attractions
    2. {
    3. "mappings": {
    4. "restaurant": {
    5. "properties": {
    6. "name": {
    7. "type": "string"
    8. },
    9. "location": {
    10. "type": "geo_point",
    11. "lat_lon": true <1>
    12. }
    13. }
    14. }
    15. }
    16. }
    • <1> location.latlocation.lon 字段将被分别索引。它们可以被用于检索,但是不会在检索结果中返回。

    然后,查询时你需要告诉 Elasticesearch 使用已索引的 latlon

    1. GET /attractions/restaurant/_search
    2. {
    3. "query": {
    4. "filtered": {
    5. "filter": {
    6. "geo_bounding_box": {
    7. "type": "indexed", <1>
    8. "location": {
    9. "top_left": {
    10. "lat": 40.8,
    11. "lon": -74.0
    12. },
    13. "bottom_right": {
    14. "lat": 40.7,
    15. "lon": -73.0
    16. }
    17. }
    18. }
    19. }
    20. }
    21. }
    22. }
    • <1> 设置 type 参数为 indexed (默认为 memory) 来明确告诉 Elasticsearch 对这个过滤器使用倒排索引。

    注意:

    geo_point 类型可以包含多个地理坐标点,但是针对经度纬度分别索引的这种优化方式(lat_lon)只对单个坐标点的方式有效。