【问题标题】:Optimizing postgres contains (LIKE) query in django for CHAR field在 django 中为 CHAR 字段优化 postgres contains (LIKE) 查询
【发布时间】:2017-06-05 06:04:49
【问题描述】:

所以我在我的 Django (postgres) 后端有一个搜索端点的查询,如下所示:

widgets = Widgets.objects.\
    filter(user=request.user).\
    filter(title__icontains="marketing director").\
    distinct('url')[:250]

title 是一个 CHAR 字段(models.CharField(max_length=255, blank=True) 在 django 中)。

contains 这里当然相当于 Postgres 中的 '%LIKE%' 查询。我特别想要这个(即:不是中缀'LIKE%' 搜索)。

我想加快查询速度。

似乎大多数 postgres 文本搜索的优化只针对 TEXT 字段 - 有没有办法加快对 CHAR 列的精确字符串搜索?

我可以使用 Postgres trigram 索引,但我实际上不需要模糊/拼写错误类型的搜索。不过如果出于某种原因它实际上更快,我会很乐意使用它。

或者我是否最好将这些列转换为 TEXT,承受存储量增加的影响,并以某种方式更好地为它们编制索引?

【问题讨论】:

  • 这些都很棒,但我没有看到完整的性能细分,也没有看到什么是最快的。
  • 您应该包括一些您正在执行查询的数据示例以及data['query'] 实际可能包含的内容。这是因为例如提到的文本搜索功能适用于单词/词素的文档,但您当前正在对字符串执行模式匹配。
  • @IljaEverilä 完成

标签: python django postgresql


【解决方案1】:

唯一的方法是使用一个以%开头的LIKE模式的索引(不是在开头锚定)是使用三元组索引.

将属性定义为charactertext 无关紧要,因为无论如何它们都会转换为text

您的数据是否包含大量尾随空格?除此之外,我看不出text 会如何浪费存储空间。

【讨论】:

  • 好的,很有趣。不,不是很多尾随空格。三元组索引在普通 LIKE 查询上的性能加速(一般来说)是多少?加速是否随数据库中添加的行数线性变化?
  • 索引访问的开销通常随着行数的增加呈对数增长。使用 trigram 索引,您会在搜索字符串较短时得到不好的结果,因为它们会导致大量误报命中。使用示例大小的字符串,它应该可以正常工作。
  • 所以在您的估计中,三元组索引会比普通的 LIKE 查询更快?
  • 是的,除非搜索模式很短。
猜你喜欢
  • 2019-07-21
  • 2022-01-24
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 2012-05-08
  • 2015-09-13
相关资源
最近更新 更多