【发布时间】:2017-11-23 10:55:18
【问题描述】:
假设我有下表:
class Word(Model):
id = UUIDField(primary_key=True,
default=uuid.uuid4,
editable=False)
name = CharField(_('Word'),
db_index=True,
max_length=250)
此表包含大约 300 万行。内容主要是西里尔文字。
我想要完成的是搜索一些预定义的值列表。问题是表中的单词有重音。
表格内容如下:
мо́рква
буря́к
я́блуко
但我查询时没有重音。
words = ['морква', 'буряк', 'яблуко']
Word.objects.annotated(name_without_accent=Func(
F('name'),Value('[%s]' % ACCENTS), Value(''),
function='regexp_replace',
)).filter(reduce(operator.or_, [Q(name_without_accent__icontains=w) for w in words], Q()))
问题是对这么大的表的查询运行时间很长。 words 列表可以包含更多元素(大约 20-30 个)。
有没有办法提高查询这么大表的整体性能? 改进 Django 查询?调整 Postgres?使用一些外部工具?
【问题讨论】:
标签: django postgresql django-models