在Django中将unaccent与SearchVector和SearchQuery一起使用

Ala*_*vas 5 django postgresql full-text-search

我已经在Django中安装了UnaccentExtension,但是在此搜索中使用它时遇到了问题:

vector = SearchVector('title__unaccent', 'abstract__unaccent')
query = SearchQuery(word) | SearchQuery(word2)
files = Doc.objects.annotate(rank=SearchRank(vector, query)).order_by('-rank')
Run Code Online (Sandbox Code Playgroud)

这是错误:

无法将关键字“ unaccent”解析为字段。不允许加入“标题”。

惠特最简单的搜索效果很好:

Doc.objects.filter(title__unaccent=word)
Run Code Online (Sandbox Code Playgroud)

那么,我在做什么错呢?

Pao*_*rre 8

您不能在“SearchVector”中使用“unaccent”,但必须在 PostgreSQL 中定义一个新的“unaccent”配置。

  1. 如果您错过了,请安装 unaccent 扩展
  2. 在 PostgrSQL 中创建您的无重音字典或使用此 SQL的空迁移

    CREATE TEXT SEARCH CONFIGURATION french_unaccent( COPY = french );
    ALTER TEXT SEARCH CONFIGURATION french_unaccent
    ALTER MAPPING FOR hword, hword_part, word
    WITH unaccent, french_stem;
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在 Django 查询中使用此配置:

    SearchVector('title','abstract', config='french_unaccent')
    SearchQuery(word, config='french_unaccent')
    
    Run Code Online (Sandbox Code Playgroud)

您可以在各种文章官方 PostgreSQL 文档中找到有关此类配置的更多信息