Предложение небольшого улучшения обработки французского поиска (специальные символы «œ» и «æ»)

Некоторые французские слова используют следующие символы:

  • Œ, œ, как в словах œuf (яйцо) или cœur (сердце), œuvre (множественные переводы и значения, поэтому я не буду подробно останавливаться на этом, это не имеет значения), и т.д..
  • Æ, æ, как в слове nævus (научный термин для родинки (точка на коже, а не животное) или других.

æ используется редко (я думаю, это всегда научные/медицинские термины из латыни?), но œ, однако, довольно часто встречается во французском языке.

К сожалению, этих специальных символов нет на французской раскладке клавиатуры, и многие люди просто пишут «oe» или «ae» вместо них.
Однако у некоторых пользователей есть пользовательские раскладки, а автокоррекция на смартфонах или другие системы помощи при написании часто автоматически исправляют слова, заменяя их на правильные «объединённые символы», например, «oeuvre» → «œuvre».

В настоящее время поиск обрабатывает «oe» и «œ» как разные строки, что приводит к разным результатам, которые должны быть одинаковыми.

Пример:
https://forum.monocycle.info/search?q=coeur
https://forum.monocycle.info/search?q=cœur

Мое предложение заключается в том, чтобы «oe» и «œ», «OE» и «Œ» обрабатывались как идентичные строки. То же самое относится к «ae» и «æ», «AE» и «Æ».

9 лайков

Очень интересная проблема, @zogstrip / @j.jaffeux, что вы думаете? Мы могли бы добавить нормализатор за настройкой сайта.

3 лайка
SELECT to_tsvector('french', E'Cette oeuvre d\'art n\'est pas une œuvre.');
            to_tsvector             
------------------------------------
 'art':4 'cet':1 'oeuvr':2 'œuvr':9
(1 row)

По каким-то причинам я думал, что обработка диакритических знаков, лигатур и подобного уже решённая задача при работе с поиском… Похоже, что нет? :man_shrugging:

Как :fr: я однозначно поддерживаю это. Похоже, мы могли бы использовать unaccent из PostgreSQL, который удаляет ударения и также работает с распространёнными лигатурами.

SELECT to_tsvector('french', unaccent('œuvre poêle œuf Noël électroencéphalogramme æ Æ'));
                               to_tsvector                               
-------------------------------------------------------------------------
 'ae':6,7 'electroencephalogramm':5 'noel':4 'oeuf':3 'oeuvr':1 'poel':2
(1 row)
4 лайка

А как француз, вы тоже ненавидите эту бесполезную сложность этого (хоть и интересного) языка так же сильно, как и я? :smile:
Извините за небольшой оффтоп с юмором

4 лайка

Думаешь, нам стоит просто доработать реализацию search_ignore_accents, чтобы использовать unaccent, или потребуется новое отдельное настройка?

Мне больше нравится просто изменить реализацию игнорирования акцентов, так как это обеспечивает соответствие тому, что делает PG.

3 лайка

Отличный вопрос :thinking:

Это определённо сработает для :fr:, но могут ли быть другие локали, где это не будет работать так, как ожидается?

После изучения файлов /usr/share/postgresql/13/tsearch_data/unaccent.rules кажется, что это вполне безопасно.

Я однозначно поддерживаю переход нашей настройки search_ignore_accents на использование unaccent от PostgreSQL :+1:

@nbianca, не могли бы вы добавить это в свой список?

3 лайка

В этом PR я заменил нашу старую реализацию на Ruby на unaccent в PostgreSQL:

5 лайков

Эта тема была автоматически закрыта через 3 дня. Новые ответы больше не допускаются.