gpt4 book ai didi

sql - 复合词全文检索

转载 作者:行者123 更新时间:2023-12-04 07:22:38 25 4
gpt4 key购买 nike

我正在研究 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

最佳答案

全文搜索能够前缀匹配 .看:

  • Get partial match from GIN indexed TSVECTOR column

  • 但这仅适用于左 anchor 定搜索。你的模式是右 anchor 的。
    您可以在反向字符串上构建索引并使用反向模式进行搜索:
    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') || ':*');
    但我会考虑 三元组索引反而。看:
  • PostgreSQL LIKE query performance variations

  • 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
    文本搜索索引通常比 trigram 索引小得多 - 因此要快一些。还有许多其他细微的差异......

    关于sql - 复合词全文检索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68401809/

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