如何在postgresql上的全文搜索中找到类似的单词?

时间:2017-11-09 11:50:56

标签: sql postgresql full-text-search similarity

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

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

这个查询效果很好,并且给了我想要显示的内容。但是当我输入一个未找到的单词时,我在某些网站上找到了它,它显示了No result found for 'word_to_search'并给了我一些其他类似于它。 例如,如果我将单词activityng放入

No result found for activityng

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

No result found for activityns

但是我得到了一些包含activities这个词的命题。我没有理解它的逻辑,因为我的活动类似于activity而不是activities。 我尝试使用similarity的{​​{1}}知道这个单词的相似性,我得到了:

pg_trgm

是否还有其他方法可以检测单词之间的相似性并提供更精确的结果?

1 个答案:

答案 0 :(得分:1)

FTS首先将令牌缩减为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)列