gpt4 book ai didi

PostgreSQL 全文搜索 : How to change what classifies as a "word separator"?

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

使用 ts_debug 我可以看到 Postgres 将哪些符号视为(我所说的)“单词分隔符”。

例子:

SELECT ts_debug('english', 'Hello. ABC')

结果:

(asciiword,"Word, all ASCII",Hello,{english_stem},english_stem,{hello})
(blank,"Space symbols",". ",{},,)
(asciiword,"Word, all ASCII",ABC,{english_stem},english_stem,{abc})

.(点空格)被视为单词分隔符。我的问题是,我需要 Postgres 将单个点 . 也视为单词分隔符。

现在,如果我搜索 ABC,将找不到内容为 Hello.ABC(点后没有空格)的条目,只有 Hello . ABC.

我正在使用这个搜索查询:

SELECT description FROM incident WHERE
to_tsvector('english', description) @@ to_tsquery('english', 'ABC')

另一个例子:搜索IOException不会找到java.io.IOException

有没有办法将单个点(没有空格)视为单词分隔符?

最佳答案

问题是解析器会将 Hello.ABC 识别为主机名:

SELECT alias, description, token, lexemes FROM ts_debug('english', 'Hello.ABC');
┌───────┬─────────────┬───────────┬─────────────┐
│ alias │ description │ token │ lexemes │
├───────┼─────────────┼───────────┼─────────────┤
│ host │ Host │ Hello.ABC │ {hello.abc} │
└───────┴─────────────┴───────────┴─────────────┘
(1 row)

您必须更改解析器或创建一个新解析器来避免这种情况,但这只能在 C 中完成。

我推荐的解决方法是在处理之前用空格替换所有的点和斜线:

SELECT to_tsvector('english',
translate('Hello/ABC', '/.', ' ')
) @@ to_tsquery('english',
translate('ABC', '/.', ' ')
) AS match;
┌───────┐
│ match │
├───────┤
│ t │
└───────┘
(1 row)

关于PostgreSQL 全文搜索 : How to change what classifies as a "word separator"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38844954/

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