Как заставить поиск MediaWiki игнорировать акценты? - PullRequest
0 голосов
/ 13 января 2019

Я использую экземпляр MediaWiki, который я только что обновил до последней версии на момент написания статьи 1.32.0. Этой вики уже почти 10 лет, и она прошла через ряд обновлений.

Это вики на французском языке, и кое-что раздражает для говорящих по-французски то, что встроенный поиск всегда считал акцентированные символы отличными от их не акцентированных аналогов , версия за версией.

Например, поиск Aromathérapie возвращает количество результатов, а поиск Aromatherapie возвращает 0 результатов.

Сначала я думал, что это проблема сопоставления базы данных, пока не заметил, что таблица searchindex фактически заполнена ASCII-кодированными словами UTF-8. В приведенном выше примере aromathérapie сохраняется как aromathu8c3a9rapie, поэтому изменение параметров сортировки таблицы не помогает.

Копаясь в исходном коде, я нашел метод SearchMySQL :: normalizeText () , который отвечает за эту кодировку.

И, насколько я вижу, единственная нормализация, которую этот метод выполняет до кодирования, это нижний регистр:

MediaWikiServices::getInstance()->getContentLanguage()->lc( $out )

Похоже, что встроенный поиск не может игнорировать акценты.

Я довольно много гуглил по решениям и нашел в основном старые нерелевантные темы. Я очень удивлен, что не могу найти больше литературы по этому вопросу.

Как сделать поиск в MediaWiki нечувствительным к регистру и акценту?

Ответы [ 3 ]

0 голосов
/ 24 января 2019

Позволяет решать каждую проблему по одному.

Сначала давайте разберемся с меньшей проблемой, чувствительностью к регистру

select * from tableName where lower(col_name) = lower(searchTerm);

или

select * from tableName where upper(col_name) = upper(searchTerm);

Часть 2 Обрабатывая кодировку, как предлагают другие, вы можете загрузить более компетентный инструмент поиска или изменить представление вашего поискового запроса, преобразовав

searchTerm до %s%e%a%r%c%h%T%e%r%m%. Это в основном добавит подстановочные знаки, способные игнорировать дополнительные символы, добавленные кодировкой UTF-8. Преимущество этого подхода заключается в том, что вы должны вносить минимальные изменения в существующий код, но это немного увеличивает вычислительные возможности и сложность.

Это было написано в контексте SQL, если вы используете другое управление базой данных, запросы могут немного отличаться, но идея остается той же.

Это должно сделать работу. Если есть какие-либо вопросы, не стесняйтесь добавлять комментарии.

0 голосов
/ 24 января 2019

Я не горжусь этим, но вот как я решил это, используя встроенную поддержку сортировки MySQL (которая работает с полнотекстовыми индексами - по крайней мере, в последних версиях MySQL - вопреки что написано в коде):

  • Преобразовал таблицу searchindex в utf8mb4:
    ALTER TABLE searchindex CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  • Применил этот патч к SearchMySQL.php:
    • без нижнего регистра, без замены символов UTF-8 их шестнадцатеричным кодом
    • Юникод u флаг в preg_replace()
  • Восстановить таблицу searchindex: php maintenance/rebuildtextindex.php

Аналогичная процедура должна применяться при каждом обновлении установки MediaWiki, что увеличивает стоимость обслуживания. Процедура проста, я готов принять эту плату прямо сейчас.

И последнее замечание: автозаполнение не работает без учета регистра, а только результаты поиска. Это достаточно хорошо для меня сейчас.

0 голосов
/ 22 января 2019

Если вы не хотите CirrusSearch , вы можете попробовать облегченное расширение: TitleKey

Установка

  • Загрузите и поместите файл (ы) в каталог с названием TitleKey в вашем расширении / папке.
  • Добавьте следующий код внизу вашего LocalSettings.php:

    wfLoadExtension( 'TitleKey' );
    
  • Запустите скрипт обновления, который автоматически создаст необходимые таблицы базы данных, необходимые для этого расширения.

  • Запустите сценарий rebuildTitleKeys.php (для этого требуется доступ из командной строки):

    php extensions/TitleKey/rebuildTitleKeys.php
    
  • Готово - Перейдите к Special:Version в вики, чтобы убедиться, что расширение успешно установлено.

...