我对Postgres FTS还是陌生的,但试图使其正常工作并遇到完全匹配和部分匹配之间的问题。
考虑一下,我有一个带有列package_id
的表,该列是各种软件包的ID。这些ID是字符串,可以是带有句点的单个或多个单词。
我可以具有以下行值:
Microsoft.AspNetCore
Microsoft.AspNetCore.All
Microsoft.AspNetCore.Mvc
依此类推...
然后我有一个名为tsvector
的{{1}}列,我这样计算(其中包括其他列,但为简便起见,我对其进行了简化):
search_tokens
目标是对此进行查询并获得排名最高的不同软件包的列表。
为此,我有一个类似的查询:
setweight(to_tsvector(coalesce(package_id,'')), 'A')
例如,当我用WITH t AS (
SELECT
p.package_id,
ts_rank(p.search_tokens, to_tsquery('search term')) AS rank
FROM public.packages p
WHERE p.search_tokens @@ to_tsquery('search term')
)
SELECT
t.package_id,
max(t.rank) rank
FROM t
GROUP BY package_id
ORDER BY rank DESC, package_id ASC;
查询时,它将返回相应排名的多个匹配。
但是,如果我搜索microsoft
,则只会返回完全匹配的内容,例如不会看到microsoft.aspnetcore
。
我希望确切的匹配是排名最高,然后包含其他软件包,但排名较低。
我尝试了Microsoft.AspNetCore.*
,但这会产生异常的结果,并且可能会影响我遗漏的其他列。
我想念什么?