gpt4 book ai didi

postgresql - 在 postgresql 中使用 to_tsvector 和 to_tsquery 处理拼写错误

转载 作者:行者123 更新时间:2023-11-29 12:52:39 25 4
gpt4 key购买 nike

我有一个包含这些字段的简单表格 enter image description here

最后两个字段用于对一个使用 tsvector 数据类型的索引,另一个使用文本数据类型的索引。

我想对名称或 ID 执行查询。我正在做这个

SELECT * FROM foo WHERE foo.searchtext @@ to_tsquery('1234 & abcd');  

它工作正常,但现在我希望删除拼写错误,例如,如果名称是 abcd 我输入 abbd 那么它应该获得所有可能的值。我见过 pg_tgrm() 但它 does not使用整数或 tsvector

还有其他选项,我尝试使用 pg_tgrm() ,就像我将索引存储在另一个字段 searchtextstring 中,类型为文本和查询

select *
from foo
where searchtextstring % '123' and searchtextstring % 'abbd';

但我认为这效率不高,而且对于拼写错误也不起作用。

如何使用 to_tsquery 处理拼写错误?

最佳答案

全文搜索仅忽略词干和大小写的差异,它不允许您根据相似性查找匹配项。

pg_trgm 是正确的选择。

我使用这个示例表:

CREATE TABLE foo (id integer PRIMARY KEY, searchtextstring text);

INSERT INTO foo VALUES (1, 'something 0987');
INSERT INTO foo VALUES (2, 'abbd 1224');

CREATE INDEX ON foo USING gist (searchtextstring gist_trgm_ops);

这太小了,PostgreSQL 将始终使用顺序扫描,因此,如果可能的话,让我们强制 PostgreSQL 使用索引(以便我们可以模拟更大的表):

SET enable_seqscan = off;

现在我们来查询:

EXPLAIN (COSTS off)
SELECT * FROM foo WHERE searchtextstring % '1234'
AND searchtextstring % 'abcd';

QUERY PLAN
--------------------------------------------------------
Index Scan using foo_searchtextstring_idx on foo
Index Cond: ((searchtextstring % '1234'::text)
AND (searchtextstring % 'abcd'::text))
(2 rows)

索引用得很好,一次索引扫描!

但是查询没有返回任何行:

SELECT * FROM foo WHERE searchtextstring % '1234'
AND searchtextstring % 'abcd';

id | searchtextstring
----+------------------
(0 rows)

这并不是因为“它不起作用”,而是因为单词不够相似。不要忘记,四个字母的单词中没有那么多卦象,所以如果你改变一个字母,它们就不再那么相似了。这并不奇怪,对吧?

所以我们必须降低相似度阈值才能得到结果;

SET pg_trgm.similarity_threshold = 0.1;

SELECT * FROM foo WHERE searchtextstring % '1234'
AND searchtextstring % 'abcd';

id | searchtextstring
----+------------------
2 | abbd 1224
(1 row)

关于postgresql - 在 postgresql 中使用 to_tsvector 和 to_tsquery 处理拼写错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50344254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com