/** * @param SearchQueryInterface $query * @param bool $asFilter * @return array */ protected function mapQuery(SearchQueryInterface $query, $asFilter = false) { $queryArr = []; if ($query instanceof Boolean) { $signs = $query->getSigns(); $boolean = []; foreach ($query->getSubQueries() as $key => $subQuery) { $sign = isset($signs[$key]) ? $signs[$key] : null; if ($sign === true) { if ($subQueryArr = $this->mapQuery($subQuery, $asFilter)) { if (!isset($boolean['must'])) { $boolean['must'] = []; } $boolean['must'][] = $this->mapQuery($subQuery, $asFilter); } } elseif ($sign === false) { if ($subQueryArr = $this->mapQuery($subQuery, $asFilter)) { if (!isset($booleanr['must_not'])) { $boolean['must_not'] = []; } $boolean['must_not'][] = $this->mapQuery($subQuery, $asFilter); } } elseif ($sign === null) { if ($subQueryArr = $this->mapQuery($subQuery, $asFilter)) { if (!isset($boolean['should'])) { $boolean['should'] = []; } $boolean['should'][] = $this->mapQuery($subQuery, $asFilter); } } } if ($boolean) { $queryArr['bool'] = $boolean; } } elseif ($query instanceof Term) { $queryArr['term'] = [$query->getField() => $query->getTerm()]; } elseif ($query instanceof Range) { $range = []; if (($from = $query->getLowerBound()) !== null) { $range[$query->isIncludeLowerBound() ? 'gte' : 'gt'] = $from; } if (($to = $query->getUpperBound()) !== null) { $range[$query->isIncludeUpperBound() ? 'lte' : 'lt'] = $to; } $queryArr['range'] = [$query->getField() => $range]; } elseif ($query instanceof Match) { $matchQuery = [$query->getField() => $query->getTerm()->getTerm()]; if ($asFilter) { $queryArr['query']['match'] = $matchQuery; } else { $queryArr['match'] = $matchQuery; } } elseif ($query instanceof MultiMatch) { $multiMatchQuery = ['query' => $query->getTerm()->getTerm(), 'type' => 'most_fields', 'fields' => array_values($query->getFields()), 'minimum_should_match' => '75%']; if ($asFilter) { $queryArr['query']['multi_match'] = $multiMatchQuery; } else { $queryArr['multi_match'] = $multiMatchQuery; } } return $queryArr; }