PostgreSQL 全文搜索:如何更改分类为 "word separator" 的内容?
PostgreSQL full text search: How to change what classifies as a "word separator"?
使用 ts_debug
我可以看到 Postgres 将哪些符号视为(我所说的)a "word separator"。
示例:
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})
.
(点space)被视为单词分隔符。
我的问题是,我需要 Postgres 将单个点 .
也视为单词分隔符。
现在,如果我搜索 ABC
,将找不到内容为 Hello.ABC
(点后没有 space)的条目,只有 Hello. ABC
。
我正在使用这个搜索查询:
SELECT description FROM incident WHERE
to_tsvector('english', description) @@ to_tsquery('english', 'ABC')
另一个例子:搜索IOException
不会找到java.io.IOException
有没有办法将单个点(没有 space)作为单词分隔符?
问题是解析器会将 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)
使用 ts_debug
我可以看到 Postgres 将哪些符号视为(我所说的)a "word separator"。
示例:
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})
.
(点space)被视为单词分隔符。
我的问题是,我需要 Postgres 将单个点 .
也视为单词分隔符。
现在,如果我搜索 ABC
,将找不到内容为 Hello.ABC
(点后没有 space)的条目,只有 Hello. ABC
。
我正在使用这个搜索查询:
SELECT description FROM incident WHERE
to_tsvector('english', description) @@ to_tsquery('english', 'ABC')
另一个例子:搜索IOException
不会找到java.io.IOException
有没有办法将单个点(没有 space)作为单词分隔符?
问题是解析器会将 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)