Використання pg_jieba для реалізації повнотекстового пошуку китайською у ServBay
Огляд
Для англійської та багатьох інших мов вбудовані можливості повнотекстового пошуку PostgreSQL ефективно працюють завдяки лексичному аналізу на основі пробілів та пунктуації. Однак китайський текст не має природних роздільників між словами, тому необхідне спеціальне сегментування для поділу суцільного потоку ієрогліфів на окремі лексичні одиниці.
pg_jieba
— це сторонній модуль-розширення для PostgreSQL, який інтегрує популярну бібліотеку Jieba для китайського сегментування. Завдяки pg_jieba
ви можете ефективно та точно здійснювати сегментацію китайського тексту безпосередньо в PostgreSQL і будувати потужний повнотекстовий пошук.
ServBay як інтегроване локальне середовище для розробки вебзастосунків уже містить попередньо встановлене розширення pg_jieba
, позбавляючи вас необхідності самостійно компілювати чи встановлювати цей модуль. Це дозволяє швидко розпочати розробку та тестування повнотекстового пошуку китайською у локальному середовищі.
У цій статті детально розглядається, як увімкнути, налаштувати та використовувати розширення pg_jieba
у середовищі ServBay.
Передумови
Перед використанням pg_jieba
переконайтесь, що виконані такі кроки:
- Встановлений ServBay на macOS, і PostgreSQL запущений та працює.
- Ви маєте базові знання роботи з PostgreSQL — як підключатися до бази даних і виконувати SQL-запити.
Встановлення та активація pg_jieba
ServBay постачається разом із розширенням pg_jieba
. Вам не потрібно завантажувати чи компілювати його окремо — просто виконайте декілька 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 для повнотекстового пошуку китайською
Після активації розширення pg_jieba
необхідно сконфігурувати текстовий пошук у PostgreSQL, вказавши pg_jieba
як сегментатор.
Налаштування конфігурації текстового пошуку (Text Search Configuration)
Конфігурація визначає, який парсер використовується для розбору тексту та як обробляються різні типи токенів.
Створіть нову конфігурацію пошуку: Створіть конфігурацію з назвою
chinese
, вказавши парсерpg_jieba
:sqlCREATE TEXT SEARCH CONFIGURATION chinese (PARSER = pg_jieba);
1Це дозволяє PostgreSQL використовувати parser
pg_jieba
для обробки тексту.Додайте необхідне зіставлення (mapping) для результатів сегментації: Парсер
pg_jieba
класифікує слова за частинами мови. Щоб ці токени можна було індексувати й знаходити під час пошуку, їх потрібно відобразити на відповідний словник. Типово це простий словник PostgreSQL —simple
, який не виконує додаткової обробки.sqlALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR n,v,a,i,e,l WITH simple;
1n,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
Створення індексу для повнотекстового пошуку
Для пришвидшення пошуку (особливо на великих об’ємах даних) рекомендується створити індекс. Для повнотекстового пошуку у PostgreSQL ідеально підходить GIN-індекс (Generalized Inverted Index).
Створіть GIN-індекс: Використайте функцію
to_tsvector
із нашою конфігурацієюchinese
:sqlCREATE INDEX idx_gin_content ON documents USING gin (to_tsvector('chinese', content));
1
Виконання запитів повнотекстового пошуку
Тепер ви можете шукати за допомогою функції to_tsquery
та оператора @@
.
Виконайте пошуковий запит: Знайти документи, які містять обидва слова "中文" та "分词":
sqlSELECT id, content FROM documents WHERE to_tsvector('chinese', content) @@ to_tsquery('chinese', '中文 & 分词');
1
2
3
4
5Символ
&
означає логічне І. Можна також використовувати|
(логічне АБО) і!
(логічне НЕ).Наприклад, знайти документи з "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Це рекомендаційний шлях — ви можете обрати інший залежно від структури встановлення або особистих налаштувань.
Додайте слова у словник: Відкрийте файл у текстовому редакторі й додайте кожне нове слово з нового рядка. За бажанням можна задавати частоту (frequency) та частину мови (tag), розділяючи значення пробілами:
слово [частота [тег]]
. Чим більша частота, тим імовірніше буде виділено слово.plaintext自然语言处理 3 n ServBay 5 eng 结巴分词库 3 n
1
2
3Тут
3 n
означає, що частота для "自然语言处理" — 3, а це іменник (n
).5 eng
для "ServBay" — частота 5, тег "англійське слово".Налаштуйте використання власного словника: У PostgreSQL-сесії вкажіть параметр
pg_jieba.dict_path
на теку, де міститься файл словника. Зверніть увагу: значеннямpg_jieba.dict_path
зазвичай є каталог, а не окремий файл. Якщо ваш файл custom_dict.txt розміщено разом із основним словником, можливо, змінювати шлях і не потрібно.Якщо дозволяється пряме вказання файлу або файл custom_dict.txt у типовій теці — налаштування мають відповідати цьому. Наведені нижче команди орієнтуються на поведінку за замовчуванням, скоригуйте їх за своїм середовищем:
sqlSET pg_jieba.dict_path = '/Applications/ServBay/etc/pg_jieba/'; -- якщо словники у цій теці
1Якщо можливо вказати файл напряму (варіант нестандартної поведінки):
sqlSET pg_jieba.dict_path = '/Applications/ServBay/etc/pg_jieba/custom_dict.txt'; -- використовуйте обережно, перевірте у вашому середовищі
1Важливо: команда
SET
діє лише для поточної сесії. Для постійної дії змініть параметр уpostgresql.conf
.
Перезавантаження словника
Після зміни словника або параметра pg_jieba.dict_path
потрібно примусово перезавантажити словник.
Перезавантажте словник: Виконайте SQL-функцію:
sqlSELECT jieba_reload_dict();
1Після успіху в подальших сегментаціях буде враховано новий словник.
Поширені питання (FAQ)
Запитання: Під час
CREATE EXTENSION pg_jieba;
повідомляє, що розширення "pg_jieba" недоступне. Що робити? Відповідь: Найімовірніше, файли розширення відсутні або розміщені неправильно в директорії PostgreSQL, або ж база не бачить їх. У ServBaypg_jieba
має бути вже встановленим. Перевірте, що ви підключаєтесь саме до екземпляра PostgreSQL від ServBay. Якщо проблема зберігається, перезапустіть ServBay або перегляньте його журнали.Запитання: Чому не працює власний словник? Відповідь: Перевірте наступне:
- Шлях до словника правильний, й користувач PostgreSQL має права на читання файлу.
- Формат словника коректний, кожний рядок — окреме слово, частота і тег відділені пробілом.
- Параметр
pg_jieba.dict_path
встановлено вірно. КомандаSET
діє тільки для поточної сесії; для постійної зміни правтеpostgresql.conf
. - Чи виконано
SELECT jieba_reload_dict();
для оновлення словника. - Після змін у
postgresql.conf
чи було перезапущено PostgreSQL.
Запитання: Некоректні результати повнотекстового пошуку. Як покращити? Відповідь: Точність пошуку залежить від результату сегментації і коректності складання запитів.
- Перевірте сегментацію: використайте функцію
ts_debug('chinese', 'ваш текст')
для перегляду розмежування й обробки токенів. Це допоможе зрозуміти, чи коректно працює pg_jieba і чи враховано доданий словник. - Оптимізуйте конфігурацію: скоригуйте перелік частин мови у
ALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR ... WITH simple;
— уникайте зайвих службових часток і пунктуації. - Оптимізуйте запит: переконайтесь у коректності пошукових слів і логічних операторів (
&
,|
,!
) уto_tsquery
.
- Перевірте сегментацію: використайте функцію
Висновок
pg_jieba
— потужний інструмент для повнотекстового пошуку китайською у PostgreSQL. Завдяки попередньо встановленому розширенню в ServBay розробник може легко активувати й налаштувати сегментацію китайських текстів у локальному середовищі. Дотримуючись цієї інструкції, ви зможете інсталювати та сконфігурувати pg_jieba
, створити власні текстові конфігурації, працювати з повнотекстовим пошуком і додавати власні словники для кращої точності пошуку. Застосовуйте ці технології у своїх проєктах — це допоможе зробити ваші китайськомовні дані по-справжньому "пошуковими"!