Маркер полнотекстового поиска Postgresql


Просто столкнись с проблемой. Я пытаюсь настроить полнотекстовый поиск по локализованному контенту (в частности, русскому). Проблема в том, что конфигурация по умолчанию (как и моя пользовательская) не имеет дела с буквами. Пример:

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 6

1 ответ:

Проблема решена. Причина в том, что база данных была инициирована с default ("C") CType и Collate. Мы использовали

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';

Чтобы воссоздать БД и простой словарь теперь работает.