具有地理距离的 ElasticSearch 过滤

ElasticSearch filtering with geo distance

我正在尝试使用地理距离和 '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]”。这可能是我的查询有问题,还是数据存储方式有问题?

两个错误。

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

或者您可以使用 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"
                }
              }
            }
          ]
        }
      }
    }
  }
}

正确的查询如下:

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

谢谢 巴尔维