使用数组搜索 Postgres 数组

Posted

技术标签:

【中文标题】使用数组搜索 Postgres 数组【英文标题】:Search through a Postgres array with an array 【发布时间】:2016-08-14 20:39:02 【问题描述】:

我想将主题标签添加到功能中,并且我想简单地将它们存储为每个对象的数组,然后我会让用户使用他们自己的标签(标签数组)搜索项目并然后执行搜索。有什么好办法吗?

例如: 数据库中的标签:

row 1: ['red', 'blue', green']
row 2: ['orange', 'blue']
row 3: ['blue', 'green']

然后用户搜索会是这样的:

['red', 'green']

结果将是第 1 行和第 3 行。

这是一种非常缓慢且低效的存储方式吗?如果我以这种方式为用户提供多个搜索选项,我将如何获得最佳性能?

【问题讨论】:

那是我的错!哈哈,我会解决的! 为了性能优化,你需要提供更多信息,从你的Postgres版本开始,表定义,基数,最小值,最大值,平均值:数组长度,属性长度,搜索中的属性数量,数量的查询。读/写模式?这一切都取决于...按照tag info for [postgresql-performance] 中的说明进行操作 【参考方案1】:

这里有两种方法:

    按照您的建议使用 Postgres 数组。 这使您的行易于阅读并且相当简单。如果需要,它还允许您对标签进行排序,而无需单独存储索引。如果你走这条路,你应该使用&& operator 来确定搜索标签是否与其他标签重叠(例如,而不是在循环中运行查询)。 使用单独的表来存储对象标签关联。在这样的表中,一列是 tag(或 tag_id,如果您想稍后修改标签元数据),另一列是与标签关联的 object_id。您可以将多个标签与同一个对象关联,也可以将多个对象与同一个标签关联。然后,您可以在此表上使用标准 join 和 in filter 来获取与您请求的标签匹配的所有对象 ID。这是不支持数组的数据库管理系统通常使用的方法。

【讨论】:

很抱歉我花了这么长时间才接受这个!但是我刚刚把程序的这一部分写出来了,第一部分效果很好!非常感谢!

以上是关于使用数组搜索 Postgres 数组的主要内容,如果未能解决你的问题,请参考以下文章

使用 typeorm 在 postgres 中搜索数组中的项目

Postgres:用于一对多搜索的浮点数组的余弦相似度索引

数组与 Postgres 中的数组重叠

在 Postgres JSON 数组中查询

Postgres将所有数组值与和条件匹配到同一列

postgres:使用子查询设置数组的值?