PostgreSQL 全文搜索:如何更改分类为“单词分隔符”的内容?

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

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

Lau*_*lbe 6

问题是解析器将识别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)