【发布时间】:2021-09-24 20:00:34
【问题描述】:
我正在研究 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%';
当我选择整张桌子时,芝士蛋糕也会被切成芝士蛋糕。
select * from table1;
id | col1 | col1_tsv
----+------------+---------------
1 | Blacklist | 'blacklist':1
2 | Cheesecake | 'cheesecak':1
【问题讨论】:
标签: sql database postgresql indexing full-text-search