首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于Postgres的加权+有序标记搜索

基于Postgres的加权+有序标记搜索
EN

Stack Overflow用户
提问于 2022-05-23 08:03:35
回答 1查看 41关注 0票数 1

在对数万个音频文件进行AI文件分析之后,我在Postgres中得到了这种数据结构:

代码语言:javascript
运行
复制
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个,没有期望的空值。

另一方面,我要质疑的是:

代码语言:javascript
运行
复制
{"rock" => 15, "pop" => 10, "soul" => 3}

键是标记名,值是任意权重。参赛人数可以从1到50之间随机。根据示例数据集,在这种情况下,它应该返回1,3,2

如果使用原始连接字符串可以更容易地实现数据重组,但是.使用Postgres ( is向量)是可行的吗?还是我真的要用类似于Elasticsearch之类的东西来搜索这个?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-27 08:28:07

经过大量的试验和错误之后,我最终只使用Postgres:

  1. 将所有数据集转换为整数,因此它将继续如下所示(我还添加了列以更紧密地匹配实际数据集) :

代码语言:javascript
运行
复制
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     | 12

  1. 存储数组中的请求作为字符串(请注意,我之前使用某种“请求生成器”对这些请求进行了净化):

代码语言:javascript
运行
复制
requests = [
  "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)",
   ....
]

  1. 简单地在请求数组中循环,从最精确的循环到最近似的数组:

代码语言:javascript
运行
复制
# 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 ?),但到目前为止:这是一个简单的解决方案,只是起作用了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72345142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档