/** * Reset sphinx client and apply the options * * Only apply filters and group by * * @param SearchEngineOptions $options * @return SphinxSearch */ protected function applyOptions(SearchEngineOptions $options) { $this->resetSphinx(); $filters = []; foreach ($options->getCollections() as $collection) { $filters[] = sprintf("%u", crc32($collection->get_databox()->get_sbas_id() . '_' . $collection->get_coll_id())); } $this->sphinx->SetFilter('crc_sbas_coll', $filters); $this->sphinx->SetFilter('deleted', [0]); $this->sphinx->SetFilter('parent_record_id', [$options->getSearchType()]); if ($options->getDateFields() && ($options->getMaxDate() || $options->getMinDate())) { foreach (array_unique(array_map(function (\databox_field $field) { return $field->get_name(); }, $options->getDateFields())) as $field) { $min = $options->getMinDate() ? $options->getMinDate()->format('U') : 0; $max = $options->getMaxDate() ? $options->getMaxDate()->format('U') : pow(2, 32); $this->sphinx->SetFilterRange(ConfigurationPanel::DATE_FIELD_PREFIX . $field, $min, $max); } } if ($options->getFields()) { $filters = []; foreach ($options->getFields() as $field) { $filters[] = sprintf("%u", crc32($field->get_databox()->get_sbas_id() . '_' . $field->get_id())); } $this->sphinx->SetFilter('crc_struct_id', $filters); } if ($options->getBusinessFieldsOn()) { $crc_coll_business = []; foreach ($options->getBusinessFieldsOn() as $collection) { $crc_coll_business[] = sprintf("%u", crc32($collection->get_coll_id() . '_1')); $crc_coll_business[] = sprintf("%u", crc32($collection->get_coll_id() . '_0')); } $non_business = []; foreach ($options->getCollections() as $collection) { foreach ($options->getBusinessFieldsOn() as $BFcollection) { if ($collection->get_base_id() == $BFcollection->get_base_id()) { continue 2; } } $non_business[] = $collection; } foreach ($non_business as $collection) { $crc_coll_business[] = sprintf("%u", crc32($collection->get_coll_id() . '_0')); } $this->sphinx->SetFilter('crc_coll_business', $crc_coll_business); } elseif ($options->getFields()) { $this->sphinx->SetFilter('business', [0]); } /** * @todo : enhance : check status in a better way */ $status_opts = $options->getStatus(); foreach ($options->getDataboxes() as $databox) { foreach ($databox->get_statusbits() as $n => $status) { if (!array_key_exists($n, $status_opts)) { continue; } if (!array_key_exists($databox->get_sbas_id(), $status_opts[$n])) { continue; } $crc = sprintf("%u", crc32($databox->get_sbas_id() . '_' . $n)); $this->sphinx->SetFilter('status', [$crc], $status_opts[$n][$databox->get_sbas_id()] == '0'); } } if ($options->getRecordType()) { $this->sphinx->SetFilter('crc_type', [sprintf("%u", crc32($options->getRecordType()))]); } $order = ''; switch ($options->getSortOrder()) { case SearchEngineOptions::SORT_MODE_ASC: $order = 'ASC'; break; case SearchEngineOptions::SORT_MODE_DESC: default: $order = 'DESC'; break; } switch ($options->getSortBy()) { case SearchEngineOptions::SORT_RANDOM: $sort = '@random'; break; case SearchEngineOptions::SORT_RELEVANCE: default: $sort = '@relevance ' . $order . ', created_on ' . $order; break; case SearchEngineOptions::SORT_CREATED_ON: $sort = 'created_on ' . $order; break; } $this->sphinx->SetGroupBy('crc_sbas_record', SPH_GROUPBY_ATTR, $sort); return $this; }
/** * Executes the Phrasea query * * @param string $query * @return PhraseaEngine */ private function executeQuery($query, SearchEngineOptions $options) { $nbanswers = $total_time = 0; $sort = ''; if ($options->getSortBy()) { switch ($options->getSortOrder()) { case SearchEngineOptions::SORT_MODE_ASC: $sort = '+'; break; case SearchEngineOptions::SORT_MODE_DESC: default: $sort = '-'; break; } $sort .= '0' . $options->getSortBy(); } foreach ($this->queries as $sbas_id => $qry) { $BF = []; foreach ($options->getBusinessFieldsOn() as $collection) { // limit business field query to databox local collection if ($sbas_id === $collection->get_sbas_id()) { $BF[] = $collection->get_base_id(); } } $results = phrasea_query2($this->app['session']->get('phrasea_session_id'), $sbas_id, $this->colls[$sbas_id], $this->arrayq[$sbas_id], $this->app['conf']->get(['main', 'key']), $this->app['session']->get('usr_id'), false, $options->getSearchType() == SearchEngineOptions::RECORD_GROUPING ? PHRASEA_MULTIDOC_REGONLY : PHRASEA_MULTIDOC_DOCONLY, $sort, $BF, $options->isStemmed() ? $options->getLocale() : null); if ($results) { $total_time += $results['time_all']; $nbanswers += $results["nbanswers"]; } } $sql = 'UPDATE cache SET query = :query, query_time = NOW(), duration = :duration, total = :total WHERE session_id = :ses_id'; $params = ['query' => $query, ':ses_id' => $this->app['session']->get('phrasea_session_id'), ':duration' => $total_time, ':total' => $nbanswers]; $stmt = $this->app['phraseanet.appbox']->get_connection()->prepare($sql); $stmt->execute($params); $stmt->closeCursor(); return $this; }
private function createSortQueryParams(SearchEngineOptions $options) { $sort = []; if ($options->getSortBy() === 'score') { $sort['_score'] = $options->getSortOrder(); } $sort['created_on'] = $options->getSortOrder(); return $sort; }
private function createSortQueryParams(SearchEngineOptions $options) { $sort = []; if ($options->getSortBy() === null || $options->getSortBy() === SearchEngineOptions::SORT_RELEVANCE) { $sort['_score'] = $options->getSortOrder(); } elseif ($options->getSortBy() === SearchEngineOptions::SORT_CREATED_ON) { $sort['created_on'] = $options->getSortOrder(); } else { $sort[sprintf('caption.%s', $options->getSortBy())] = $options->getSortOrder(); } return $sort; }