On this page
F.44. unaccent
unaccent
是一种文本搜索词典,用于删除词素中的重音符号。这是一个过滤字典,这意味着其输出总是传递到下一个字典(如果有),这与字典的正常行为不同。这允许对重音不敏感的全文搜索处理。
unaccent
的当前实现不能用作thesaurus
字典的规范化字典。
F.44.1. Configuration
unaccent
词典接受以下选项:
RULES
是包含转换规则列表的文件的基本名称。该文件必须存储在$SHAREDIR/tsearch_data/
(其中$SHAREDIR
表示 PostgreSQL 安装的共享数据目录)中。其名称必须以.rules
结尾(该参数不应包含在RULES
参数中)。
规则文件具有以下格式:
- 每行代表一个翻译规则,由具有重音符号的字符和没有重音符号的字符组成。第一个翻译成第二个。例如,
À A
Á A
A
à A
Ä A
Å A
Æ AE
这两个字符必须用空格隔开,并且一行上的任何前导或尾随空格都将被忽略。
或者,如果一行上仅给出一个字符,则删除该字符的实例;这在重音由单独的字符表示的语言中很有用。
实际上,每个“字符”都可以是不包含空格的任何字符串,因此
unaccent
字典除了变音符号删除外,还可以用于其他类型的子字符串替换。与其他 PostgreSQL 文本搜索配置文件一样,规则文件必须以 UTF-8 编码存储。加载后,数据将自动转换为当前数据库的编码。包含不可翻译字符的任何行都会被静默忽略,因此规则文件可以包含不适用于当前编码的规则。
可以在unaccent.rules
中找到一个更完整的示例,该示例对大多数欧洲语言都直接有用,安装了unaccent
模块后,该示例已安装在$SHAREDIR/tsearch_data/
中。此规则文件将带重音符号的字符转换为不带重音符号的相同字符,并且还将连字扩展为等效的一系列简单字符(例如,Æ到 AE)。
F.44.2. Usage
安装unaccent
extensions 会创建一个文本搜索模板unaccent
和基于它的字典unaccent
。 unaccent
字典具有默认参数设置RULES='unaccent'
,这使其可以立即与标准unaccent.rules
文件一起使用。如果需要,您可以更改参数,例如
mydb=# ALTER TEXT SEARCH DICTIONARY unaccent (RULES='my_rules');
或根据模板创建新字典。
要测试字典,您可以尝试:
mydb=# select ts_lexize('unaccent','Hôtel');
ts_lexize
-----------
{Hotel}
(1 row)
这是显示如何将unaccent
词典插入文本搜索配置的示例:
mydb=# CREATE TEXT SEARCH CONFIGURATION fr ( COPY = french );
mydb=# ALTER TEXT SEARCH CONFIGURATION fr
ALTER MAPPING FOR hword, hword_part, word
WITH unaccent, french_stem;
mydb=# select to_tsvector('fr','Hôtels de la Mer');
to_tsvector
-------------------
'hotel':1 'mer':4
(1 row)
mydb=# select to_tsvector('fr','Hôtel de la Mer') @@ to_tsquery('fr','Hotels');
?column?
----------
t
(1 row)
mydb=# select ts_headline('fr','Hôtel de la Mer',to_tsquery('fr','Hotels'));
ts_headline
------------------------
<b>Hôtel</b> de la Mer
(1 row)
F.44.3. Functions
unaccent()
函数可删除给定字符串中的重音符号。基本上,它是unaccent
型字典的包装,但可以在常规文本搜索上下文之外使用。
unaccent([dictionary regdictionary, ] string text) returns text
如果省略* dictionary
*参数,则使用名为unaccent
且与unaccent()
函数本身处于相同模式的文本搜索词典。
For example:
SELECT unaccent('unaccent', 'Hôtel');
SELECT unaccent('Hôtel');