2015-01-09 68 views
1

我正在嘗試過濾具有地理距離和字段(如'has_cctv'或'has_instant_bookings')的數據。ElasticSearch使用地理距離過濾

{ 
    "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" 
      } 
     } 
     } 
    } 
    } 
} 

這給了我'[條款]過濾器不支持查找元素內的[has_cctv]'。這可能是我的查詢問題,或數據存儲方式的問題?

回答

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

+0

我已經爲單個詞語匹配寫了查詢。如果你有多個條件,你可以寫下布爾查詢,如:「查詢」:{ 「布爾」:{ 「必須」: { 「術語」:{ 「has_cctv」:{ 「值」: 1 } } } ], 「必須」: { 「術語」:{ 「has_instant_bookings」:{ 「值」:1 } }} ] } } –

+0

這下您的評論後解決了,非常感謝你!您可能想要更新原始答案,以便其他遇到類似問題的人可以更清楚地看到答案。 –

1

兩個錯誤。

由於您有多個過濾器,您需要添加一個bool filter並將每個過濾器放在must子句中。 然後,您不需要terms過濾器,而是需要term過濾器。

2

或者您可以使用and過濾器並將兩個過濾器組合在一起。而bool filter和​​之間的比較: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

排序通過距離功能丟失,如果你失去了這一點,似乎。 – eugene

+0

能夠將其與地理過濾器配合使用。謝謝!! –