2016-11-29 3 views
0

Я пытаюсь вычислить агрегированное среднее значение поля в моем db через elasticsearch. Я не имея никаких проблем вычисления значения AV без какой-либо фильтрации:Применение фильтра для исключения определенного числового значения в поле вложенного объекта с помощью упругого поиска

{ 
    "query": { 
     "match_all":{} 
    }, 
    "size": 0, 
    "aggs": { 
     "avg_quantity": { 
      "avg": { 
       "field": "license_offer.unit_price" 
      } 
     } 
    } 
} 

Однако мне нужно исключить из агрегации документы, которые имеют license_offer.unit_price 0 (licence_offer вложенный объект в лицензии).

Я пробовал разные вещи, это моя последняя попытка:

{ 
    "size": 0, 
    "query": { 
     "constant_score": { 
      "filter": { 
       "license_offer.unit_price": { 
         "gte": 0 
       } 
      } 
     } 
    }, 
    "aggs": { 
     "quantity_stats": { 
      "stats": { 
       "field": "license_offer.unit_price" 
      } 
     } 
    } 

} 

, но я получаю сообщение об ошибке:

"type": "parsing_exception", 
     "reason": "no [query] registered for [license_offer.unit_price]", 

Как применить фильтр, чтобы исключить конкретное численное значение на поле вложенного объекта с эластичным поиском?

ответ

0

Ваш запрос не является правильным, вы просто отсутствует range ключевое слово:

{ 
    "size": 0, 
    "query": { 
     "constant_score": { 
      "filter": { 
       "range": {       <--- add this 
        "license_offer.unit_price": { 
         "gte": 0 
        } 
       } 
      } 
     } 
    }, 
    "aggs": { 
     "quantity_stats": { 
      "stats": { 
       "field": "license_offer.unit_price" 
      } 
     } 
    } 

} 

Вы также можете переместить фильтр внутри агрегирования части:

{ 
    "size": 0, 
    "aggs": { 
    "only_positive": { 
     "filter": { 
     "range": { 
      "license_offer.unit_price": { 
      "gt": 0 
      } 
     } 
     }, 
     "aggs": { 
     "quantity_stats": { 
      "stats": { 
      "field": "license_offer.unit_price" 
      } 
     } 
     } 
    } 
    } 
} 
+0

благодаря @val могли бы вы показать как вы это сделаете, специально исключив значение 0? –

+0

Используйте 'gt' вместо' gte'? – Val

+0

Да, я просто сделал это, но есть ли способ сделать это, не используя логику диапазона, а скорее логику «исключения»/фильтрации (что-то вроде «не 0») –

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