Elasticsearch DSL, список фильтров объектов со списком значений в

#python #elasticsearch #elasticsearch-dsl #elasticsearch-dsl-py

#питон #эластичный поиск #elasticsearch-dsl #elasticsearch-dsl-py

Вопрос:

мои данные выглядят так:

 [  {  "id": "00f0bbe514dcaf262c8a",  "status": "CL",  "type": "opportunity",  "locations": [  {  "name": "New York, USA",  "lat": 99.0853,  "lng": 99.7818,  "id": "456",  "type": "CI"  },  {  "name": "Boston, USA",  "lat": 80.0853,  "lng": 80.7818,  "id": "555",  "type": "CI"  },  {  "name": "London, UK",  "lat": 10.0853,  "lng": 10.7818,  "id": "999",  "type": "CI"  }  ]  },  {  "id": "sadl9asod01",  "status": "CL",  "type": "opportunity",  "locations": [  {  "name": "Boston, USA",  "lat": 80.0853,  "lng": 80.7818,  "id": "555",  "type": "CI"  },  ]  },  {  "id": "13094ulk",  "status": "CL",  "type": "project", # has right location but not type  "locations": [  {  "name": "Boston, USA",  "lat": 80.0853,  "lng": 80.7818,  "id": "555",  "type": "CI"  },  ]  }  ]  

Я хочу построить запрос, тип которого должен быть возможностью:

 type_q = ElasticQ('bool', must=[ElasticQ('match', type='opportunity')]) query = self.index.search().query(type_q)  

Я знаю, как построить запрос «в» с помощью dsl, например:

 excluded_ids = self._excluded_jobs() # list query = query.exclude('terms', id=excluded_ids)  

но, как я могу добавить в запрос, что в SQL я бы сделал так:

 WHERE type='opportunity'  AND  location.id in (1, 2, 3)  
  • местоположение представляет здесь объект внутри массива местоположений документа

Ответ №1:

Что-то вроде:

 type_q = ElasticQ('bool', must=[  ElasticQ('match', type='opportunity'),  ElasticQ('terms', id=excluded_ids), ])  

Или, если вы действительно хотели исключить эти идентификаторы:

 type_q = ElasticQ('bool',   must=[ElasticQ('match', type='opportunity')]  must_not=[ElasticQ('terms', id=excluded_ids)] )