关于法语搜索处理(“œ”和“æ”特殊字符)的改进建议

一些法语单词使用以下字符:

  • Œ, œ,例如在 œ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 这是一个非常有趣的问题,您怎么看?我们可以添加一个由站点设置支持的 normalizer。

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 中用 Postgresql 的 unaccent 替换了我们旧的 Ruby 实现:

5 个赞

此主题已在 3 天后自动关闭。不再允许回复。