Postgres FTS在存在完全匹配项时忽略部分匹配项

时间:2019-07-12 18:03:50

标签: postgresql full-text-search

我对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.*,但这会产生异常的结果,并且可能会影响我遗漏的其他列。

我想念什么?

0 个答案:

没有答案