Commit 7aa4025d authored by Markus Kalkbrenner's avatar Markus Kalkbrenner Committed by Markus Kalkbrenner
Browse files

Issue #3318813 by mkalkbrenner: Optionally index fulltext language fallback...

Issue #3318813 by mkalkbrenner: Optionally index fulltext language fallback fileds as langauge undefined (und)
parent 274f8a3b
Loading
Loading
Loading
Loading
+3 −0
Changes for config/schema/search_api_solr.schema.yml: 3 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -129,6 +129,9 @@ search_api.index.*.third_party.search_api_solr:
        include_language_independent:
          type: boolean
          label: 'Include languages independent content in search results'
        use_language_undefined_as_fallback_language:
          type: boolean
          label: 'Index language fallback fulltext fields using "language undefined"'
        specific_languages:
          type: sequence
          label: 'Specific Languages'
+12 −0
Changes for search_api_solr.install: 12 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -2124,3 +2124,15 @@ function search_api_solr_update_8414() {
    search_api_solr_update_helper_save_index_third_party_settings($index_id, $third_party_settings);
  }
}

/**
 * Offer language undefined ad fallback language.
 */
function search_api_solr_update_8415() {
  foreach (search_api_solr_update_helper_get_index_third_party_settings() as $index_id => $third_party_settings) {
    if (!isset($third_party_settings['multilingual']) || !isset($third_party_settings['multilingual']['use_language_undefined_as_fallback_language'])) {
      $third_party_settings['multilingual']['use_language_undefined_as_fallback_language'] = FALSE;
    }
    search_api_solr_update_helper_save_index_third_party_settings($index_id, $third_party_settings);
  }
}
+9 −1
Changes for search_api_solr.module: 9 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -170,6 +170,7 @@ function search_api_solr_default_index_third_party_settings() {
    'multilingual' => [
      'limit_to_content_language' => FALSE,
      'include_language_independent' => TRUE,
      'use_language_undefined_as_fallback_language' => FALSE,
      'specific_languages' => [],
    ],
  ];
