【发布时间】:2017-10-15 21:41:48
【问题描述】:
我正在尝试弄清楚如何将TrigramSimilarity 与unaccent 一起用于多个字段。
到目前为止我有:
def filter_by_location(self, queryset, location):
log.info('Filtering location: "{location}"'.format(**locals()))
queryset = queryset.filter(
Q(accommodation__district__name__unaccent__trigram_similar=location) |
Q(accommodation__municipality__name__unaccent__trigram_similar=location) |
Q(accommodation__settlement__name__unaccent__trigram_similar=location)
)
但我在documentation 中读到我可以通过similarity 订购(不确定上面的代码是否自动执行此操作),所以我尝试这样做:
queryset = queryset.filter(
Q(accommodation__district__name__unaccent__trigram_similar=location) |
Q(accommodation__municipality__name__unaccent__trigram_similar=location) |
Q(accommodation__settlement__name__unaccent__trigram_similar=location)
).annotate(
similarity=TrigramSimilarity(
'accommodation__district__name', location
) + TrigramSimilarity(
'accommodation__municipality__name', location
) + TrigramSimilarity(
'accommodation__settlement__name', location
),
).filter(similarity__gt=0.3).order_by('-similarity')
我很快意识到TrigramSimilarity 中的+ 没有在做OR,但我需要在所有这些不同的字段中进行全文搜索。
考虑到查询性能,我实现这一目标的正确语法是什么(使用OR 而不是AND)?
谢谢
【问题讨论】:
标签: django postgresql full-text-search