Wykorzystanie pg_jieba do chińskiego wyszukiwania pełnotekstowego w ServBay
Przegląd
W przypadku takich języków jak angielski, wbudowane funkcje wyszukiwania pełnotekstowego PostgreSQL działają wydajnie dzięki analizie opartej na odstępach i znakach interpunkcyjnych. Jednak w chińskim nie występują naturalne spacje oddzielające wyrazy, dlatego do poprawnego przetwarzania tekstu potrzebne są wyspecjalizowane narzędzia do segmentacji.
pg_jieba
to zewnętrzne rozszerzenie dla bazy PostgreSQL integrujące popularną bibliotekę Jieba do segmentacji chińskiego. Dzięki pg_jieba
możesz efektywnie i precyzyjnie dzielić teksty chińskie na wyrazy, umożliwiając budowę potężnych możliwości wyszukiwania pełnotekstowego w tym języku.
ServBay, jako zintegrowane lokalne środowisko programistyczne, oferuje wstępnie zainstalowane rozszerzenie pg_jieba
, eliminując konieczność ręcznej kompilacji i instalacji, dzięki czemu możesz szybko rozpocząć rozwój i testowanie funkcji wyszukiwania po chińsku lokalnie.
W tym artykule szczegółowo opisano, jak aktywować, skonfigurować oraz używać rozszerzenia pg_jieba
w środowisku ServBay.
Wymagania wstępne
Przed rozpoczęciem pracy z pg_jieba
upewnij się, że:
- Masz zainstalowany ServBay na macOS, a baza PostgreSQL jest uruchomiona.
- Znasz podstawy obsługi bazy PostgreSQL: potrafisz połączyć się z bazą oraz uruchamiać polecenia SQL.
Instalacja i aktywacja pg_jieba
ServBay pakuje rozszerzenie pg_jieba
wraz z PostgreSQL. Nie musisz pobierać ani kompilować go samodzielnie – wystarczy wykonać proste polecenia SQL, aby go aktywować w wybranej bazie danych.
Oto kroki aktywacji pg_jieba
:
Połącz się z bazą PostgreSQL: Otwórz Terminal i użyj narzędzia
psql
, zastępującyour_username
swoją nazwą użytkownika, ayour_database
– nazwą bazy danych. Domyślni użytkownicy i bazy ServBay to zwykleservbay
lubpostgres
.bashpsql -U your_username -d your_database
1Przykład z domyślnym użytkownikiem i bazą:
bashpsql -U servbay -d servbay
1Utwórz i aktywuj rozszerzenie
pg_jieba
: W interfejsiepsql
uruchom polecenie:sqlCREATE EXTENSION pg_jieba;
1Jeśli rozszerzenie zostało wcześniej utworzone, pojawi się błąd – to normalne.
Zweryfikuj aktywację
pg_jieba
: Wyświetl listę zainstalowanych rozszerzeń:sql\dx
1Jeśli zobaczysz
pg_jieba
na liście, znaczy że rozszerzenie jest aktywne.
Konfiguracja pg_jieba do wyszukiwania pełnotekstowego po chińsku
Po aktywacji pg_jieba
musisz skonfigurować przetwarzanie tekstu w PostgreSQL tak, aby używało tego rozszerzenia do segmentacji.
Tworzenie konfiguracji wyszukiwania tekstu
Konfiguracja wyszukiwania tekstu określa, jak tekst jest przetwarzany do wyszukiwania, w tym jaki parser (segmentator) i słowniki są używane.
Utwórz nową konfigurację wyszukiwania tekstu: Tworzymy konfigurację o nazwie
chinese
z parserempg_jieba
.sqlCREATE TEXT SEARCH CONFIGURATION chinese (PARSER = pg_jieba);
1Dzięki tej konfiguracji PostgreSQL będzie wykorzystywać
pg_jieba
podczas analizy tekstu.Dodaj mapowania dla rezultatów segmentacji (Mapping): Parser
pg_jieba
generuje różne typy tokenów w zależności od części mowy. Aby można było wyszukiwać i indeksować wybrane kategorie słów, trzeba zmapować je na odpowiedni słownik. Mamy tu słownik domyślnysimple
, który nie dokonuje żadnych zmian w tokenach.sqlALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR n,v,a,i,e,l WITH simple;
1n,v,a,i,e,l
to przykłady najczęstszych tagów części mowy rozpoznawanych przezpg_jieba
. Możesz dodać lub zmienić te tagi według własnych potrzeb. Przykład typowych tagów:n
: rzeczownikv
: czasownika
: przymiotniki
: idiome
: wykrzyknikl
: frazanr
: imię osobyns
: nazwa geograficznant
: organizacja/instytucjanz
: inne nazwy własnem
: liczebnikq
: klasyfikator/miarat
: określenie czasus
: określenie miejscaf
: określenie kierunkup
: przyimekc
: spójniku
: partykułaxc
: inna cząstkaw
: znak interpunkcyjnyeng
: angielskix
: morfem
W praktyce najczęściej indeksuje się rzeczowniki, czasowniki, przymiotniki i im podobne kategorie.
Przykłady użycia pg_jieba do wyszukiwania pełnotekstowego
Po konfiguracji możesz już korzystać z wyszukiwania pełnotekstowego opartego na segmentacji przez pg_jieba
. Oto przykładowy scenariusz:
Tworzenie przykładowej tabeli i danych
Najpierw stwórz tabelę na dokumenty oraz wstaw kilka przykładowych tekstów po chińsku.
Stwórz tabelę:
sqlCREATE TABLE documents ( id SERIAL PRIMARY KEY, content TEXT );
1
2
3
4Dodaj przykładowe dane:
sqlINSERT INTO documents (content) VALUES ('我爱自然语言处理技术'), ('中文分词是文本处理的重要步骤'), ('pg_jieba是一个很好的中文分词工具,它基于结巴分词库'), ('ServBay 让本地开发变得简单高效');
1
2
3
4
5
Tworzenie indeksu pełnotekstowego
Aby znacznie przyspieszyć wyszukiwanie, szczególnie przy dużej liczbie danych, zaleca się utworzenie indeksu GIN na wybranej kolumnie z tekstem. GIN (Generalized Inverted Index) to specjalny typ indeksu dla wyszukiwania pełnotekstowego w PostgreSQL.
Utwórz indeks GIN: Skorzystaj z funkcji
to_tsvector
i konfiguracjichinese
, by utworzyć indeks na kolumniecontent
:sqlCREATE INDEX idx_gin_content ON documents USING gin (to_tsvector('chinese', content));
1
Przeprowadzanie zapytań pełnotekstowych
Teraz możesz korzystać z funkcji to_tsquery
oraz operatora @@
do uruchamiania zapytań pełnotekstowych. to_tsquery('chinese', 'twoje_zapytanie')
tworzy zapytanie w oparciu o wybraną konfigurację wyszukiwania tekstu. Operator @@
sprawdza, czy dane zindeksowane pasują do zapytania.
Przykładowe zapytanie wyszukujące: Znajdź dokumenty zawierające zarówno frazę "中文" jak i "分词":
sqlSELECT id, content FROM documents WHERE to_tsvector('chinese', content) @@ to_tsquery('chinese', '中文 & 分词');
1
2
3
4
5Symbol
&
oznacza logiczne AND. Możesz też używać|
(OR) i!
(NOT).Przykład zapytania o dokumenty zawierające "ServBay" lub "开发":
sqlSELECT id, content FROM documents WHERE to_tsvector('chinese', content) @@ to_tsquery('chinese', 'ServBay | 开发');
1
2
3
4
5
Słownik użytkownika (custom dictionary)
pg_jieba
korzysta domyślnie ze słownika Jieba podczas segmentacji. W specyficznych przypadkach możesz chcieć dodać własne słowa (np. terminologię branżową, nazwy produktów) dla większej precyzji.
Możesz to zrobić, przygotowując plik słownika oraz konfigurując pg_jieba
, by go używał.
Dodawanie własnych słów
Stwórz plik słownika użytkownika: W katalogu konfiguracyjnym ServBay utwórz plik tekstowy, na przykład:
plaintext/Applications/ServBay/etc/pg_jieba/custom_dict.txt
1To przykładowa ścieżka – wybierz miejsce zgodnie z instalacją ServBay i własnymi preferencjami.
Dodawaj hasła do słownika: Każda linia to jedno słowo. Opcjonalnie można dodać po spacji częstotliwość i tag części mowy:
słowo [częstotliwość [tag]]
. Im wyższa wartość, tym większa szansa na wydzielenie wyrazu.plaintext自然语言处理 3 n ServBay 5 eng 结巴分词库 3 n
1
2
3Przykładowo:
自然语言处理 3 n
ustawia częstotliwość na 3 i tag jako rzeczownik (n),ServBay 5 eng
– częstotliwość 5, tag "eng" (angielski).Skonfiguruj
pg_jieba
, by korzystał z własnego słownika: W sesji PostgreSQL ustaw parametrpg_jieba.dict_path
na katalog z Twoim słownikiem. Uwaga:pg_jieba.dict_path
zwykle wskazuje na katalog, nie na konkretny plik. Jeśli własny słownik jest w tym samym katalogu co główny lub w domyślnym katalogupg_jieba
, nie musisz zmieniać tej ścieżki. Szczegóły mogą zależeć od konfiguracji ServBay; sprawdź dokumentację lub przetestuj ustawienie.Jeżeli ServBay pozwala bezpośrednio wskazywać plik słownika lub plik jest w domyślnie skanowanym katalogu, tę konfigurację możesz pominąć lub dostosować. Przykładowe polecenia (sprawdź w swojej instalacji):
sqlSET pg_jieba.dict_path = '/Applications/ServBay/etc/pg_jieba/'; -- Załóżmy, że główny słownik i custom_dict.txt są w tym katalogu
1Lub, jeśli
dict_path
pozwala wskazać plik (co jest niestandardowe, ale zgodne z oryginałem):sqlSET pg_jieba.dict_path = '/Applications/ServBay/etc/pg_jieba/custom_dict.txt'; -- Użyj ostrożnie, zweryfikuj w swojej instalacji
1Ważne:
SET
działa tylko w bieżącej sesji. By ustawić na stałe, zmodyfikuj plik konfiguracyjny PostgreSQLpostgresql.conf
i dodaj tam odpowiedni wpis.
Przeładowanie słownika
Po zmianie pliku własnego słownika lub ustawienia pg_jieba.dict_path
musisz przeładować słownik, by zmiany zaczęły działać.
Przeładuj słownik: Wykonaj:
sqlSELECT jieba_reload_dict();
1Po sukcesie kolejne operacje segmentacji będą uwzględniać nowy słownik.
Najczęściej zadawane pytania (FAQ)
P: Podczas
CREATE EXTENSION pg_jieba;
pojawia się błąd "extension 'pg_jieba' is not available". Co zrobić? O: Oznacza to najczęściej, że pliki rozszerzenia nie są prawidłowo zainstalowane w katalogu rozszerzeń PostgreSQL, lub PostgreSQL nie może ich znaleźć. W ServBaypg_jieba
jest domyślnie dostępny – upewnij się, że korzystasz z instancji PostgreSQL uruchomionej przez ServBay i instalacja nie jest uszkodzona. Jeśli problem trwa, spróbuj ponownie uruchomić ServBay lub sprawdzić logi ServBay.P: Słownik użytkownika nie działa – co robić? O: Sprawdź:
- Czy ścieżka do własnego słownika jest poprawna, oraz czy użytkownik PostgreSQL ma uprawnienia odczytu.
- Czy format pliku jest poprawny – jedno słowo na linię, opcjonalnie częstotliwość i tag oddzielone spacją.
- Czy parametr
pg_jieba.dict_path
został ustawiony poprawnie? Pamiętaj, żeSET
działa tylko w danej sesji; aby obowiązywało stale, zmień ustawienie wpostgresql.conf
. - Czy wykonałeś funkcję
SELECT jieba_reload_dict();
, by przeładować słownik. - Po zmianach w
postgresql.conf
należy zrestartować usługę PostgreSQL.
P: Wyniki wyszukiwania pełnotekstowego są niedokładne – jak poprawić? O: Dokładność zależy od sposobu segmentacji oraz budowy zapytania.
- Analiza segmentacji: Użyj funkcji
ts_debug('chinese', 'Twój tekst')
, by zobaczyć, jakchinese
segmentuje konkretny tekst. Dzięki temu sprawdzisz, czypg_jieba
dobrze rozpoznaje słowa i czy własny słownik działa. - Optymalizacja mapowania: Dostosuj polecenie
ALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR ... WITH simple;
i usuń nieistotne części mowy (np. partykuły, znaki interpunkcyjne). - Optymalizacja zapytań: Sprawdź, czy zapytanie
to_tsquery
i zastosowane operatory logiczne (&
,|
,!
) wyrażają Twoje intencje.
- Analiza segmentacji: Użyj funkcji
Podsumowanie
pg_jieba
to potężne narzędzie umożliwiające wyszukiwanie pełnotekstowe treści chińskich w PostgreSQL. Dzięki preinstalowanemu rozszerzeniu w ServBay, deweloperzy mogą błyskawicznie uruchomić tę funkcjonalność lokalnie – skorzystać z segmentacji chińskiego, konfiguracji wyszukiwania tekstu, przykładowych zapytań oraz własnych słowników. Zastosowanie tych technik znacząco poprawia przeszukiwalność treści chińskich w Twoich projektach.