在嵌套字段上应用地理距离过滤器

时间:2014-07-14 18:15:38

标签: elasticsearch

我的映射包含一个嵌套字段,如下所示:

"Locations": {
  "type": "nested",
  "properties": {
    "Name": {
      "type": "string"
    },
    "GeoPoint": {
      "type": "geo_point"
    }
  }
}

所以基本上我要做的是在文档的每个位置存储一些额外的属性。

不幸的是,看起来这不适用于geo distance filter

GET /myIndex/myType/_search
{
  "filter": {
    "geo_distance": {
      "distance": "100 mi",
      "Locations.GeoPoint": {
        lat: 40.70,
        lon: -74.00
      }
    }
  }
}

不会返回任何结果,而如果GeoPoint直接在文档本身而不是嵌套字段上,则过滤器可以正常工作:

GET /myIndex/myType/_search
{
  "filter": {
    "geo_distance": {
      "distance": "100 mi",
      "GeoPoint": {
        lat: 40.70,
        lon: -74.00
      }
    }
  }
}

有没有办法让geo distance过滤器在嵌套字段上使用geo_point?

2 个答案:

答案 0 :(得分:4)

nested filter完成工作:

GET /myIndex/myType/_search
{
  "filter" : {
    "nested" : {
      "path" : "Locations",
      "filter" : {
        "geo_distance": {
          "distance": "100 mi",
          "GeoPoint": {
            "lat": 40.70,
            "lon": -74.00
          }
        }
      }
    }
  }
}

答案 1 :(得分:0)

对于ElasticSearch 5.5用户的更新,@ Max的答案已经不再使用点符号而不是显式包装"嵌套"查询周围的字段。

例如:

{
    "query": {
        "nested" : {
            "path" : "obj1",
            "score_mode" : "avg",
            "query" : {
                "bool" : {
                    "must" : [
                    { "match" : {"obj1.name" : "blue"} },
                    { "range" : {"obj1.count" : {"gt" : 5}} }
                    ]
                }
            }
        }
    }
}

更多信息:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-nested-filter.html