@@ -285,10 +286,17 @@ function search_api_solr_form_search_api_index_form_alter(&$form, FormStateInter
    $form['third_party_settings']['search_api_solr']['multilingual']['include_language_independent'] = [
      '#type' => 'checkbox',
      '#title' => t('Include language independent content in search results.'),
      '#description' => t('This option will include content without a language assigned in the results of custom queries or search pages not managed by Views. For example, if you search for English content, but have an article with languague of "undefined", you will see those results as well. If you disable this option, you will only see content that matches the language.'),
      '#description' => t('This option will include content without a language assigned in the results of custom queries or search pages not managed by Views. For example, if you search for English content, but have an article with language of "undefined", you will see those results as well. If you disable this option, you will only see content that matches the language.'),
      '#default_value' => $settings['multilingual']['include_language_independent'],
    ];

    $form['third_party_settings']['search_api_solr']['multilingual']['use_language_undefined_as_fallback_language'] = [
      '#type' => 'checkbox',
      '#title' => t('Index language fallback fulltext fields using "language undefined".'),
      '#description' => t('By default, fulltext fields of a language added by the Search API "language with fallback" field will be indexed using a corresponding language-specific fulltext field. That might lead to bad results if you for example define English as Fallback for Japanese. Using this option, the language undefinded fulltext field will be used for all fallback languages. Unless you do custom searches, it is recommended that you also enable "Include language independent content in search results" above.'),
      '#default_value' => $settings['multilingual']['use_language_undefined_as_fallback_language'],
    ];

    foreach (\Drupal::languageManager()->getLanguages() as $language) {
      $langcode_options[$language->getId()] = $language->getName();
    }
+19 −5
Changes for src/Plugin/search_api/backend/SearchApiSolrBackend.php: 19 added lines, 5 removed lines.
Original line number Diff line number Diff line
@@ -1188,11 +1188,13 @@ class SearchApiSolrBackend extends BackendPluginBase implements SolrBackendInter
   * @throws \Drupal\Component\Plugin\Exception\PluginException
   */
  public function getDocuments(IndexInterface $index, array $items, UpdateQuery $update_query = NULL) {
    $index_third_party_settings = $index->getThirdPartySettings('search_api_solr') + search_api_solr_default_index_third_party_settings();
    $documents = [];
    $index_id = $this->getTargetedIndexId($index);
    $site_hash = $this->getTargetedSiteHash($index);
    $languages = $this->languageManager->getLanguages();
    $specific_languages = array_keys(array_filter($index->getThirdPartySetting('search_api_solr', 'multilingual', ['specific_languages' => []])['specific_languages'] ?? []));
    $specific_languages = array_keys(array_filter($index_third_party_settings['multilingual']['specific_languages'] ?? []));
    $use_language_undefined_as_fallback_language = $index_third_party_settings['multilingual']['use_language_undefined_as_fallback_language'] ?? FALSE;
    $fulltext_fields = $index->getFulltextFields();
    $request_time = $this->formatDate($this->time->getRequestTime());
    $base_urls = [];
@@ -1228,7 +1230,7 @@ class SearchApiSolrBackend extends BackendPluginBase implements SolrBackendInter
      }

      foreach ($fallback_languages as $fallback_language) {
        $fallback_field_names[$fallback_language] = $this->getLanguageSpecificSolrFieldNames($fallback_language, $index);
        $fallback_field_names[$fallback_language] = $this->getLanguageSpecificSolrFieldNames($use_language_undefined_as_fallback_language ? LanguageInterface::LANGCODE_NOT_SPECIFIED : $fallback_language, $index);
      }
      $field_names = $this->getLanguageSpecificSolrFieldNames($language_id, $index);
      $boost_terms = [];
@@ -1298,11 +1300,16 @@ class SearchApiSolrBackend extends BackendPluginBase implements SolrBackendInter
            }

            $first_value = $this->addIndexField($doc, $field_names[$name], $auto_aggregate_values[$type], $type, $boost_terms);
            if (in_array($field_identifier, $fulltext_fields)) {
            $fallback_values = [];
            foreach ($fallback_languages as $fallback_language) {
              if (!isset($fallback_values[$fallback_language])) {
                $event = new PreAddLanguageFallbackFieldEvent($fallback_language, $auto_aggregate_values[$type], $type, $item);
                $this->eventDispatcher->dispatch($event);
                $this->addIndexField($doc, $fallback_field_names[$fallback_language][$name], $event->getValue(), $type, $boost_terms);
                $value = trim($event->getValue());
                if ($value) {
                  $this->addIndexField($doc, $fallback_field_names[$fallback_language][$name], $value, $type, $boost_terms);
                }
                $fallback_values[$fallback_language] = $value;
              }
            }
            break;
@@ -1318,10 +1325,17 @@ class SearchApiSolrBackend extends BackendPluginBase implements SolrBackendInter
          default:
            $first_value = $this->addIndexField($doc, $field_names[$name], $field->getValues(), $type, $boost_terms);
            if (in_array($field_identifier, $fulltext_fields)) {
              $fallback_values = [];
              foreach ($fallback_languages as $fallback_language) {
                if (!isset($fallback_values[$fallback_language])) {
                  $event = new PreAddLanguageFallbackFieldEvent($fallback_language, $field->getValues(), $type, $item);
                  $this->eventDispatcher->dispatch($event);
                $this->addIndexField($doc, $fallback_field_names[$fallback_language][$name], $event->getValue(), $type, $boost_terms);
                  $value = trim($event->getValue());
                  if ($value) {
                    $this->addIndexField($doc, $fallback_field_names[$fallback_language][$name], $value, $type, $boost_terms);
                  }
                  $fallback_values[$fallback_language] = $value;
                }
              }
            }
            break;