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_usernameswoją nazwą użytkownika, ayour_database– nazwą bazy danych. Domyślni użytkownicy i bazy ServBay to zwykleservbaylubpostgres.bashpsql -U your_username -d your_database1Przykład z domyślnym użytkownikiem i bazą:
bashpsql -U servbay -d servbay1Utwórz i aktywuj rozszerzenie
pg_jieba: W interfejsiepsqluruchom 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\dx1Jeśli zobaczysz
pg_jiebana 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
chinesez parserempg_jieba.sqlCREATE TEXT SEARCH CONFIGURATION chinese (PARSER = pg_jieba);1Dzięki tej konfiguracji PostgreSQL będzie wykorzystywać
pg_jiebapodczas analizy tekstu.Dodaj mapowania dla rezultatów segmentacji (Mapping): Parser
pg_jiebageneruje 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,lto 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_tsvectori 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.txt1To 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 n1
2
3Przykładowo:
自然语言处理 3 nustawia 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_pathna katalog z Twoim słownikiem. Uwaga:pg_jieba.dict_pathzwykle 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 katalogu1Lub, jeśli
dict_pathpozwala 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 instalacji1Ważne:
SETdziała tylko w bieżącej sesji. By ustawić na stałe, zmodyfikuj plik konfiguracyjny PostgreSQLpostgresql.confi 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_jiebajest 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_pathzostał ustawiony poprawnie? Pamiętaj, żeSETdział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.confnależ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ć, jakchinesesegmentuje konkretny tekst. Dzięki temu sprawdzisz, czypg_jiebadobrze 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_tsqueryi 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.
