作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究 PostgreSQL 全文搜索,想知道是否可以搜索复合词的第二部分。
当我搜索“蛋糕”时,有没有办法得到“芝士蛋糕”?
-- Lets have a table like this:
CREATE TABLE IF NOT EXISTS table1(
id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
col1 TEXT,
col1_tsv TSVECTOR
);
CREATE INDEX IF NOT EXISTS col1_index ON table1 USING gin(col1_tsv);
-- Insert some data into it:
INSERT INTO table1 (col1, col1_tsv)
VALUES ('Blacklist', TO_TSVECTOR('Blacklist')),('Cheesecake', TO_TSVECTOR('Cheesecake'));
如果我搜索“蛋糕”或“列表”,我不会得到任何结果。
SELECT col1 FROM table1 WHERE col1_tsv @@ to_tsquery('english', 'list');
SELECT col1 FROM table1 WHERE col1_tsv @@ to_tsquery('english', 'cake');
用 ts_lexize 检查它:
select ts_lexize('english_stem','Blacklist');
select ts_lexize('english_stem','Cheesecake');
输出:
ts_lexize
-------------
{blacklist}
(1 row)
ts_lexize
-------------
{cheesecak}
(1 row)
按设计工作,但有没有办法只通过搜索蛋糕来获得芝士蛋糕?
select * from table1 where col1 like '%cake%';
当我选择整张 table 时,芝士蛋糕也被切成芝士蛋糕。
select * from table1;
id | col1 | col1_tsv
----+------------+---------------
1 | Blacklist | 'blacklist':1
2 | Cheesecake | 'cheesecak':1
最佳答案
全文搜索能够前缀匹配 .看:
CREATE INDEX table1_col1_rtsv_idx ON table1 USING gin (TO_TSVECTOR('simple', reverse(col1)));
然后这个带有前缀搜索的查询可以使用新的索引:
SELECT col1 FROM table1
WHERE to_tsvector('simple', reverse(col1))
@@ to_tsquery('simple', reverse('cake') || ':*');
但我会考虑
三元组索引反而。看:
CREATE INDEX table1_col1_gin_trgm_idx ON table1 USING gin (col1 gin_trgm_ops);
询问:
SELECT col1 FROM table1
WHERE col1 LIKE '%cake';
值得注意的是,模式是
'%cake'
,不是
'%cake%'
, 如果“蛋糕”应在字符串的末尾。但是三元组索引也支持这一点:
SELECT col1 FROM table1
WHERE col1 LIKE '%cake%';
分贝<> fiddle
here
关于sql - 复合词全文检索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68401809/
我是一名优秀的程序员,十分优秀!