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 索引将显着加快搜索速度。
我正在寻找一种使用 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 索引将显着加快搜索速度。