具有地理距离的ElasticSearch过滤

时间:2015-01-09 17:48:36

标签: search elasticsearch

我尝试使用地理距离和字段过滤数据,例如' has_cctv'或者' has_instant_bookings'。

{
  "query" : {
    "filtered" : {
      "filter" : {
        "geo_distance": {
          "distance": 10000,
          "lat_lng": {
            "lat": "51.5073509",
            "lon": "-0.1277583"
          }
        }
      }
    }
  }
}

我尝试了多种使用术语过滤的组合,但似乎无法解决过去的错误。例如:

{
  "query" : {
    "filtered" : {
      "filter" : {
        "terms": [
          {"term": {"has_cctv": 1}}
        ],
        "geo_distance": {
          "distance": 10000,
          "lat_lng": {
            "lat": "51.5073509",
            "lon": "-0.1277583"
          }
        }
      }
    }
  }
}

这使我' [terms]过滤器不支持查找元素中的[has_cctv]'。这可能是我的查询有问题,还是数据存储方式有问题?

3 个答案:

答案 0 :(得分:2)

或者您可以使用and过滤器并将两个过滤器组合在一起。以及bool filterand/or/not filters之间的比较:http://www.elasticsearch.org/blog/all-about-elasticsearch-filter-bitsets/

{
  "query": {
    "filtered": {
      "filter": {
        "and": {
          "filters": [
            {
              "term": {
                "has_cctv": "1"
              }
            },
            {
              "geo_distance": {
                "distance": 10000,
                "lat_lng": {
                  "lat": "51.5073509",
                  "lon": "-0.1277583"
                }
              }
            }
          ]
        }
      }
    }
  }
}

答案 1 :(得分:2)

这是正确的查询:

POST _search
{
   "query": {
      "filtered": {
         "query": {
            "term": {
               "has_cctv": {
                  "value": 1
               }
            }
         },
         "filter": {
            "geo_distance": {
               "distance": 10000,
               "lat_lng": {
                  "lat": "51.5073509",
                  "lon": "-0.1277583"
               }
            }
         }
      }
   }
}

确保lat_lng存储为geo_point

由于 Bharvi

答案 2 :(得分:1)

两个错误。

由于您有多个过滤器,因此需要添加bool filter并将每个过滤器放在must子句中。 那么您不需要terms过滤器,而是term过滤器。