【问题标题】:How can I speed up regex querying in PostgreSQL database with django如何使用 django 加快 PostgreSQL 数据库中的正则表达式查询
【发布时间】:2019-04-03 11:23:21
【问题描述】:

我正在尝试为我的 PostgreSQL 数据库创建正则表达式查询。我已经完成了,但问题是使用正则表达式的查询比我按名称搜索的查询慢 3 倍。有什么方法可以加速正则表达式查询或任何其他选项来更快地获得结果?我使用 django 创建对数据库的查询。

我按品牌和型号搜索汽车的“正常”查询:

object_db = Car.objects.filter(brand='Ford', car_model='Focus-RS')

我创建这样的正则表达式查询:

object_db = Car.objects.filter(brand__regex=r'^Ford$', car_model__regex='^Focus[-_]*RS$')

我的模特:

class Car(models.Model):
    car_data = models.ForeginKey(CarData, on_delete=models.CASCADE)
    brand = models.CharField(max_length=100)
    car_model = models.CharField(max_length=100)

    class Meta:
         index_together = (
             ('brand', 'car_model')
         ) 

我得到了我想要的结果,但是需要很长时间才能得到它。如何提高正则表达式查询的速度,或者有没有其他方法可以得到相同的结果?

【问题讨论】:

  • 这些正则表达式的速度很快。如果您不满意,请切换到非正则表达式方法。
  • 您是否将brandcar_model 一起编入索引?
  • 你这是什么意思? @dirkgroten
  • 你也可以使用icontainsCar.objects.filter(brand__icontains="Ford", car_model__icontains='Focus')
  • 是否有任何其他选项可以在不使用正则表达式的情况下获得相同的结果? @WiktorStribiżew

标签: python regex django postgresql


【解决方案1】:

您可以使用iexact 并使用Q 组合查询:

object_db = Car.objects.filter(
    brand__iexact="ford", 
    Q(car_model__iexact="focus-rs") | Q(car_model__iexact="focus_rs"))

这将匹配不区分大小写并对car_model 字段执行“或”查询。

【讨论】:

  • 我假设这被选为 OP 不需要原始查询中的 * 的正确答案
猜你喜欢
  • 1970-01-01
  • 2013-04-27
  • 2015-08-25
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多