使用geo_distance过滤器不会使用ElasticSearch返回任何匹配

时间:2016-07-20 17:03:22

标签: elasticsearch geolocation

我无法让我的过滤器查询与geo_distance一起正常工作。它似乎返回0次点击。但是,如果我不想找到地理位置,那么我的所有其他查询都会起作用。

我正在使用ElasticSearch的2.3.1版

{
  "name" : "Mar-Vell",
  "cluster_name" : "elastic-logs",
  "version" : {
    "number" : "2.3.1",
    "build_hash" : "bd980929010aef404e7cb0843e61d0665269fc39",
    "build_timestamp" : "2016-04-04T12:25:05Z",
    "build_snapshot" : false,
    "lucene_version" : "5.5.0"
  },
  "tagline" : "You Know, for Search"
}

我通过使用json发出请求,将我的位置键映射到一种“geo_point”:

curl -XPUT 'http://10.0.7.181:9200/connections/profile/_mapping' -d '
{

      "profile" : {
         "properties" : {
            "location" : {
               "type" : "geo_point"
            }
         }
      }
}

然后它返回。我假设我的改变有效。

{"acknowledged":true}

以下是我的数据示例

  {
    "_index": "connections",
    "_type": "profile",
    "_id": "92",
    "_score": 1,
    "_source": {
      "profile": {
        "location": {
          "lon": -111.8909815,
          "lat": 40.7607818
        },
        "age": 44,
        "school": {
          "undergraduate": {
            "universityId": 1814,
            "active": true,
            "programId": 9
          },
          "graduate": {
            "universityId": 1814,
            "active": true,
            "programId": 7
          }
        },
        "bio": "Everything is awesome! "
      },
      "id": 0,
      "active": false,
      "optIn": true
    }
  }

我的查询是我发送给我们的ElasticSearch。没什么了不起的。

{
   "filter" : {
      "geo_distance" : {
         "distance" : "1000mi",
         "distance_type": "plane",
         "location" : {
          "lon": -111.8391029,
          "lat": 40.7607818
         }
      }
   },
   "query" : {
      "match_all" : {}
   }
}

我尝试将距离改为1英里,100英里和1000英里。它应该返回100英里但没有显示的东西。我也试过使用不同的单位测量,看它是否会做任何事情。同样的交易。

坐标位于盐湖城。经度和纬度的顺序应该是正确的。我不确定我还应该尝试什么。

2 个答案:

答案 0 :(得分:1)

您的位置字段名称为location,但在您的查询中,您使用geoPoint作为字段名称。试试这个:

{
   "filter" : {
      "geo_distance" : {
         "distance" : "1000mi",
         "distance_type": "plane",
         "location" : {
          "lon": -111.8391029,
          "lat": 40.7607818
         }
      }
   },
   "query" : {
      "match_all" : {}
   }
}

更新:好的,这是我看到的明显错误所以我没有再看了。以下是我的一个项目的工作查询(包含您的值):

{
  "query": {
    "bool": {
      "must": {
        "match_all": []
      },
      "filter": {
        "geo_distance": {
          "distance": "1000mi",
          "distance_type": "plane",
          "location": {
            "lat": "-111.8391029",
            "lon": "40.7607818"
          }
        }
      }
    }
  }
}

这应该有效。

答案 1 :(得分:0)

@Pelmered感谢您帮助我进行过滤查询。我发现我的映射操作不正确。现在一切都按预期工作。因此,请确保您正确映射它。

curl -XPUT 'http://10.0.7.181:9200/connections' -d '

{
   "mappings":{
      "profile":{
         "properties":{
            "location":{
               "type":"geo_point"
            }
         }
      }
   }
}'