elasticsearch,Search,elasticsearch" /> elasticsearch,Search,elasticsearch" />

Search 基于地理距离的弹性搜索滤波

Search 基于地理距离的弹性搜索滤波,search,elasticsearch,Search,elasticsearch,我试图用地理距离和字段过滤数据,如“has_cctv”或“has_instant_bookings” { "query" : { "filtered" : { "filter" : { "geo_distance": { "distance": 10000, "lat_lng": { "lat": "51.5073509", "lon": "-0.1277583"

我试图用地理距离和字段过滤数据,如“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筛选器,并将每个筛选器放在一个must子句中。 那么这里不需要术语过滤器,只需要术语过滤器。

两个错误

由于您有多个筛选器,因此需要添加一个bool筛选器,并将每个筛选器放在一个must子句中。 然后,这里不需要术语过滤器,只需要术语过滤器。

或者您可以使用and过滤器并将这两个过滤器组合在一起。以及布尔过滤器和/或/或非过滤器之间的比较:

或者您可以使用and过滤器并将两个过滤器组合在一起。以及布尔过滤器和/或/或非过滤器之间的比较:


下面是正确的查询:

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储存即可

谢谢
巴尔维这里是正确的查询:

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

我已经编写了一个查询,用于单个术语匹配。如果您有多个条件,可以写下bool查询,如:query:{bool:{must:[{term:{has_:{value:1}}}],must:[{term:{has_instant_bookings:{value:1}}}]}你在这篇文章下面的评论解决了这个问题,非常感谢!你可能想更新原始答案,因为其他任何有类似问题的人都可以更清楚地看到答案。我已经为单个术语匹配编写了查询。如果你有多个条件,你可以编写一个bool查询,如:query:{bool:{must:[{term:{has\u cctv:{value:1}}}}],must:[{term:{has\u instant\u预订:{value:1}}}]}你在这篇文章下面的评论解决了这个问题,非常感谢!你可能想更新原始答案,因为其他任何有类似问题的人都可以更清楚地看到答案。如果你丢失了这个,按距离排序功能似乎丢失了。如果你丢失了这个,按距离排序功能似乎丢失了。