3

如何将不区分重音的搜索添加到django 文档中的以下片段:

>>> from django.contrib.postgres.search import TrigramSimilarity
>>> Author.objects.create(name='Katy Stevens')
>>> Author.objects.create(name='Stephen Keats')
>>> test = 'Katie Stephens'
>>> Author.objects.annotate(
...     similarity=TrigramSimilarity('name', test),
... ).filter(similarity__gt=0.3).order_by('-similarity')
[<Author: Katy Stevens>, <Author: Stephen Keats>]

这怎么可能匹配test = 'Kâtié Stéphèns'

4

1 回答 1

8

存在非重音查找:

重音查找允许您使用专用的 PostgreSQL 扩展执行不区分重音的查找。

此外,如果您查看 django 文档的聚合部分,您可以阅读以下内容:

当在聚合函数中指定要聚合的字段时, Django 将允许您使用与在过滤器中引用相关字段时使用的相同的双下划线表示法。然后,Django 将处理检索和聚合相关值所需的任何表连接。


从以上推导:

您可以使用trigram_similar查找,结合unaccent, 然后annotate在结果上:

Author.objects.filter(
    name__unaccent__trigram_similar=test
).annotate(
    similarity=TrigramSimilarity('name__unaccent', test),
).filter(similarity__gt=0.3).order_by('-similarity')

或者

如果您想让它尽可能接近原始样本(并省略一个可能很慢的过滤,然后是另一个):

Author.objects.annotate(
    similarity=TrigramSimilarity('name__unaccent', test),
).filter(similarity__gt=0.3).order_by('-similarity')

这些仅适用于 Django 版本 >= 1.10


编辑:

虽然上面应该可以工作,@Private 报告这个错误发生了:

Cannot resolve keyword 'unaccent' into a field. Join on 'unaccented' not permitted.

这可能是一个错误,或者unaccent不打算以这种方式工作。以下代码可以正常工作而不会出现错误:

Author.objects.filter(
    name__unaccent__trigram_similar=test
).annotate(
    similarity=TrigramSimilarity('name', test),
).filter(similarity__gt=0.3).order_by('-similarity')
于 2017-05-08T10:12:22.403 回答