|
@@ -27,185 +27,18 @@ class Search extends ControllerBase {
|
|
|
// https://www.hashbangcode.com/article/drupal-8-date-search-boosting-search-api-and-solr-search
|
|
|
// https://kgaut.net/blog/2018/drupal-8-search-api-effectuer-une-requete-dans-le-code.html
|
|
|
|
|
|
-
|
|
|
- // Otherwise, if you use Solr, you can also set the parse mode to “Direct query”
|
|
|
- // and use something like 'tm_name:alex AND tm_surname:john' as the keywords (field names may vary).
|
|
|
- // That will also ensure scoring works for the keywords (the other way just adds filters, which don’t affect scoring).
|
|
|
- // https://www.drupal.org/project/search_api/issues/3049097
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- // $lang = \Drupal::languageManager()->getCurrentLanguage()->getId();
|
|
|
-
|
|
|
- $this->index = Index::load('enquetes');
|
|
|
+ // todo choose index regarding the content_type param
|
|
|
+ if ($this->content_type === 'entites') {
|
|
|
+ $this->index = Index::load('entites');
|
|
|
+ }else{
|
|
|
+ $this->index = Index::load('concernements');
|
|
|
+ }
|
|
|
|
|
|
$this->results = [
|
|
|
'uuids' => [],
|
|
|
'nids' => []
|
|
|
];
|
|
|
|
|
|
- // // ,---.| ,---.
|
|
|
- // // |---'|---.,---.,---.,---.,---. | |. .,---.,---., .
|
|
|
- // // | | || ,---|`---.|---' | || ||---'| | |
|
|
|
- // // ` ` '` `---^`---'`---' `---\`---'`---'` `---|
|
|
|
- // // `---'
|
|
|
- // // (to match exact materials names (like "wood-skin"))
|
|
|
- // $this->phrase_query = $this->index->query(['offset'=>0,'limit'=>10000]);
|
|
|
- // // set parse mode and conjunction
|
|
|
- // $parse_mode = \Drupal::service('plugin.manager.search_api.parse_mode')
|
|
|
- // ->createInstance('phrase');
|
|
|
- // $parse_mode->setConjunction('AND');
|
|
|
- // $this->phrase_query->setParseMode($parse_mode);
|
|
|
- // // Set fulltext search keywords and fields.
|
|
|
- // if ($this->keys) {
|
|
|
- // $this->phrase_query->keys(implode(' ', $this->keys));
|
|
|
- // }
|
|
|
- // $this->phrase_query->setFulltextFields(['title']);
|
|
|
-
|
|
|
- // // Restrict the search to specific languages.
|
|
|
- // $this->phrase_query->setLanguages([$lang]);
|
|
|
-
|
|
|
- // // Do paging.
|
|
|
- // // $this->and_query->range($this->offset, $this->limit);
|
|
|
- // // retrieve all results
|
|
|
- // // $this->and_query->range(0, -1);
|
|
|
-
|
|
|
- // // Add sorting.
|
|
|
- // $this->phrase_query->sort('search_api_relevance', 'DESC');
|
|
|
-
|
|
|
- // // Set one or more tags for the query.
|
|
|
- // // @see hook_search_api_query_TAG_alter()
|
|
|
- // // @see hook_search_api_results_TAG_alter()
|
|
|
- // $this->phrase_query->addTag('ouatt_searchapi_search_phrase_query');
|
|
|
-
|
|
|
- // $phrase_results = $this->phrase_query->execute();
|
|
|
-
|
|
|
- // foreach ($phrase_results as $result) {
|
|
|
- // $this->results['uuids'][] = $result->getField('uuid')->getValues()[0];
|
|
|
- // $this->results['nids'][] = $result->getField('nid')->getValues()[0];
|
|
|
- // }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- // // ,---. | ,---.
|
|
|
- // // |---|,---.,---| | |. .,---.,---., .
|
|
|
- // // | || || | | || ||---'| | |
|
|
|
- // // ` '` '`---' `---\`---'`---'` `---|
|
|
|
- // // `---'
|
|
|
- // $this->and_query = $this->index->query(['offset'=>0,'limit'=>10000]);
|
|
|
- // // set parse mode and conjunction
|
|
|
- // $parse_mode = \Drupal::service('plugin.manager.search_api.parse_mode')
|
|
|
- // ->createInstance('terms');
|
|
|
- // $parse_mode->setConjunction('AND');
|
|
|
- // $this->and_query->setParseMode($parse_mode);
|
|
|
- // // Set fulltext search keywords and fields.
|
|
|
- // if ($this->keys) {
|
|
|
- // $this->and_query->keys(implode(' ', $this->keys));
|
|
|
- // }
|
|
|
-
|
|
|
- // // in case of term id provided restrict the keys to taxo fields
|
|
|
- // if ($this->terms && is_array($this->terms) && count($this->terms)) {
|
|
|
- // $term_conditions = $this->and_query->createConditionGroup('OR');
|
|
|
- // // $term = (int) $this->term;
|
|
|
- // foreach ($this->terms as $term) {
|
|
|
- // $tid = $term->value;
|
|
|
- // foreach (['tag_tid', 'thesaurus_tid'] as $field) {
|
|
|
- // $term_conditions->addCondition($field, (int) $tid);
|
|
|
- // }
|
|
|
- // }
|
|
|
- // $this->and_query->addConditionGroup($term_conditions);
|
|
|
-
|
|
|
- // // INSTEAD TRY TO BOOST THE TAG AND THESAURUS FIELDS
|
|
|
- // // foreach ($taxoSolrFieldsName as $fname) {
|
|
|
- // // // $solarium_query->addParam('bf', "recip(abs(ms(NOW,{$solrField})),3.16e-11,10,0.1)");
|
|
|
- // // $bfparam = "if(gt(termfreq({$fname},{$this->term}),0),^21,0)";
|
|
|
- // // $this->or_query->addParam('bf', $bfparam);
|
|
|
- // // }
|
|
|
- // // look @ ouatt_searchapi_search_api_solr_query_alter in ouatt_searchapi.module
|
|
|
- // // $this->or_query->setOption('termid', $this->term);
|
|
|
- // }
|
|
|
-
|
|
|
- // if ($this->filters) {
|
|
|
- // // FILTERS
|
|
|
- // $filters_conditions = $this->and_query->createConditionGroup('AND');
|
|
|
- // foreach ($this->filters as $filter) {
|
|
|
- // $filter = (int) $filter;
|
|
|
- // foreach (['thesaurus_tid'] as $field) { // 'tag_tid',
|
|
|
- // $filters_conditions->addCondition($field, $filter);
|
|
|
- // }
|
|
|
- // }
|
|
|
- // $this->and_query->addConditionGroup($filters_conditions);
|
|
|
-
|
|
|
- // if(!$this->keys) {
|
|
|
- // // if no keys but filters switch query to direct and add wildcard solr keys *:*
|
|
|
- // $direct_and_parse_mode = \Drupal::service('plugin.manager.search_api.parse_mode')
|
|
|
- // ->createInstance('direct');
|
|
|
- // $direct_and_parse_mode->setConjunction('AND');
|
|
|
- // $this->and_query->setParseMode($direct_and_parse_mode);
|
|
|
- // // $this->and_query->keys('*:*');
|
|
|
- // }
|
|
|
- // }
|
|
|
- // // else{
|
|
|
- // $fulltextFields = [];
|
|
|
- // // Recherche uniquement sur les champ thésaurus et tag
|
|
|
- // $fulltextFields += [
|
|
|
- // 'thesaurus_name_0',
|
|
|
- // 'thesaurus_synonyms_0',
|
|
|
- // 'thesaurus_name_1',
|
|
|
- // 'thesaurus_synonyms_1',
|
|
|
- // 'thesaurus_name_2',
|
|
|
- // 'thesaurus_synonyms_2',
|
|
|
- // 'thesaurus_name_3',
|
|
|
- // 'thesaurus_synonyms_3',
|
|
|
- // 'thesaurus_name_4',
|
|
|
- // 'thesaurus_synonyms_4',
|
|
|
- // 'thesaurus_name',
|
|
|
- // 'thesaurus_synonyms',
|
|
|
- // 'tag_name',
|
|
|
- // 'tag_synonyms'
|
|
|
- // ];
|
|
|
- // if(count($fulltextFields)){
|
|
|
- // $this->and_query->setFulltextFields($fulltextFields);
|
|
|
- // }
|
|
|
- // // }
|
|
|
-
|
|
|
- // // Restrict the search to specific languages.
|
|
|
- // $this->and_query->setLanguages([$lang]);
|
|
|
-
|
|
|
- // // Do paging.
|
|
|
- // // $this->and_query->range($this->offset, $this->limit);
|
|
|
- // // retrieve all results
|
|
|
- // // $this->and_query->range(0, -1);
|
|
|
-
|
|
|
- // // Add sorting.
|
|
|
- // $this->and_query->sort('search_api_relevance', 'DESC');
|
|
|
-
|
|
|
- // // Set one or more tags for the query.
|
|
|
- // // @see hook_search_api_query_TAG_alter()
|
|
|
- // // @see hook_search_api_results_TAG_alter()
|
|
|
- // $this->and_query->addTag('ouatt_searchapi_search_and_query');
|
|
|
-
|
|
|
- // $and_results = $this->and_query->execute();
|
|
|
-
|
|
|
- // foreach ($and_results as $result) {
|
|
|
- // // !! have to remove duplicates from phrase query
|
|
|
- // $nid = $result->getField('nid')->getValues()[0];
|
|
|
- // if ( !in_array($nid, $this->results['nids']) ) {
|
|
|
- // $this->results['uuids'][] = $result->getField('uuid')->getValues()[0];
|
|
|
- // $this->results['nids'][] = $result->getField('nid')->getValues()[0];
|
|
|
- // }
|
|
|
- // }
|
|
|
-
|
|
|
-
|
|
|
- // $this->exactematch_count = count($this->results['nids']);
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- // ,---. ,---.
|
|
|
- // | |,---. | |. .,---.,---., .
|
|
|
- // | || | || ||---'| | |
|
|
|
- // `---'` `---\`---'`---'` `---|
|
|
|
- // `---'
|
|
|
$this->or_query = $this->index->query(['offset'=>0,'limit'=>10000]);
|
|
|
|
|
|
// Change the parse mode for the search.
|
|
@@ -224,23 +57,6 @@ class Search extends ControllerBase {
|
|
|
$this->or_query->keys(implode(' ', $this->keys));
|
|
|
}
|
|
|
|
|
|
- // // exclude results from previous and_query
|
|
|
- // !! trigering solr "too many boolean clauses" error
|
|
|
- // $exclude_and_results_conditions = $this->or_query->createConditionGroup('AND');
|
|
|
- // foreach ($this->results['nids'] as $nid) {
|
|
|
- // $exclude_and_results_conditions->addCondition('nid', $nid, '<>');
|
|
|
- // }
|
|
|
- // $this->or_query->addConditionGroup($exclude_and_results_conditions);
|
|
|
-
|
|
|
- // if (preg_match_all('/[WTRPCMFGSO]\d{4}/i', implode(' ', $this->keys), $matches)) {
|
|
|
- // // in case we search for material references like W0117
|
|
|
- // $ref_conditions = $this->or_query->createConditionGroup('OR');
|
|
|
- // foreach ($matches[0] as $key => $value) {
|
|
|
- // $ref_conditions->addCondition('field_reference', $value);
|
|
|
- // }
|
|
|
- // $this->or_query->addConditionGroup($ref_conditions);
|
|
|
- // }
|
|
|
-
|
|
|
// if ($this->filters) {
|
|
|
// // FILTERS
|
|
|
// $or_filters_conditions = $this->or_query->createConditionGroup('OR');
|
|
@@ -263,14 +79,6 @@ class Search extends ControllerBase {
|
|
|
|
|
|
// }
|
|
|
|
|
|
- // Restrict the search to specific languages.
|
|
|
- // $this->or_query->setLanguages([$lang]);
|
|
|
-
|
|
|
- // Do paging.
|
|
|
- // $this->or_query->range($this->offset, $this->limit);
|
|
|
- // retrieve all results
|
|
|
- // $this->or_query->range(0, -1);
|
|
|
-
|
|
|
// Add sorting.
|
|
|
$this->or_query->sort('search_api_relevance', 'DESC');
|
|
|
|
|
@@ -290,8 +98,6 @@ class Search extends ControllerBase {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // todo you may like / more like this
|
|
|
-
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -305,20 +111,11 @@ class Search extends ControllerBase {
|
|
|
$this->keys = Tags::explode($this->keys);
|
|
|
// \Drupal::logger('ouatt_searchapi')->notice($this->keys);
|
|
|
}
|
|
|
- // get the exacte term id in case of autocomplete
|
|
|
- // $this->terms = $request->query->get('terms');
|
|
|
- $t = $request->query->get('terms');
|
|
|
- // $this->terms = strlen($t) ? explode(',', $t) : null;
|
|
|
- $this->terms = $t && strlen($t) ? json_decode($t) : null;
|
|
|
+
|
|
|
+ $this->content_type = $request->query->get('content_type');
|
|
|
+ // $this->content_type = $ct && strlen($ct) ? json_decode($ct) : null;
|
|
|
|
|
|
- // get the filters of advanced search
|
|
|
- $f = $request->query->get('filters');
|
|
|
- $this->filters = $f && strlen($f) ? explode(',', $f) : null;
|
|
|
- // $this->allparams = $request->query->all();
|
|
|
- // $request->attributes->get('_raw_variables')->get('filters')
|
|
|
- //
|
|
|
- // $this->offset = $request->query->get('offset') ?? $this->offset;
|
|
|
- // $this->limit = $request->query->get('limit') ?? $this->limit;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -327,58 +124,16 @@ class Search extends ControllerBase {
|
|
|
public function getResults(Request $request) {
|
|
|
$this->parseRequest($request);
|
|
|
|
|
|
- $resp = [
|
|
|
- // 'range' => array(
|
|
|
- // 'offset' => $this->offset,
|
|
|
- // 'limit' => $this->limit
|
|
|
- // ),
|
|
|
- ];
|
|
|
-
|
|
|
- if ($this->keys || $this->filters) {
|
|
|
- // $lang = \Drupal::languageManager()->getCurrentLanguage()->getId();
|
|
|
+ $resp = [];
|
|
|
|
|
|
+ if ($this->keys) {
|
|
|
+
|
|
|
$this->sapiQuery();
|
|
|
|
|
|
- $resp['keys'] = json_encode($this->keys);
|
|
|
- $resp['terms'] = json_encode($this->terms);
|
|
|
- $resp['filters'] = $this->filters;
|
|
|
- // $resp['count'] = $this->results->getResultCount();
|
|
|
+ $resp['content_type'] = $this->content_type;
|
|
|
+
|
|
|
$resp['count'] = count($this->results['nids']);
|
|
|
- // $resp['exactematch_count'] = $this->exactematch_count;
|
|
|
- // $resp['infos'] = t('The search found @exactmatchcount exact match result(s) for @count total result(s) with', array(
|
|
|
- // "@exactmatchcount" => $resp['exactematch_count'],
|
|
|
- // "@count" => $resp['count']
|
|
|
- // ));
|
|
|
- if ($this->keys) {
|
|
|
- $resp['infos'] .= t(' keywords @keys', array(
|
|
|
- "@keys" => implode(', ', $this->keys)
|
|
|
- ));
|
|
|
- }
|
|
|
- if ($this->keys && $this->filters) {
|
|
|
- $resp['infos'] .= " and";
|
|
|
- }
|
|
|
- // if ($this->filters) {
|
|
|
- // // get the terms names from tid
|
|
|
- // $storage = \Drupal::entityTypeManager()->getStorage('taxonomy_term');
|
|
|
- // $filters_names = [];
|
|
|
- // foreach ($this->filters as $tid) {
|
|
|
- // /** @var \Drupal\Core\Entity\EntityInterface $entity */
|
|
|
- // $entity = $storage->load($tid);
|
|
|
- // $entity_trans = \Drupal::service('entity.repository')->getTranslationFromContext($entity, $lang);
|
|
|
- // $filters_names[] = $entity_trans->getName();
|
|
|
- // }
|
|
|
- // $resp['infos'] .= t(' filters @filters', array(
|
|
|
- // "@filters" => implode(', ', $filters_names)
|
|
|
- // ));
|
|
|
- // }
|
|
|
- // $resp['options'] = $this->query->getOptions();
|
|
|
|
|
|
- // $uuids = [];
|
|
|
- // $nids = [];
|
|
|
- // foreach ($this->results as $result) {
|
|
|
- // $uuids[] = $result->getField('uuid')->getValues()[0];
|
|
|
- // $nids[] = $result->getField('nid')->getValues()[0];
|
|
|
- // }
|
|
|
$resp['nids'] = array_slice($this->results['nids'], $this->offset, $this->limit);
|
|
|
$resp['uuids'] = array_slice($this->results['uuids'], $this->offset, $this->limit);
|
|
|
}
|