使用Elasticsearch进行地理搜索

时间:2014-09-03 19:30:48

标签: php elasticsearch

这只是一个简单的问题。我打算将我的搜索系统更改为elasticsearch。如果我在请求中发送elasticsearch三条信息:

  • 纬度
  • 距离

我的弹性搜索结果标有以下信息:

  • 纬度

我是否可以仅在该距离内返回结果而无需任何额外的弹性搜索插件?这个功能是否内置于elasticsearch?

1 个答案:

答案 0 :(得分:1)

是的,通过三个非常简单的步骤。您必须映射数据(如设置数据库模式),插入数据,然后搜索它(过滤器)。

您必须正确映射该字段,以便将其识别为geo_point。注意:如果您希望更灵活地存储其他类型的地理位置(例如,多边形或线串),那么您可能希望将其映射为geo_shape

{
  "mappings" : {
    "TYPE_NAME" : {
      "properties" : {
        "fieldName" : { "type" : "geo_point" }
      }
    }
  }
}

映射后,您可以使用point type插入位置详细信息。

{
  "fieldName" : {
    "type" : "point",
    "coordinates" : [ longitude, latitude ]
  }
}

你可以用不同的方式输入它来获得相同的效果,但也许更直观(而不是[X,Y],这不是最常见的地理空间顺序)。

{
  "fieldName" : {
    "type" : "point",
    "coordinates" : {
      "lat" : latitude,
      "lon" : longitude
    }
  }
}

无论哪种方式,它都代表相同的东西(在过滤器中同样如此)。

映射字段并开始插入点后,您可以运行geo_distance filter来查找所需distance内的点:

{
  "filtered" : {
    "query" : { "match_all" : {} },
    "filter" : {
      "geo_distance" : {
        "distance" : "10mi",
        "fieldName" : [ longitude, latitude ]
      }
    }
  }
}