如何在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_trgm
的 similarity
来了解这个词的相似性,我得到:
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 列)查看通配符用法的结果
我正在尝试在 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_trgm
的 similarity
来了解这个词的相似性,我得到:
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 列)查看通配符用法的结果