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;