使用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', '/.', '  ', 'g')
       ) @@ to_tsquery('english',
          translate('ABC', '/.', '  ', 'g')
       ) AS match;
┌───────┐
│ match │
├───────┤
│ t     │
└───────┘
(1 row)

关于postgresql - PostgreSQL全文搜索:如何更改归类为“单词分隔符”的内容?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38844954/

10-10 16:23