Postgresql全文搜索标记器

时间:2013-08-08 08:44:27

标签: postgresql full-text-search tokenize

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

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

'На'是一个停用词,应该删除,但它甚至不会在结果向量中降低。如果我传递小写字符串,则一切正常

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

当然我可以传递预先小写的字符串,但手册说

  

简单字典模板通过转换输入标记来操作   小写并根据停用词文件进行检查。

Config 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 个答案:

答案 0 :(得分: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';

重新创建db和简单字典现在可以正常工作。