繁体   English   中英

如何将一个 tsvector 与另一个 tsvector 进行比较?

[英]How to compare a tsvector against another tsvector?

我正在尝试获取给定记录的“可能相关”记录。

表上有一个 tsvector (tsv),所以我在考虑如何将源 tsv 转换为 tsquery 格式,然后像普通排名搜索一样找到最密切相关的匹配项。

SELECT title,
    link,
    IMAGE,
    intro,
    created_at,
    updated_at,
    ts_rank_cd(tsv, q.match::tsquery) AS rank
FROM items,
    (
        SELECT tsv AS match
        FROM items
        WHERE id = 1234
        ) AS q
WHERE id <> 1234
ORDER BY rank DESC LIMIT 10;

有没有一个很好的方法来实现这一目标?

我四处闲逛,似乎没有一种简单的方法可以做到这一点。 我想有效地做到这一点,您可能需要自己的C函数,该函数可以提供从一个tsvector到另一个tsvector的距离(然后可以使用KNN搜索)。

无论哪种方式,都没有一种非常简单的方法来完成,这可能需要大量工作,但是似乎这应该是一个普遍适用的问题,因此整个社区可能会对解决方案感兴趣。

请注意,这听起来并不简单。 假设我写了一本书,讲的是阿尔伯特·洛德(Albert Lord)的《故事的歌手》及其对诗歌公式的强调。 假设我称其为“艾伯特勋爵和言语之环”。 这将创建一个Albert:1 Lord:2 Ring:5 Words:7的向量, Albert:1 Lord:2 Ring:5 Words:7 of the Rings是Lord:2 Ring:5 ,这会产生非常错误的相似性。 如果涉及任何分类,那么您也想利用它。

您或许可以将 tsvector 与 pg_trgm 扩展的相似性进行比较。 是这样的:

SELECT title, similarity(STRIP(to_tsvector('english', title))::text, STRIP(to_tsvector('english', 'The Lord of the Rings'))::text) sim
FROM (VALUES
    ('Albert Lord and the Ring of Words'),
    ('The Ring of Words'),
    ('Albert Lord')
) t(title)
ORDER BY sim DESC

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM