Postgres 全文搜索 - 查找其他类似文档

Postgres Full Text Search - Find Other Similar Documents

我正在寻找一种使用 Postgres(版本 9.6+)全文搜索来查找与输入文档相似的其他文档的方法 - 本质上是在寻找一种方法来产生与 Elasticsearch's more_like_this 查询相似的结果。据我所知,Postgres 无法提供相互比较 ts_vectors 的方法。

我尝试过各种技术,例如将源文档转换回 ts_query,或重新处理原始文档,但这需要太多开销。

非常感谢任何建议 - 谢谢!

看起来唯一的选择是使用 pg_trgm 而不是内置全文搜索的 Postgres。以下是我最终实现此功能的方式:

使用简单的 table(或本例中的物化视图)- 它包含 post 的主键和两列中的全文正文。

Materialized view "public.text_index"
Column |  Type   | Collation | Nullable | Default | Storage  | Stats target | Description 
--------+---------+-----------+----------+---------+----------+--------------+-------------
id     | integer |           |          |         | plain    |              | 
post   | text    |           |          |         | extended |              | 

View definition:
SELECT posts.id,
posts.body AS text
FROM posts
ORDER BY posts.publication_date DESC;

然后使用横向连接,我们可以匹配行并按 similarity 对它们进行排序,以找到与任何其他 post“接近”或“相关”的 post:

select * from text_index tx 
left join lateral (
  select similarity(tx.text, t.text) from text_index t where t.id = 12345
) s on true 
order by similarity 
desc limit 10;

这当然是一种简单的文档匹配方式,可能需要进一步调整。此外,在文本列上使用 tgrm gin 索引将显着加快搜索速度。