Маркер полнотекстового поиска 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 ответ:
Проблема решена. Причина в том, что база данных была инициирована с 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';
Чтобы воссоздать БД и простой словарь теперь работает.