Postgresql全文搜索分词器

8

我遇到了一个问题。我正在尝试在本地化内容(特别是俄语)上设置全文搜索。问题是默认配置(以及我的自定义配置)无法处理字母大小写。例如:

SELECT * from to_tsvector('test_russian', 'На рынке появились новые рублевые облигации');
> 'На':1 'новые':4 'облигации':6 'появились':3 'рублевые':5 'рынке':2

'На'是一个停用词,应该被移除,但在结果向量中它甚至没有被转换为小写。如果我传递一个小写的字符串,所有操作都能正常运行。

SELECT * from to_tsvector('test_russian', 'на рынке появились новые рублевые облигации');
> 'новые':4 'облигации':6 'появились':3 'рублевые':5 'рынке':2

我可以传递预先小写的字符串,但是手册上说:

简单的字典模板通过将输入标记转换为小写并检查它是否与停用词文件匹配来运行。

配置russian_test看起来像这样:

create text search CONFIGURATION test_russian (COPY = 'russian');

CREATE TEXT SEARCH DICTIONARY russian_simple (
    TEMPLATE = pg_catalog.simple,
    STOPWORDS = russian
);

CREATE TEXT SEARCH DICTIONARY russian_snowball (
    TEMPLATE = snowball,
    Language = russian,
    StopWords = russian
);

alter text search configuration test_russian 
    alter mapping for word
    with russian_simple,russian_snowball;

但事实上,我使用内置的 russian 配置可以得到完全相同的结果。

我尝试了使用 ts_debug 和将单词视为 word 处理的标记,如我所预期的那样。

有什么想法吗?

1个回答

4
问题已解决。原因是数据库使用了默认的(“C”)CTypeCollate。我们使用了...
initdb --locale=UTF-8 --lc-collate=UTF-8 --encoding=UTF-8 -U pgsql *PGSQL DATA DIR* 

重新创建实例和
CREATE DATABASE "scratch"
  WITH OWNER "postgres"
  ENCODING 'UTF8'
  LC_COLLATE = 'ru_RU.UTF-8'
  LC_CTYPE = 'ru_RU.UTF-8';

重新创建数据库和简单字典现在已经可以正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接