Реализация полнотекстового поиска на китайском в PostgreSQL с помощью pg_jieba в ServBay
Обзор
Для таких языков, как английский, встроенная система полнотекстового поиска PostgreSQL работает эффективно благодаря лексическому анализу на основе пробелов и знаков препинания. Однако в китайском языке нет естественных разделителей между словами — для работы требуется отдельный инструмент сегментации (разделения текста на слова).
pg_jieba
— это стороннее расширение для базы данных PostgreSQL, которое интегрирует популярную китайскую библиотеку сегментации Jieba. С помощью pg_jieba
вы можете эффективно и точно разбирать китайские тексты на слова прямо в PostgreSQL, что позволяет реализовать мощный полнотекстовый поиск по-китайски.
ServBay — это интегрированная локальная среда для веб-разработки, в которой расширение pg_jieba
уже предустановлено. Вам не нужно ничего компилировать и устанавливать вручную — вы сразу можете начать использовать китайский полнотекстовый поиск для разработки и тестирования.
В этом руководстве подробно рассказывается, как включить, настроить и использовать расширение pg_jieba
в среде ServBay.
Предварительные условия
Перед использованием pg_jieba
убедитесь, что выполнены следующие пункты:
- На вашем MacOS установлен ServBay, а база данных PostgreSQL успешно запущена.
- Вы знакомы с основными операциями PostgreSQL: соединением с базой и выполнением SQL-запросов.
Установка и включение pg_jieba
В ServBay расширение pg_jieba
уже предустановлено вместе с PostgreSQL. Вам не нужно скачивать или компилировать его вручную — просто выполните несколько простых SQL-команд в нужной базе для включения расширения.
Порядок включения расширения pg_jieba
:
Подключитесь к вашей базе данных PostgreSQL:
Откройте терминал и используйте командуpsql
для подключения. Заменитеyour_username
на имя вашего пользователя PostgreSQL, аyour_database
— на название вашей базы данных. Значения по умолчанию в ServBay, как правило,servbay
илиpostgres
.bashpsql -U your_username -d your_database
1Например, с параметрами по умолчанию:
bashpsql -U servbay -d servbay
1Создайте и активируйте расширение
pg_jieba
: В командной строке psql выполните:sqlCREATE EXTENSION pg_jieba;
1Если расширение уже создано, при повторном вызове этой команды появится ошибка — это нормально.
Проверьте, что расширение
pg_jieba
уже включено:
Выполните команду для показа всех установленных расширений:sql\dx
1Если в списке есть
pg_jieba
, значит всё включено корректно.
Настройка pg_jieba для китайского полнотекстового поиска
После включения расширения нужно сконфигурировать текстовый поиск в PostgreSQL и указать, что сегментатором будет pg_jieba
.
Настройка конфигурации текстового поиска
Конфигурация текстового поиска определяет, как обрабатывать документы для полнотекстового поиска: какой парсер (анализатор) используется для сегментации и как обрабатываются различные типы токенов.
Создайте новую конфигурацию текстового поиска:
Создайте новую конфигурацию поиска с названиемchinese
, указав парсеромpg_jieba
.sqlCREATE TEXT SEARCH CONFIGURATION chinese (PARSER = pg_jieba);
1Эта конфигурация укажет PostgreSQL использовать сегментатор
pg_jieba
при обработке текста.Добавьте сопоставление (mapping) для полученных токенов:
Парсерpg_jieba
присваивает токенам различные грамматические теги (части речи). Чтобы токены были доступны для индексации, вы должны сопоставить эти теги определённым словарям. В данном случае все распространённые теги (существительные n, глаголы v, прилагательные a и т.д.) связываются со встроенным словарём PostgreSQLsimple
. Этот словарь не выполняет никакой обработки — токены передаются напрямую.sqlALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR n,v,a,i,e,l WITH simple;
1Здесь
n,v,a,i,e,l
— это некоторые из тегов, которые может распознатьpg_jieba
. При необходимости вы можете добавить или изменить их:n
: существительноеv
: глаголa
: прилагательноеi
: идиомаe
: междометиеl
: фразеологизмnr
: имя собственноеns
: географическое названиеnt
: организацияnz
: другие имена собственныеm
: числительноеq
: счетное словоt
: обозначение времениs
: обозначение местаf
: пространственное словоp
: предлогc
: союзu
: частицаxc
: другие служебные словаw
: знаки препинанияeng
: английские словаx
: неразложимые морфемы
Обычно индексируют и ищут слова с самостоятельным значением: существительные, глаголы, прилагательные и т.д.
Пример полнотекстового поиска с pg_jieba
После настройки вы можете использовать pg_jieba
для полнотекстового поиска по-китайски. Рассмотрим простой пример.
Создание тестовой таблицы и данных
Создайте таблицу для хранения документов и вставьте в неё образцы текста на китайском языке.
Создайте таблицу:
sqlCREATE TABLE documents ( id SERIAL PRIMARY KEY, content TEXT );
1
2
3
4Вставьте пример данных:
sqlINSERT INTO documents (content) VALUES ('我爱自然语言处理技术'), ('中文分词是文本处理的重要步骤'), ('pg_jieba是一个很好的中文分词工具,它基于结巴分词库'), ('ServBay 让本地开发变得简单高效');
1
2
3
4
5
Создание индекса полнотекстового поиска
Для ускорения поиска, особенно по большим объёмам данных, рекомендуется создать индекс по колонке, используемой для поиска. Наиболее подходящий индекс — GIN (Generalized Inverted Index).
Создайте GIN-индекс:
С помощью функцииto_tsvector
и нашей конфигурацииchinese
создайте индекс по столбцуcontent
.to_tsvector('chinese', content)
преобразует текст столбцаcontent
с использованием сегментатораpg_jieba
в внутренний форматtsvector
, предназначенный для полнотекстового поиска.sqlCREATE INDEX idx_gin_content ON documents USING gin (to_tsvector('chinese', content));
1
Выполнение полнотекстовых запросов
Теперь вы можете выполнять поиск с использованием функции to_tsquery
и оператора @@
. to_tsquery('chinese', 'your query')
превратит вашу поисковую фразу в тип tsquery
с помощью конфигурации chinese
. Оператор @@
проверяет, соответствует ли tsvector
вашему условию.
Выполните поисковый запрос:
Например, найти все документы, содержащие слова "中文" и "分词".sqlSELECT id, content FROM documents WHERE to_tsvector('chinese', content) @@ to_tsquery('chinese', '中文 & 分词');
1
2
3
4
5Символ
&
вtsquery
обозначает логическое И (AND). Для ИЛИ (OR) — используйте|
, для НЕ (NOT) —!
.Например, найти документы с "ServBay" или "开发":
sqlSELECT id, content FROM documents WHERE to_tsvector('chinese', content) @@ to_tsquery('chinese', 'ServBay | 开发');
1
2
3
4
5
Пользовательский словарь
pg_jieba
использует словарь Jieba по умолчанию. В ряде случаев потребуется добавить в него свои слова (например, профессионализмы, названия брендов и т.п.), чтобы повысить качество сегментации.
Для этого вы можете создать пользовательский словарь и подключить его к pg_jieba
.
Добавление пользовательских слов
Создайте файл со словарём:
Например, создайте текстовый файл в каталоге настроек ServBay:plaintext/Applications/ServBay/etc/pg_jieba/custom_dict.txt
1Это только рекомендуемый путь, выберите расположение в соответствии с вашей структурой ServBay.
Добавьте слова в файл:
Отредактируйтеcustom_dict.txt
, добавляя по одному слову на строку. Необязательно — укажите через пробел частоту (frequency) и грамматический тег (tag):
Формат:слово [частота [грамматический тег]]
. Чем больше частота, тем выше вероятность выделения слова.plaintext自然语言处理 3 n ServBay 5 eng 结巴分词库 3 n
1
2
3Здесь
3 n
означает, что слово "自然语言处理" (обработка естественного языка) имеет частоту 3 и тег "существительное" (n).5 eng
— "ServBay" с частотой 5 и тегом "английское слово" (eng).Настройте
pg_jieba
на использование словаря:
В вашей сессии PostgreSQL укажите параметрpg_jieba.dict_path
, чтобы он ссылался на каталог, содержащий пользовательский словарь.
Внимание: Обычноpg_jieba.dict_path
— это путь к каталогу, а не к отдельному файлу. Если вы разместили свой словарь рядом с основным или в каталоге, который сканирует pg_jieba, возможно, не потребуется дополнительных действий — зависит от реализации в ServBay. Всегда сверяйтесь с документацией или протестируйте.Если ServBay позволяет явно указать путь к пользовательскому словарю или словарь лежит в сканируемом каталоге, эта команда может отличаться или не быть необходимой.
Следующая команда приводится по образцу, проверьте её применимость для вашей сборки ServBay:sqlSET pg_jieba.dict_path = '/Applications/ServBay/etc/pg_jieba/'; -- основной словарь ServBay и custom_dict.txt в этом каталоге
1Или, если параметр поддерживает прямое указание файла (это не стандартно, проверьте в вашей среде):
sqlSET pg_jieba.dict_path = '/Applications/ServBay/etc/pg_jieba/custom_dict.txt'; -- используйте с осторожностью, протестируйте на практике
1Важно: команда
SET
действует только в текущей сессии. Чтобы сделать изменения постоянными, отредактируйте файл конфигурации PostgreSQLpostgresql.conf
и укажите нужный путь в параметреpg_jieba.dict_path
.
Перезагрузка словаря
После изменения пользовательского словаря или параметра pg_jieba.dict_path
вам нужно сообщить pg_jieba перезагрузить словарь.
Принудительно перезагрузите словарь:
Выполните функцию:sqlSELECT jieba_reload_dict();
1После этого последующие разборы текста будут использовать обновлённый словарь.
Часто задаваемые вопросы (FAQ)
Вопрос: При выполнении
CREATE EXTENSION pg_jieba;
появляется ошибка "extension "pg_jieba" is not available". Что делать?
Ответ: Обычно это значит, что файлы расширения pg_jieba не были правильно установлены в каталог расширений PostgreSQL, либо PostgreSQL не находит их. В ServBay расширение должно быть уже предустановлено. Убедитесь, что вы используете именно PostgreSQL из дистрибутива ServBay и что установка не повреждена. Если ошибка сохраняется, попробуйте перезапустить ServBay или изучите логи системы.Вопрос: Пользовательский словарь не работает. Почему?
Ответ: Проверьте следующие моменты:- Корректно ли указан путь к словарю, и есть ли у пользователя PostgreSQL права чтения этого файла.
- Верен ли формат файла — по одному слову в строке, частота и тег разделены пробелом.
- Задан ли параметр
pg_jieba.dict_path
. Помните, командаSET
действует только для текущей сессии, для постоянной работы настройте этот путь вpostgresql.conf
. - После внесения изменений выполнена ли команда
SELECT jieba_reload_dict();
для обновления словаря. - После редактирования
postgresql.conf
перезапускался ли сервер PostgreSQL.
Вопрос: Точность полнотекстового поиска неудовлетворительна. Как исправить?
Ответ: Результаты поиска зависят от качества сегментации и корректного построения запросов.- Проверьте, как сегментируется текст: используйте функцию
ts_debug('chinese', 'текст')
для анализа, как разбивается конкретная строка, и работает ли ваш пользовательский словарь. - Тонко настройте конфигурацию сегментатора: откорректируйте теги в
ALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR ... WITH simple;
, исключая малозначимые классы (служебные слова, знаки препинания и др.). - Уточните ваш поисковый запрос: проверьте, что логика в
to_tsquery
(&
,|
,!
) точно соответствует вашей задаче.
- Проверьте, как сегментируется текст: используйте функцию
Заключение
pg_jieba
— отличное решение для полнотекстового поиска на китайском языке в PostgreSQL. Благодаря предустановке этого расширения в ServBay разработчики могут быстро и удобно активировать и настроить китайский текстовый анализ на локальной машине. Следуя шагам из этой статьи, вы освоите установку pg_jieba
в ServBay, создание и настройку конфигурации текстового поиска, выполнение типовых запросов полнотекстового поиска, а также использование пользовательских словарей для тонкой настройки сегментации. Применяйте эти методы в своих проектах — и поисковые возможности ваших приложений на китайском значительно улучшатся.