#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)] )