protected function translateFilters(CriteriaList $filter_criteria_list)
 {
     $elasticsearch_filters = [];
     foreach ($filter_criteria_list as $criteria) {
         if ($criteria instanceof CriteriaContainerInterface) {
             $operator = $criteria->getOperator();
             $filters = $this->translateFilters($criteria->getCriteriaList());
             if (!empty($filters)) {
                 if (isset($elasticsearch_filters[$operator])) {
                     $elasticsearch_filters[] = array_merge_recursive($elasticsearch_filters[$operator], $filters);
                 } else {
                     $elasticsearch_filters[] = $filters;
                 }
             }
         } elseif ($criteria instanceof AttributeCriteria) {
             $elasticsearch_filters[] = $this->buildFilterFor($criteria);
         } elseif ($criteria instanceof RangeCriteria) {
             $elasticsearch_filters[] = $this->buildRangeFilterFor($criteria);
         } elseif ($criteria instanceof SpatialCriteria) {
             $elasticsearch_filters[] = $this->buildSpatialFilterFor($criteria);
         } elseif ($criteria instanceof CustomCriteria) {
             $elasticsearch_filters[] = $criteria->getQueryPart();
         } else {
             throw new RuntimeError(sprintf('Invalid criteria type %s given to %s', get_class($criteria), static::CLASS));
         }
     }
     if (count($elasticsearch_filters)) {
         return [$filter_criteria_list->getOperator() => $elasticsearch_filters];
     } else {
         return [];
     }
 }