具有地理距离的 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 filter
和 and/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
谢谢
巴尔维
我正在尝试使用地理距离和 '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 filter
和 and/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
谢谢 巴尔维