You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Wagtail+PostgreSQL搜索后端:英文配置unaccent无效问题排查

Wagtail数据库搜索后端unaccent扩展配置不生效问题

负责的几个欧洲站点以英语为通用语言,但内容中包含大量带扩展拉丁字符的人名和地名。已在PostgreSQL中配置unaccent扩展及自定义搜索配置,但Wagtail搜索时unaccent功能未生效。

已完成的配置步骤

1. PostgreSQL端配置

添加unaccent扩展,并基于内置英文搜索配置创建english_extended自定义配置:

CREATE TEXT SEARCH CONFIGURATION english_extended ( COPY = english );
ALTER TEXT SEARCH CONFIGURATION english_extended
    ALTER MAPPING FOR hword, hword_part, word
    WITH unaccent, english_stem;

2. Wagtail搜索后端配置

在项目配置中指定数据库搜索后端及对应搜索配置:

WAGTAILSEARCH_BACKENDS = {
    'default': {
        'BACKEND': 'wagtail.search.backends.database',
        'SEARCH_CONFIG': 'english_extended',
    },
    'es': {
        'BACKEND': 'wagtail.search.backends.database',
        'SEARCH_CONFIG': 'spanish',
    },
}

测试结果对比

PostgreSQL命令行测试

有一页面标题包含Bodø,测试结果如下:

  • 使用默认搜索无结果:
# select title from wagtailcore_page where to_tsvector(title) @@ to_tsquery('Bodo');
 title 
-------
(0 rows)
  • 使用english_extended配置可正常找到页面:
# select title from wagtailcore_page where to_tsvector('english_extended', title) @@ to_tsquery('Bodo');
                       title                        
----------------------------------------------------
 The old dock at Kjerringøy, Bodø, Nordland, Norway
(1 row)

以上说明数据库端的english_extended配置中unaccent功能正常。

Wagtail内部测试

通过Django shell测试,结果不符合预期:

In [1]: from wagtail.search.backends import get_search_backend

In [2]: s=get_search_backend()

In [3]: s.config
Out[3]: 'english_extended'

In [4]: s.search('bodø', Page.objects.all())
Out[4]: <SearchResults []>

In [5]: s.search('bodo', Page.objects.all())
Out[5]: <SearchResults []>

In [6]: s.search('Bodø', Page.objects.all())
Out[6]: <SearchResults []>

In [7]: s.search('dock', Page.objects.all())
Out[7]: <SearchResults [<Page: The old dock at Kjerringøy, Bodø, Nordland, Norway>]>

但使用西班牙语后端时,无重音术语可正常搜索到对应内容:

In [1]: from wagtail.search.backends import get_search_backend

In [2]: s=get_search_backend('en')

In [3]: s.search('jeremy' , Page.objects.all())
Out[3]: <SearchResults []>

In [4]: s.search('Jérémy' , Page.objects.all())
Out[4]: <SearchResults []>

In [5]: s=get_search_backend('es')

In [6]: s.config
Out[6]: 'spanish'

In [7]: s.search('jeremy' , Page.objects.all())
Out[7]: <SearchResults [<Page: Jérémy in the title>]>

疑问

是否遗漏了某个配置步骤,或是Wagtail搜索引擎存在此类问题?

内容的提问来源于stack exchange,提问作者Rich - enzedonline

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:05:47