在对数万个音频文件进行AI文件分析之后,我在Postgres中得到了这种数据结构:
id | name | tag_1 | tag_2 | tag_3 | tag_4 | tag_5
1 | first song | rock | pop | 80s | female singer | classic rock
2 | second song | pop | rock | jazz | electronic | new wave
3 | third song | rock | funk | rnb | 80s | rnb标签位置非常重要:“向左”越多,它在歌曲中的位置就越突出。标签的数量也是有限的(50个标签),AI总是为每首歌返回其中的5个,没有期望的空值。
另一方面,我要质疑的是:
{"rock" => 15, "pop" => 10, "soul" => 3}键是标记名,值是任意权重。参赛人数可以从1到50之间随机。根据示例数据集,在这种情况下,它应该返回1,3,2
如果使用原始连接字符串可以更容易地实现数据重组,但是.使用Postgres ( is向量)是可行的吗?还是我真的要用类似于Elasticsearch之类的东西来搜索这个?
发布于 2022-05-27 08:28:07
经过大量的试验和错误之后,我最终只使用Postgres:
id | bpm | tag_1 | tag_2 | tag_3 | tag_4 | tag_5
1 | 114 | 1 | 2 | 3 | 4 | 5
2 | 102 | 2 | 1 | 6 | 7 | 8
3 | 110 | 1 | 9 | 10 | 3 | 12requests = [
"bpm BETWEEN 110 AND 124
AND tag_1 = 1
AND tag_2 = 2
AND tag_3 = 3
AND tag_4 = 4
AND tag_5 = 5",
"bpm BETWEEN 110 AND 124
AND tag_1 = 1
AND tag_2 = 2
AND tag_3 = 3
AND tag_4 = 4
AND tag_5 IN (1, 3, 5)",
"bpm BETWEEN 110 AND 124
AND tag_1 = 1
AND tag_2 = 2
AND tag_3 = 3
AND tag_4 IN (1, 3, 5),
AND tag_5 IN (1, 3, 5)",
....
]# Ruby / ActiveRecord example
track_ids = []
requests.each do |request|
track_ids += Track.where([
"(#{request})
AND tracks.id NOT IN ?", track_ids
]).pluck(:id)
break if track_ids.length > 200
end..。完事了!我所有的歌曲都是按照相似的顺序排列的,最接近的是顶部,越接近底部,就越接近。因为每件事都是关于整数的,所以它非常快(在100 K行数据集上足够快),并且输出看起来像纯魔术。额外的一点:它仍然很容易被整个团队调整和维护。
我确实理解这很粗糙,所以我愿意使用任何更有效的方法来做同样的事情,即使堆栈中需要其他东西(ES ?),但到目前为止:这是一个简单的解决方案,只是起作用了。
https://stackoverflow.com/questions/72345142
复制相似问题