如何在postgresql的全文搜索中找到相似的词?

How to find similar words in Full text search on postgresql?

我正在尝试在 postgresql 上使用全文搜索:

select *
from entertainement
where to_tsvector('simple', name) @@ to_tsquery('simple', 'word_to_search:*')

这个查询很好用,给我想要的东西 display.However 我在一些网站上发现,当我输入一个没有找到的词时,它会显示 No result found for 'word_to_search' 并给我一些其他的建议一些类似的词。 例如,如果我输入 activityng 这个词,我会得到

No result found for activityng

但是它给了我一些包含词activity的命题。但是,当我输入 activityns 这个词时,我得到了:

No result found for activityns

但是我得到了一些包含activities这个词的命题。我不明白它的逻辑,因为我认为 activitns 类似于 activity 而不是 activities。 我试图使用 pg_trgmsimilarity 来了解这个词的相似性,我得到:

select similarity('activity','activityns');
similarity: 0,6666667

select similarity('activities','activityns');
similarity: 0,4666667

是否有任何其他解决方案来检测单词之间的相似性并给出更精确的结果?

FTS先将token缩减为lexeme,然后进行比较,trigram比较三个字母——你不能用如此不同的算法比较比较结果,这里是FTS的例子(说明为什么你的样本中一个更接近另一个):

t=# with w(v) as (values('activityns'),('activity'),('activities'),('activit'))
select to_tsvector(v),v, to_tsvector(v) @@ to_tsquery('activ:*'),to_tsvector(v) @@ to_tsquery('activity'),to_tsvector(v) @@ to_tsquery('activit:*') from w;
  to_tsvector  |     v      | ?column? | ?column? | ?column?
---------------+------------+----------+----------+----------
 'activityn':1 | activityns | t        | f        | t
 'activ':1     | activity   | t        | t        | f
 'activ':1     | activities | t        | t        | f
 'activit':1   | activit    | t        | f        | t
(4 rows)

查看该词被缩减为哪个词位(第一列),并根据该词被缩减为的词位(第 3、4、5 列)查看通配符用法的结果