フランス語の検索処理に関するわずかな改善提案(「œ」と「æ」の特殊文字について)

フランス語の単語には、次の文字が使用されることがあります。

  • Œ、œ、「œ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: として、私は間違いなくそれを支持します。アクセントを削除し、一般的な合字も処理するPostgreSQLの unaccent を使用できるようです。

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 設定を postgresql の unaccent を使用するように削除することを強く支持します :+1:

@nbianca これをリストに追加していただけますか?

「いいね!」 3

このPRで、古いRubyの実装をPostgresqlのunaccentに置き換えました。

「いいね!」 5

このトピックは3日後に自動的に閉じられました。新しい返信はもう許可されていません。