2015-01-09 2 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

Я написал запрос для одного соответствия терминов. Если у вас есть несколько условий, вы можете записать булев запрос типа: "запрос": { "BOOL": { "сусло": [ { "термин": { "has_cctv": { "значение": 1 } } } ], "должен": [ { "термин": { "has_instant_bookings": { "значение": 1 } }} ] } } –

+0

Ваш комментарий под этим пост решил это, большое вам спасибо! Возможно, вам захочется обновить исходный ответ для всех, у кого есть подобная проблема, может увидеть ответ немного яснее. –

1

Две ошибки.

Поскольку у вас есть более одного фильтра, вам нужно добавить bool filter и поместить каждый фильтр в пункт must. Для этого вам не нужен фильтр terms, но фильтр term.

2

Или вы можете использовать фильтр 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" 
       } 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 
+1

вид по расстоянию функция потеряна, если вы потеряете это, кажется. – eugene

+0

смог использовать это с помощью геофильтра. благодаря!! –

Смежные вопросы