/** * {@inheritDoc} */ public function buildMainQuery(array $fields, $queryString, $phraseSlop) { $plainFields = array(); $stemFields = array(); // Separate plain and stem fields first foreach ($fields as $f) { list($field, $boost) = explode('^', $f, 2); $fieldInfo = array('field' => $field, 'boost' => $boost); if (Util::endsWith($field, '.plain')) { $plainFields[] = $fieldInfo; } else { $stemFields[] = $fieldInfo; } } $query = new \Elastica\Query\Bool(); $query->setMinimumNumberShouldMatch(1); // We always build a common terms query for the plain field $this->attachCommonTermsClause($query, $plainFields, $queryString, $this->profile); // We can use different types of query for the stem field. if (count($stemFields) === 1) { $this->attachSingleFieldStemClause($query, $stemFields[0], $queryString); } else { $this->attachMultiFieldsStemClause($query, $stemFields, $queryString); } return $query; }