Lei*_*eif 3 postgresql full-text-search
使用ts_debug我可以看到 Postgres 将哪些符号视为(我称之为)“单词分隔符”。
例子:
SELECT ts_debug('english', 'Hello. ABC')
Run Code Online (Sandbox Code Playgroud)
结果:
(asciiword,"Word, all ASCII",Hello,{english_stem},english_stem,{hello})
(blank,"Space symbols",". ",{},,)
(asciiword,"Word, all ASCII",ABC,{english_stem},english_stem,{abc})
Run Code Online (Sandbox Code Playgroud)
.(点空格)被视为单词分隔符。我的问题是,我也需要 Postgres 将单个点.视为单词分隔符。
现在,如果我搜索ABC没有包含内容的条目Hello.ABC(点后没有空格),只会找到Hello. ABC.
我正在使用这个搜索查询:
SELECT description FROM incident WHERE
to_tsvector('english', description) @@ to_tsquery('english', 'ABC')
Run Code Online (Sandbox Code Playgroud)
另一个例子:搜索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)
Run Code Online (Sandbox Code Playgroud)
您必须更改解析器或创建一个新解析器来避免这种情况,但这只能在 C 中完成。
我建议的解决方法是在处理之前用空格替换所有点和斜线:
SELECT to_tsvector('english',
translate('Hello/ABC', '/.', ' ')
) @@ to_tsquery('english',
translate('ABC', '/.', ' ')
) AS match;
?????????
? match ?
?????????
? t ?
?????????
(1 row)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
777 次 |
| 最近记录: |