modified custom solr field types, fixed the reference search

This commit is contained in:
Bachir Soussi Chiadmi 2021-10-27 00:20:07 +02:00
parent dc2b536be3
commit fa0c70ccd8
2 changed files with 33 additions and 19 deletions

View File

@ -21,14 +21,14 @@ field_type:
filters: filters:
- -
class: solr.LowerCaseFilterFactory class: solr.LowerCaseFilterFactory
-
class: solr.RemoveDuplicatesTokenFilterFactory
- -
class: solr.ASCIIFoldingFilterFactory class: solr.ASCIIFoldingFilterFactory
preserveOriginal: true preserveOriginal: true
- -
class: solr.WordDelimiterGraphFilterFactory class: solr.WordDelimiterGraphFilterFactory
preserveOriginal: 1 preserveOriginal: 1
-
class: solr.RemoveDuplicatesTokenFilterFactory
- -
type: query type: query
tokenizer: tokenizer:
@ -36,13 +36,13 @@ field_type:
filters: filters:
- -
class: solr.LowerCaseFilterFactory class: solr.LowerCaseFilterFactory
-
class: solr.RemoveDuplicatesTokenFilterFactory
- -
class: solr.ASCIIFoldingFilterFactory class: solr.ASCIIFoldingFilterFactory
preserveOriginal: true preserveOriginal: true
- -
class: solr.WordDelimiterGraphFilterFactory class: solr.WordDelimiterGraphFilterFactory
preserveOriginal: 1 preserveOriginal: 1
-
class: solr.RemoveDuplicatesTokenFilterFactory
solr_configs: {} solr_configs: {}
text_files: {} text_files: {}

View File

@ -27,6 +27,14 @@ class Base extends ControllerBase {
// https://www.hashbangcode.com/article/drupal-8-date-search-boosting-search-api-and-solr-search // 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 // 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 dont affect scoring).
// https://www.drupal.org/project/search_api/issues/3049097
$lang = \Drupal::languageManager()->getCurrentLanguage()->getId(); $lang = \Drupal::languageManager()->getCurrentLanguage()->getId();
$this->index = Index::load('database'); $this->index = Index::load('database');
@ -45,15 +53,7 @@ class Base extends ControllerBase {
$this->and_query->setParseMode($parse_mode); $this->and_query->setParseMode($parse_mode);
// Set fulltext search keywords and fields. // Set fulltext search keywords and fields.
$this->and_query->keys($this->keys); $this->and_query->keys($this->keys);
// $this->and_query->setFulltextFields(['field_reference']);
// in case we search for material references like W0117
if (preg_match_all('/[WTRPCMFGSO]\d{4}/i', $this->keys, $matches)) {
$ref_conditions = $this->and_query->createConditionGroup('OR');
foreach ($matches[0] as $key => $value) {
$ref_conditions->addCondition('field_reference', $value);
}
$this->and_query->addConditionGroup($ref_conditions);
}
// in case of term id provided restrict the keys to taxo fields // in case of term id provided restrict the keys to taxo fields
if ($this->term) { if ($this->term) {
$term_conditions = $this->and_query->createConditionGroup('OR'); $term_conditions = $this->and_query->createConditionGroup('OR');
@ -72,8 +72,11 @@ class Base extends ControllerBase {
// look @ materio_sapi_search_api_solr_query_alter in materio_sapi.module // look @ materio_sapi_search_api_solr_query_alter in materio_sapi.module
// $this->or_query->setOption('termid', $this->term); // $this->or_query->setOption('termid', $this->term);
} }
// FILTERS
$fulltextFields = [];
if ($this->filters) { if ($this->filters) {
// FILTERS
$filters_conditions = $this->and_query->createConditionGroup('AND'); $filters_conditions = $this->and_query->createConditionGroup('AND');
foreach ($this->filters as $filter) { foreach ($this->filters as $filter) {
$filter = (int) $filter; $filter = (int) $filter;
@ -83,8 +86,8 @@ class Base extends ControllerBase {
} }
$this->and_query->addConditionGroup($filters_conditions); $this->and_query->addConditionGroup($filters_conditions);
}else{ }else{
// Recherche uniquement sur le champ « body » // Recherche uniquement sur les champ thésaurus et tag
$this->and_query->setFulltextFields([ $fulltextFields += [
'thesaurus_name_0', 'thesaurus_name_0',
'thesaurus_synonyms_0', 'thesaurus_synonyms_0',
'thesaurus_name_1', 'thesaurus_name_1',
@ -99,10 +102,12 @@ class Base extends ControllerBase {
'thesaurus_synonyms', 'thesaurus_synonyms',
'tag_name', 'tag_name',
'tag_synonyms' 'tag_synonyms'
]); ];
} }
if(count($fulltextFields)){
$this->and_query->setFulltextFields($fulltextFields);
}
// Restrict the search to specific languages. // Restrict the search to specific languages.
$this->and_query->setLanguages([$lang]); $this->and_query->setLanguages([$lang]);
@ -157,6 +162,15 @@ class Base extends ControllerBase {
} }
$this->or_query->addConditionGroup($exclude_and_results_conditions); $this->or_query->addConditionGroup($exclude_and_results_conditions);
if (preg_match_all('/[WTRPCMFGSO]\d{4}/i', $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);
}
// Restrict the search to specific languages. // Restrict the search to specific languages.
$this->or_query->setLanguages([$lang]); $this->or_query->setLanguages([$lang]);