我正在使用一款使用 PostgreSQL 作为数据库的应用程序,它使用扩展unaccent
来规范化文本。我想通过修改unaccent.rules
文件来改进其搜索功能。
我编辑/usr/share/postgresql/16/tsearch_data/unaccent.rules
并添加了一些阿拉伯语 Unicode 块的规则(U+0600
至U+06ff
):
۰ 0
۱ 1
۲ 2
۳ 3
۴ 4
۵ 5
۶ 6
۷ 7
۸ 8
۹ 9
َ
并且运行良好。
SELECT unaccent('سَلام ۱۳۲');
unaccent
----------
سلام 123
(1 row)
问题 1:
问题出在零宽度非连接符(ZWNJ- U+200C
),应该用空格(U+0020
)代替。
سَلامعلیکم
->سلام علیکم
我尝试过的:
我尝试了以下行,但是不起作用或者给出错误:
"" " "
:(invalid syntax: more than two strings in unaccent rule
警告)+它不起作用。 " "
:(invalid syntax: more than two strings in unaccent rule
警告)+它不起作用。\u200C \u0020
:由ChatGPT建议,但是没有起作用。\u200C " "
:由ChatGPT建议,但是没有起作用。
注1:
上面的前两行中,有一个不可见的 ZWNJ 字符,在 VIM 中显示为 <200c>,但在本文中看不到。
注2:
我没有同时添加所有这些行,而是逐一尝试。
注3:
没有其他关于 ZWNJ 的规则
unaccent.rules
问题2:
有没有办法添加新规则文件而不是编辑默认文件?我无法编辑应用程序源代码并更改查询。
添加类似/usr/share/postgresql/16/tsearch_data/arabic.stop
或/usr/share/postgresql/16/tsearch_data/arabic.rules
重新启动服务是否可以使 PostgreSQL 理解它?
是否需要运行一些查询来重新加载文件?
是否需要改变应用程序请求搜索的方式?
问题#1已由 PostgreSQL 17 解决,如发行说明和提交消息中所述:
问题 #2:
仅添加
arabic.rules
文件是无效的。规则文件对应于字典,具体请参见 unaccent 扩展的 SQL 部分中的这些声明:您可以创建其他字典,但
unaccent(text)
Postgres 附带的函数会搜索该unaccent
字典。是否需要运行一些查询来重新加载文件?
每个后端首次使用时都会加载该文件,然后在会话的其余时间将其保存在内存中。因此重新连接会重新加载该文件。似乎没有其他方法。
是否需要更改应用程序请求搜索的方式?
您提到您无法更改应用程序。但如果它只是调用而没有架构限定,那么您可能可以在顺序中排在第一位的架构中
unaccent()
提供自己的函数,从而遮蔽其他函数。unaccent(text)
search_path