Postgresql Postgres全文搜索和拼写错误(又名模糊全文搜索)

Postgresql Postgres全文搜索和拼写错误(又名模糊全文搜索),postgresql,full-text-search,fuzzy-search,Postgresql,Full Text Search,Fuzzy Search,我有一个场景,我有非正式沟通的数据,我需要能够搜索。因此,我希望全文搜索,但我也有意识的拼写错误。问题是我如何考虑拼写错误,以便能够进行模糊全文搜索 这在本文讨论拼写错误的地方进行了非常简要的讨论 所以我建立了一个文档表,创建了索引等 CREATE TABLE data ( id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, text TEXT NOT NULL); 我可以创建一个tsvector类型的附加列,并相应地建立索引 a

我有一个场景,我有非正式沟通的数据,我需要能够搜索。因此,我希望全文搜索,但我也有意识的拼写错误。问题是我如何考虑拼写错误,以便能够进行模糊全文搜索

这在本文讨论拼写错误的地方进行了非常简要的讨论

所以我建立了一个文档表,创建了索引等

CREATE TABLE data (
  id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, 
  text TEXT NOT NULL);
我可以创建一个tsvector类型的附加列,并相应地建立索引

alter table data 
  add column search_index tsvector 
  generated always as (to_tsvector('english', coalesce(text, ''))) 
  STORED;

create index search_index_idx on data using gin (search_index);
例如,我有一些文本,其中数据显示baloon,但有人可能会搜索balloon,所以我插入两行,其中一行故意拼写错误

insert into data (text) values ('baloon');
insert into data (text) values ('balloon');

select * from data;

id |  text   | search_index
----+---------+--------------
 1 | baloon  | 'baloon':1
 2 | balloon | 'balloon':1
。。。并对数据执行全文搜索

select * from data where search_index @@ plainto_tsquery('balloon');

 id |  text   | search_index
----+---------+--------------
  2 | balloon | 'balloon':1
(1 row)
但是我没有收到拼错版本baloon的结果。。。因此,利用链接文章中的建议,我建立了一个查找表,列出了我词典中的所有单词,如下所示

通过在tsquery中添加类似的词素,可以获得良好的结果

。。。我可以搜索可能拼写错误的类似单词

从数据中选择单词,similarityword,'balloon'作为相似度,其中similarityword,'balloon'>0.4按similarityword,'balloon'排序

  word   | similarity
---------+------------
 baloon  |  0.6666667
 balloon |          1
。。。但我如何在查询中包含拼写错误的单词呢

这不是上面这篇文章的意思吗

select plainto_tsquery('balloon' || ' ' || (select string_agg(word, ' ') from data_words where similarity(word, 'balloon') > 0.4));

         plainto_tsquery
----------------------------------
 'balloon' & 'baloon' & 'balloon'
(1 row)
。。。插入实际搜索,我没有得到任何行

select * from data where text @@ plainto_tsquery('balloon' || ' ' || (select string_agg(word, ' ') from data_words where similarity(word, 'balloon') > 0.4));

select * from data where search_index @@ phraseto_tsquery('baloon balloon'); -- no rows returned

我不确定我在这里哪里出了问题——有什么能说明问题吗?我觉得我很快就要开始了…?

用于查询并在可选项之间用|构造一个字符串。哈哈,谢谢。。。。我可以做到这一点。。。从数据中选择文本,并按“搜索”索引中的“气球”进行正确搜索@从数据中选择“气球”并按“气球”索引中的“气球”顺序搜索单词%baloon;这真的是你应该做模糊全文搜索的方式吗?我的意思是,这有点奏效,但同时我也无法摆脱这样一种感觉:我错过了一些东西或很多东西……我想是的。PostgreSQL中没有关于模糊全文搜索的规定。你可以调查一本包含所有可能拼写错误的同义词词典。最终,这类查询与我想得到的最接近。。。谢谢你的帮助!选择文本,从数据中选择“baloon”,从数据中选择“baloon”,从数据中选择“baloon”,从数据中选择“baloon”,从数据中选择“baloon”,从数据中选择word%”“baloon”,按搜索索引“baloon”描述的顺序排列;
SELECT to_tsquery('balloon |' ||
                  string_agg(word, ' | ')
       )
FROM data_words
WHERE similarity(word, 'balloon') > 0.4;
SELECT to_tsquery('balloon |' ||
                  string_agg(word, ' | ')
       )
FROM data_words
WHERE similarity(word, 'balloon') > 0.4;