/**
  * {@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;
 }