【问题标题】:Using unaccent with SearchVector and SearchQuery in Django在 Django 中将 unaccent 与 SearchVector 和 SearchQuery 一起使用
【发布时间】:2017-11-10 20:23:23
【问题描述】:

我在 Django 中安装了 UnaccentExtension,但在使用它时遇到了问题:

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

这是错误:

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

最简单的搜索就可以了:

Doc.objects.filter(title__unaccent=word)

那么,我做错了什么?

【问题讨论】:

    标签: django postgresql full-text-search


    【解决方案1】:

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

    1. 如果你错过了,installs the unaccent extension
    2. 在 PostgrSQL 中创建您的非重音字典或使用带有此 SQL 的 empty migrations

      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;
      
    3. 在你的 Django 查询中使用这个配置:

      SearchVector('title','abstract', config='french_unaccent')
      SearchQuery(word, config='french_unaccent')
      

    您可以在各种articles 上的official PostgreSQL documentation 中找到有关此类配置的更多信息

    【讨论】:

    • 创建该配置我可以使用文章中介绍的 SQL 在 Postgres 中正确执行查询,但在 Django 中我遇到了同样的问题。
    • 问题已解决,我正在使用不同于 Django 中使用的 postgres 用户进行文本搜索配置
    • 您的答案是正确的,但由于用户的问题,它无法正常工作,所以现在一切正常。
    • 我用法语词典对此进行了测试,它仍然像 Postgresql 14 和 Django 3.2 的魅力一样工作!
    • @jeromecc 感谢您告诉我们这个解决方案仍然适用于最新版本的 PostgreSQL 和 Django
    猜你喜欢
    • 2018-09-26
    • 2018-08-06
    • 2018-04-24
    • 2015-11-03
    • 1970-01-01
    • 2013-06-19
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多