sql - 在 Postgres 中对搜索结果进行排名
问题描述
这可能有一个非常简单的解决方案,但我刚刚开始学习,所以我不知道。
我有一个包含一些化学数据的数据库,其中有 2 列感兴趣的搜索:
- 复合名称 -> 每个有一个复合名称(1 到 5 个单词)
- 每个中的复合同义词(最多 200 个不同的词)
1 包含化合物的名称,2 包含化合物的同义词。我用这个为这两列创建了一个向量列:
alter table compound
add column document_vector_weights tsvector;
update compound
set document_vector_weights = setweight(to_tsvector(coalesce(cmpdname, '')), 'A') ||
setweight(to_tsvector(cmpdsynonym), 'D');
CREATE INDEX document_weights_index
on compound
USING GIN (document_vector_weights)
如您所见,我希望化合物的名称具有最大的权重。
问题是,即我正在搜索术语“丙烯”,它是一种化合物,我得到以下结果:
“丙二醇”和“碳酸丙烯酯”出现在“丙烯”本身之前。发生这种情况是因为“丙烯”一词多次出现在这两种化合物的同义词栏中,即使它们的重量是“D”。
我想提出一个条件——>如果确切的搜索词出现在“名称”列中,那么无论它在其他列中出现多少次,它都应该是排名靠前的那个。
有没有办法可以做到这一点?
编辑:
示例数据 - 此处“|||” 是一个列分隔符 这是我在搜索该术语时得到的结果,Propylene
它位于第 3 位。我希望它位于第 1 位。
compounddname ||| compoundsynonym
"Propylene glycol" ||| 1,2-propanediol|propylene glycol|propane-1,2-diol|57-55-6|1,2-Propylene glycol| ...etc
"Propylene carbonate" ||| PROPYLENE CARBONATE|108-32-7|4-Methyl-1,3-dioxolan-2-one|1,2-Propylene carbonate|1,2-Propanediol cyclic carbonate|...etc
"Propylene" ||| PROPYLENE|Propene|1-Propene|Methylethylene|prop-1-ene|Methylethene|1-Propylene|...etc
"1-Methoxy-2-propanol" ||| 1-Methoxy-2-propanol|107-98-2|1-Methoxypropan-2-ol|Methoxyisopropanol|PGME|...etc
"Poloxalene" ||| Poloxalene|Poloxamer 188|Pluronic|Poloxalkol|9003-11-6|Poloxamer 407|Pluronic L 61|...etc
compoundsynonym
正如您在前两行(“丙二醇”和“碳酸丙烯酯”的同义词)中看到的那样,“丙烯”一词在该列中出现了多次。这会影响排名结果。
我想要的 => 如果我搜索该术语Propylene
并在compoundname
列中找到完全匹配,则称重系统不应影响其排名,它应该具有排名 1,因为它与任何化合物的名称完美匹配。现在它排名第 3。发生这种情况是因为该术语在排名前两个化合物的列中Propylene
多次可用。compoundsynonym
您可以查看我是否复制并粘贴第一个同义词单元格,它看起来像这样: 在此处输入图像描述
解决方案
我找到了解决此问题的方法,方法是在对结果进行排名时更改 A、B、C 和 D 的默认值。我是这样做的:
select *, ts_rank( '{0,0,0.10,1}', document_vector_weights, plainto_tsquery('propylene')) as rank_a
from compound where document_vector_weights @@ plainto_tsquery('propylene')
order by rank_a desc;
这里{0,0,0.10,1}
分别是 D、C、B 和 A 的值。我减少了 to 的值,D
因此0
化合物的名称将具有最大的权重。
推荐阅读
- mysql - 如何在特定 AI ID 之前获取行数?
- android - 当应用程序关闭时,这个 Runnable 会导致内存泄漏吗?
- testing - 无法通过钩子将标头值添加到 HTTP 请求
- gradle - 有没有办法忽略 gradle 构建配置中依赖项的警告?
- json - AWS Athena 取消嵌套
- python-3.x - or-tools 为 tsp 设置自定义成本
- environment-variables - 如何将 env 变量连接到 YAML 文件中的字符串
- javascript - 在节点画布中水平旋转图像?
- sql - 如何在 Snowflake 中选择包含假数据的多行
- python - Vowpal Wabbit:找不到命令