Полнотекстовый поиск по-китайски в ServBay: руководство по использованию zhparser
zhparser
— мощное стороннее расширение PostgreSQL, специально созданное для эффективной работы с китайскими текстами. Оно добавляет в PostgreSQL точную сегментацию китайских фраз и функционал полнотекстового поиска, что делает его оптимальным выбором для проектов, где требуется поиск по-китайски. ServBay — это комплексная локальная среда веб-разработки, в которую уже встроено и поддерживается расширение zhparser
, а также интегрирована сегментационная библиотека scws
(Simple Chinese Word Segmentation). С ее помощью zhparser
может использовать пользовательские словари.
В этом материале вы найдете пошаговое руководство по установке (включению) и настройке zhparser
в вашей среде ServBay, примеры использования для полнотекстового поиска на китайском, а также инструкции по созданию и применению пользовательских словарей на базе встроенного scws.
1. Обзор
Для приложений с большим объемом китайских текстов — таких как системы управления контентом, форумы, платформы электронной коммерции и так далее — быстрый и точный полнотекстовый поиск имеет принципиальное значение. Встроенный полнотекстовый поиск PostgreSQL ориентирован на языки, где слова разделяются пробелами, и с китайским работает плохо. Расширение zhparser
решает эту проблему, внедряя технологию сегментации китайских слов, чтобы PostgreSQL корректно определял границы слов и выполнял эффективный поиск.
ServBay предоставляет разработчикам готовую интеграцию с zhparser
, устраняя необходимость в ручной сборке и установке, что позволяет быстро развернуть полноценную разработку с поддержкой поиска по-китайски на локальном компьютере.
2. Предварительные требования
Перед тем как работать с zhparser
, убедитесь в следующем:
- Установлен ServBay.
- В ServBay активирован и запущен пакет PostgreSQL. Статус пакетов можно проверить и управлять ими через интерфейс приложения ServBay.
3. Установка (включение) расширения zhparser
ServBay уже размещает файлы расширения zhparser
в нужной директории PostgreSQL. Для включения достаточно выполнить SQL-команду в вашей целевой базе данных.
Подключитесь к вашей базе данных PostgreSQL:
Откройте терминал и используйте psql для подключения к базе, управляемой ServBay. Заменитеservbay-demo
своим именем пользователя иyour_database_name
на название вашей БД, где вы хотите включитьzhparser
.bashpsql -U servbay-demo -d your_database_name
1Если вы подключаетесь к базе по умолчанию (имя совпадает с именем пользователя), можно не указывать параметр
-d
.Создайте расширение
zhparser
:
В интерактивной оболочке psql выполните команду:sqlCREATE EXTENSION zhparser;
1При успешном выполнении ошибки не будет. Если будет сообщение, что расширение уже существует — значит оно уже было включено ранее.
Проверьте установку
zhparser
:
Просмотреть все подключённые расширения можно командой:sql\dx
1В списке должен появиться
zhparser
и его версия.
4. Настройка zhparser
После включения zhparser
требуется настроить функцию полнотекстового поиска PostgreSQL, чтобы использовать этот парсер для китайского языка. Это делается созданием текстовой поисковой конфигурации (Text Search Configuration).
Создайте текстовую поисковую конфигурацию:
Конфигурация определяет, как документ преобразуется вtsvector
(для индексации), и как поисковый запрос превращается вtsquery
(для поиска). Создадим конфигурацию с именемchinese
, а парсером укажемzhparser
.sqlCREATE TEXT SEARCH CONFIGURATION chinese (PARSER = zhparser);
1Добавьте отображения словарей:
В конфигурации необходимо указать, словаря для каких типов токенов (частей речи) использовать.zhparser
помечает слова тегами — существительное (n), глагол (v), прилагательное (a), независимая часть (i), экспрессивное слово (e), числительное (l) и другие. Для них мы назначим словарьsimple
, который не трансформирует слова, а просто возвращает сегментированные zhparser слова как есть.sqlALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR n,v,a,i,e,l WITH simple; -- При необходимости можно добавить или изменить использованные теги и словари.
1
2Примечание: теги частеречной принадлежности, поддерживаемые
zhparser
, могут отличаться от стандартных NLP-меток. Приведённые выше — наиболее часто используемые для zhparser.
5. Использование zhparser для полнотекстового поиска
После настройки можно сразу использовать zhparser
для полнотекстового поиска на китайском. Далее приведём простой пример.
5.1 Создание тестовой таблицы и данных
Сначала создадим таблицу для хранения китайских текстов и добавим несколько записей.
Создайте таблицу:
sqlCREATE TABLE documents ( id SERIAL PRIMARY KEY, content TEXT );
1
2
3
4Добавьте примеры данных:
sqlINSERT INTO documents (content) VALUES ('我爱自然语言处理'), ('中文分词是文本处理的重要步骤'), ('zhparser 是一个很好的中文分词工具'), ('ServBay 让本地开发更便捷');
1
2
3
4
5
5.2 Создание индекса полнотекстового поиска
Для повышения производительности поисковых запросов — особенно при больших объёмах данных — рекомендуется создать индекс на столбце, используемом для поиска. Обычно для столбцов типа tsvector
создают GIN (Generalized Inverted Index) индексы, так как они максимально эффективны для таких задач.
Создайте GIN-индекс:
Индексируем полеcontent
, преобразованное черезto_tsvector('chinese', content)
. Обязательно укажите ранее созданную конфигурациюchinese
, чтобы она использовала zhparser для сегментации.sqlCREATE INDEX idx_gin_content ON documents USING gin (to_tsvector('chinese', content));
1
5.3 Выполнение полнотекстового поиска
Теперь можно искать документы, преобразовывая поисковую фразу командой to_tsquery
, и сопоставлять через оператор @@
с нашим индексом.
Выполните поиск:
Например, найти документы, содержащие и «中文», и «分词»:sqlSELECT id, content, to_tsvector('chinese', content) AS content_tsvector -- опционально: вывод результата сегментации FROM documents WHERE to_tsvector('chinese', content) @@ to_tsquery('chinese', '中文 & 分词');
1
2
3
4
5
6В результатах будут документы с id 2 и 3 — они содержат оба слова.
Можно попробовать и другие запросы:
- Поиск записей с «ServBay»:sql(в результате — запись с id 4)
SELECT * FROM documents WHERE to_tsvector('chinese', content) @@ to_tsquery('chinese', 'ServBay');
1 - Поиск по «自然语言处理»:sql(вернётся документ с id 1. Обратите внимание, что zhparser может рассматривать «自然语言处理» как одно слово либо разбить на части — это зависит от режима сегментации и пользовательского словаря. Если вы внесёте эту фразу в словарь, поиск будет точнее.)
SELECT * FROM documents WHERE to_tsvector('chinese', content) @@ to_tsquery('chinese', '自然语言处理');
1
- Поиск записей с «ServBay»:
6. Создание пользовательского словаря с помощью встроенного scws в ServBay
ServBay интегрирует библиотеку scws
, а zhparser может быть настроен на использование внешних словарей scws, включая созданные пользователем. Это полезно для повышения качества сегментации, особенно для специальных терминов или новых слов.
6.1 Создание пользовательского словаря
Создайте или отредактируйте пользовательский словарь:
Рекомендуется хранить словарь scws в каталоге/Applications/ServBay/etc/scws/
. Например, создайте файлcustom_dict.txt
(если его еще нет).bash# Создать или открыть файл для редактирования nano /Applications/ServBay/etc/scws/custom_dict.txt
1
2Добавьте нужные слова:
В файлеcustom_dict.txt
запишите по одному слову или фразе на строку, которые вы хотите, чтобы zhparser определял отдельно, например:plaintext自然语言处理 中文分词 ServBay 本地开发环境
1
2
3
4Сохраните и закройте файл.
6.2 Настройка zhparser на использование пользовательского словаря
Необходимо указать zhparser путь к вашему пользовательскому словарю.
Установите параметр
zhparser.dict_path
:
Введите в вашей сессии PostgreSQL:sqlSET zhparser.dict_path = '/Applications/ServBay/etc/scws/custom_dict.txt'; -- Проверьте, что путь указан корректно и у пользователя PostgreSQL есть права на чтение файла.
1
2Обратите внимание: параметр, заданный через
SET
, действует только в текущем сеансе. Для глобального применения настройку следует внести в файл postgresql.conf, указавzhparser.dict_path = '/Applications/ServBay/etc/scws/custom_dict.txt'
и затем перезапустить PostgreSQL (через интерфейс ServBay). Для локальной разработки и быстрых тестовSET
обычно достаточно.
6.3 Перезагрузка словаря
После внесения изменений в словарь нужно обновить данные zhparser для применения нового списка.
Вызовите функцию обновления словаря:
sqlSELECT zhprs_reload_dict();
1После выполнения этой функции вся дальнейшая сегментация текста будет использовать новый словарь.
7. Настройка режима сегментации
zhparser
поддерживает разные режимы сегментации, задаваемые параметрами. Главное — параметр zhparser.seg_with_duality
, который определяет подробность разбивки текста.
7.1 Изменение режима сегментации
- Установка параметра
zhparser.seg_with_duality
:- Значение
true
: включается "двойная" сегментация, при которой выделяются также короткие словосочетания — это увеличивает полноту поиска (находится больше релевантных документов). Например, из фразы «自然语言处理» получится «自然», «语言», «处理», «自然语言», «语言处理».sqlSET zhparser.seg_with_duality = true;
1 - Значение
false
: используется менее детальная сегментация, как правило, по самому длинному совпадению из словаря — это увеличивает точность поиска. Например, «自然语言处理» будет оставаться цельной фразой (если есть в словаре).sqlSET zhparser.seg_with_duality = false;
1
- Значение
8. Часто задаваемые вопросы (FAQ)
В: Команда
CREATE EXTENSION zhparser;
сообщает, что расширение не найдено?
О: Проверьте, что пакет PostgreSQL в ServBay установлен и активен. В дистрибутиве ServBay должны присутствовать библиотеки zhparser в каталоге расширений PostgreSQL. Если нет — проверьте корректность установки или попробуйте перезапустить ServBay.В: Пользовательский словарь не применяется?
О: Проверьте следующие пункты:- Параметр
zhparser.dict_path
задан правильно (указывает на ваш файл, например,/Applications/ServBay/etc/scws/custom_dict.txt
, регистр букв имеет значение!). - После указания
zhparser.dict_path
была ли вызвана функцияSELECT zhprs_reload_dict();
для применения изменений? - Формат файла словаря корректен (по одному слову на строку)?
- Для новых подключений команду
SET zhparser.dict_path = ...;
также нужно выполнять, либо прописать настройку в postgresql.conf и перезапустить сервис. - У пользователя PostgreSQL есть права на чтение файла словаря.
- Параметр
В: Результаты полнотекстового поиска не совпадают с ожиданиями?
О: Проверьте, верно ли настроена ваша поисковая конфигурация (chinese
) и правильные ли токены отображаются на словарь. Попробуйте поэкспериментировать с параметромzhparser.seg_with_duality
. Используйте командуSELECT to_tsvector('chinese', 'ваш китайский текст');
, чтобы посмотреть, как производится сегментация — это упростит отладку. Убедитесь, что в поисковом запросе (to_tsquery
) используются нужные ключевые слова и правильные логические операторы (&
,|
,!
).В: Полнотекстовый поиск работает слишком медленно?
О: Убедитесь, что вы создали GIN-индекс для столбцаto_tsvector(...)
. При работе с очень большими массивами данных возможна дополнительная оптимизация PostgreSQL или переход к другим видам индексов.
9. Заключение
С помощью ServBay поддержка полнотекстового поиска по-китайски в PostgreSQL с помощью zhparser
реализуется очень быстро и удобно. Всего несколькими шагами вы можете активировать расширение, настроить поиск по тексту и — благодаря встроенному scws — добавить пользовательский словарь для повышения качества работы. Освоение базовых принципов работы и настроек zhparser
заметно увеличит ваши возможности по обработке китайских текстовых данных в локальной среде, что особенно важно для построения современных и функциональных приложений на китайском языке.