弹性搜索地理点查询过滤器

时间:2016-05-03 06:54:49

标签: php codeigniter elasticsearch

我正在尝试使用geo_point作为距离,但它总是显示位置类型double而不是geo_point如何设置映射到geo_point的位置。

实际上我必须找到5km范围内的所有记录。

Id

当我尝试使用下面的查询进行搜索时,在距离德里拉特长5公里内找到结果:

 "pin" : {
             "properties" : {
             "location" : {
             "properties" : {
             "lat" : {
             "type" : "double"
             },
                 "lon" : {
                 "type" : "double"
                 }
              }
              },
                  "type" : {
                  "type" : "string"
                  }
              }
              },

它显示错误query_parsing_exception并且没有为[pin]注册查询。我无法弄清楚这个问题。它总是抛出这个异常

 {
          "query": {
            "filtered": {
              "query": {
                "match_all": {}
              },
              "filter": {
                "pin": {
                  "distance": "5",
                  "distance_unit": "km",
                  "coordinate": {
                    "lat": 28.5402707,
                    "lon": 77.2289643
                  }
                }
              }
            }
          }
        }

请帮我弄清楚这个问题。如何设置geo_point并解决此异常错误和状态400以及all_shards_failed错误

1 个答案:

答案 0 :(得分:4)

您只需要像这样映射pin类型,即使用geo_point data type

# 1. first delete your index
DELETE shouut_find_index

# 2. create a new one with the proper mapping
PUT shouut_find_index
{
  "mappings": {
    "search_shouut": {
      "properties": {
        "location": {
          "type": "geo_point"
        },
        "type": {
          "type": "string"
        }
      }
    }
  }
}

然后你可以索引像这样的文件

PUT shouut_find_index/search_shouut/1
{ 
   "location": {
      "lat": 28.5402707,
      "lon": 77.2289643
   },
   "type": "dummy"
}

最后你的查询看起来像这样

POST shouut_find_index/search_shouut/_search
{
  "query": {
    "filtered": {
      "filter": {
        "geo_distance": {
          "distance": "5km",
          "location": {
            "lat": 28.5402707,
            "lon": 77.2289643
          }
        }
      }
    }
  }
}