我试图在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
是否还有其他方法可以检测单词之间的相似性并提供更精确的结果?
答案 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)列