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
相关产品推荐
相关产品推荐

