搜索引擎,如PostgreSQL中的全文搜索

问题描述 投票:0回答:1

我在表中有标题和描述的列表,这些标题和描述在tsvector列中建立索引。如何在Postgres中为这些字段实现Google Search之类的全文搜索功能。我尝试了标准Postgres提供的各种功能,例如

to_tsquery('apple | orange') -- apple | orange

此函数只要具有以下一项,就返回行,因此它在顶部不会产生高度相关的结果,而应同时具有这两项。

plainto_tsquery('apple orange') -- apple & orange

此功能需要查询中的所有术语。但是我希望结果既包括苹果又包括橙子,但是即使在结果的后面,甚至仍然可以包含这些术语之一。

phraseto_tsquery('apple orange') -- apple <> orange

此功能仅匹配orange,后跟apple,但不匹配。但是对我来说orange <> apple仍然很重要。

我也尝试过websearch_to_tsquery(),但其行为与上述功能非常相似。

我如何要求Postgres首先列出高度相关的行,无论这些词的顺序如何,该行都包含搜索查询中的大多数词,然后再列出数量较少的行?

postgresql search full-text-search
1个回答
0
投票
to_tsquery('apple | orange')   --  apple | orange

此函数只要具有以下一项,就返回行,因此它在顶部不会产生高度相关的结果,而应同时具有这两项。

除非您告诉它如何对行进行排序,否则单个查询的行将以任意顺序返回。没有ORDER BY,就没有“顶部”,只有一些首先出现。

我如何要求Postgres首先列出高度相关的行,无论这些词的顺序如何,该行都包含搜索查询中的大多数词,然后再列出数量较少的行?

使用|运算符,然后使用ts_rank,ts_rank_cd或您自己编写的自定义排名函数对这些行进行排名。为了提高性能,您可能需要先使用&运算符,然后如果没有足够的行,则使用|

内置的排名功能不关心顺序,也不关心邻近度。因此他们可能不会做您想要的。但是编写自己的书并不是特别容易,所以我至少要先尝试一下。

如果引入websearch_to_tsquery或phraseto_tsquery也已经引入了一些相应的排名功能,那将很好。但是,由于他们仅发明了有序的邻近性,而不是没有秩序的邻近性,因此如果它们确实存在,他们不太可能会想要。

© www.soinside.com 2019 - 2024. All rights reserved.