ServBay'de pg_jieba ile PostgreSQL Çince Tam Metin Arama
Genel Bakış
İngilizce gibi dillerde, PostgreSQL'in yerleşik tam metin arama işlevi, boşluk ve noktalama işaretlerine dayalı sözcüksel analiz (lexical analysis) sayesinde etkili bir şekilde çalışır. Ancak Çince metinler doğal olarak boşluklarla ayrılmaz, bu nedenle birbirine bitişik karakter dizilerini anlamlı kelimelere ayırmak için özel bir kelime segmentasyon (segmentation) aracı gerekir.
pg_jieba
, popüler Jieba Çince kelime segmentasyon kütüphanesini PostgreSQL veri tabanına entegre eden üçüncü parti bir uzantıdır. pg_jieba
sayesinde, PostgreSQL'de Çince metinlerde verimli ve doğru segmentasyon yapabilir, güçlü bir Çince tam metin arama sistemi kurabilirsiniz.
ServBay, entegre bir yerel web geliştirme ortamı olarak, pg_jieba
uzantısını önceden kurulu olarak sunar; böylece derleme ve kurulum zorluklarıyla uğraşmadan yerel ortamınızda hemen Çince tam metin arama geliştirmelerine başlayabilirsiniz.
Bu makalede, ServBay ortamında pg_jieba
uzantısının nasıl etkinleştirileceği, yapılandırılacağı ve kullanılacağı ayrıntılı olarak açıklanmaktadır.
Ön Koşullar
pg_jieba
'yı kullanmaya başlamadan önce aşağıdaki hazırlıkları tamamladığınızdan emin olun:
- ServBay'i macOS sisteminize kurmuş olun ve PostgreSQL veri tabanı başarıyla çalışıyor olsun.
- Temel PostgreSQL veri tabanı işlemleri konusunda bilgi sahibi olun (ör. veri tabanına nasıl bağlanılır ve SQL komutları nasıl çalıştırılır).
pg_jieba'nın Kurulumu ve Etkinleştirilmesi
ServBay, pg_jieba
uzantısını PostgreSQL ile birlikte paketler. Manuel indirme veya derleme gerekmez; yalnızca hedef veri tabanınızda basit bir SQL komutuyla uzantıyı etkinleştirebilirsiniz.
Aşağıdaki adımlar ile pg_jieba
uzantısını etkinleştirin:
PostgreSQL Veri Tabanınıza Bağlanın: Terminal uygulamasını açın ve
psql
komut satırı aracıyla PostgreSQL veri tabanınıza bağlanın.your_username
yerine PostgreSQL kullanıcı adınızı,your_database
yerine ise veri tabanı adınızı girin. ServBay'in varsayılan PostgreSQL kullanıcısı ve veri tabanı genellikleservbay
veyapostgres
'tir.bashpsql -U your_username -d your_database
1Örnek: Varsayılan kullanıcı ve veri tabanıyla:
bashpsql -U servbay -d servbay
1pg_jieba
Uzantısını Oluşturup Etkinleştirin:psql
arayüzünde aşağıdaki SQL komutunu çalıştırın:sqlCREATE EXTENSION pg_jieba;
1Uzantı daha önce eklenmişse, bu komutu tekrar çalıştırmak hata verebilir; bu normaldir.
pg_jieba
Uzantısının Etkinleştiğini Doğrulayın: Aşağıdaki komutu çalıştırarak mevcut veri tabanındaki kurulu uzantıları listeleyin:sql\dx
1Eğer listede
pg_jieba
görünüyorsa, uzantı başarıyla etkinleştirilmiştir.
pg_jieba ile Çince Tam Metin Arama Yapılandırması
Uzantıyı etkinleştirdikten sonra, PostgreSQL’in metin arama (Text Search) özelliğini pg_jieba
segmentleyicisiyle kullanacak şekilde yapılandırmanız gerekir.
Metin Arama Yapılandırması (Text Search Configuration)
Metin arama yapılandırması, tam metin arama için belgelerin nasıl işleneceğini tanımlar; hangi ayrıştırıcının (parser) kullanılacağını ve çeşitli kelime türlerinin (token) nasıl yorumlanacağını belirler.
Yeni Bir Metin Arama Yapılandırması Oluşturun:
chinese
adında bir metin arama yapılandırması oluşturup, analiz edici (parser) olarakpg_jieba
atayın.sqlCREATE TEXT SEARCH CONFIGURATION chinese (PARSER = pg_jieba);
1Bu yapılandırma, PostgreSQL’e metinleri işlerken
pg_jieba
yı kullanmasını söyler.Segmentasyon Sonuçları için Haritalama Ekleyin (Mapping):
pg_jieba
parser'ı, kelime türüne (part of speech) göre farklı türde token'lar üretir. Bu token'ların indekslenip aranabilmesi için, belirli bir sözlüğe (dictionary) haritalanmaları gerekir. Burada yaygın kelime türlerini (isim, fiil, sıfat vb.) PostgreSQL’in yerleşiksimple
sözlüğüne bağlıyoruz.simple
sözlüğü, genellikle gelen token'ı aynen kullanır.sqlALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR n,v,a,i,e,l WITH simple;
1Buradaki
n,v,a,i,e,l
,pg_jieba
'nın tespit edebildiği yaygın kelime türlerindendir. İhtiyacınıza göre bu listeyi genişletebilir veya değiştirebilirsiniz. Sık kullanılan etiketler:n
: İsimv
: Fiila
: Sıfati
: Deyime
: Ünleml
: İfadenr
: Kişi adıns
: Yer adınt
: Kurum/organizasyonnz
: Diğer özel isimm
: Sayıq
: Ölçü birimit
: Zamans
: Mekanf
: Yön belirten kelimep
: Edatc
: Bağlaçu
: Yardımcı kelimexc
: Diğer sanal kelimew
: Noktalama işaretieng
: İngilizce kelimex
: Morfem olmayan karakterler
Genellikle, anlamlı kelime türlerini (isim, fiil, sıfat) indeksleme ve arama için kullanırsınız.
pg_jieba ile Tam Metin Arama Örneği
Yapılandırmayı tamamladıktan sonra, pg_jieba
ile Çince tam metin arama işlemlerine başlayabilirsiniz. Aşağıda temel bir örnek verilmiştir:
Örnek Tablo ve Veri Oluşturma
Öncelikle, içerisinde Çince metinler barındıracak bir tablo oluşturup örnek veriler ekleyelim.
Tablo Oluşturun:
sqlCREATE TABLE documents ( id SERIAL PRIMARY KEY, content TEXT );
1
2
3
4Örnek Veri Ekleyin:
sqlINSERT INTO documents (content) VALUES ('我爱自然语言处理技术'), ('中文分词是文本处理的重要步骤'), ('pg_jieba是一个很好的中文分词工具,它基于结巴分词库'), ('ServBay 让本地开发变得简单高效');
1
2
3
4
5
Tam Metin Arama İndeksi Oluşturma
Büyük veri hacimleri için arama performansını artırmak adına, tam metin aramada kullanılacak sütun üzerinde indeks oluşturmanız tavsiye edilir. PostgreSQL'in GIN (Generalized Inverted Index) türü tam metin arama için özellikle uygundur.
GIN İndeksi Oluşturun: Daha önce oluşturduğumuz
chinese
yapılandırması ile birlikteto_tsvector
fonksiyonunu kullanarak,content
sütunu üzerinde GIN indeksi oluşturun.to_tsvector('chinese', content)
ifadesi,content
alanındaki metnipg_jieba
segmentleyicisiyle işleyip içsel olarak kullanılacaktsvector
tipine çevirir.sqlCREATE INDEX idx_gin_content ON documents USING gin (to_tsvector('chinese', content));
1
Tam Metin Arama Sorgusu Çalıştırmak
Artık, to_tsquery
fonksiyonu ve @@
operatörü ile tam metin arama sorguları gerçekleştirebilirsiniz. to_tsquery('chinese', 'arama ifadeniz')
, sorgu ifadenizi tsquery
tipine çevirir; @@
operatörü bir tsvector
'ün sorguyla eşleşip eşleşmediğini kontrol eder.
Arama Sorgusu Çalıştırın: "中文" (Çince) ve "分词" (Segmentasyon) kelimelerinin ikisini de içeren kayıtları bulun.
sqlSELECT id, content FROM documents WHERE to_tsvector('chinese', content) @@ to_tsquery('chinese', '中文 & 分词');
1
2
3
4
5&
işaretitsquery
'de mantıksal VE işlevidir. Alternatif olarak|
(VEYA) veya!
(DEĞİL) operatörlerini de kullanabilirsiniz.Örneğin, "ServBay" veya "开发" (Geliştirme) kelimelerinden herhangi birini içeren kayıtları arayın:
sqlSELECT id, content FROM documents WHERE to_tsvector('chinese', content) @@ to_tsquery('chinese', 'ServBay | 开发');
1
2
3
4
5
Özel Sözlük Kullanımı
pg_jieba
, varsayılan Jieba sözlüğü ile segmentasyon yapar. Ancak bazı özel senaryolarda, segmentasyon doğruluğunu artırmak için kendi terimlerinizi (ör. teknik terimler, ürün adları) eklemek isteyebilirsiniz.
Kendi özel sözlük dosyanızı oluşturup pg_jieba
ya tanıtabilirsiniz.
Özel Terim Ekleme
Özel Sözlük Dosyası Oluşturun: ServBay yapılandırma klasöründe bir metin dosyası oluşturun, örneğin:
plaintext/Applications/ServBay/etc/pg_jieba/custom_dict.txt
1Bu, önerilen bir konumdur; ServBay'in kurulu olduğu dizine göre uygun yolu belirleyebilirsiniz.
Özel Terimleri Sözlük Dosyasına Ekleyin:
custom_dict.txt
dosyasını bir metin düzenleyiciyle açın, satır başına bir terim gelecek şekilde ekleyin. Ayrıca isterseniz terim arkasından boşlukla ayrılmış olarak sırasıyla frekans (frequency) ve kelime türü (tag) de ekleyebilirsiniz:kelime [frekans [etiket]]
. Frekans arttıkça, kelimenin segmentlenme olasılığı yükselir.plaintext自然语言处理 3 n ServBay 5 eng 结巴分词库 3 n
1
2
3Burada
3 n
, "自然语言处理" kelimesinin frekansı 3, türü ise isim anlamına gelir.5 eng
, "ServBay"in frekansı 5 ve türü İngilizce kelime anlamındadır.pg_jieba
ya Özel Sözlük Yolunu Tanımlayın: PostgreSQL oturumunuzda,pg_jieba.dict_path
parametresiyle özel sözlük dosyanızın bulunduğu dizini belirtin. Dikkat:pg_jieba.dict_path
tipik olarak dizin yolunu alır, tek tek dosya ismi değil. Özel sözlüğü ana sözlükle aynı dizine koyduysanız veya ServBay'inpg_jieba
yapılandırmasında sözlük dizini belirtilmişse, ekstra ayar yapmanız gerekmez. Detaylar için ServBay dokümantasyonuna veya deneme-yanılma yoluna başvurabilirsiniz.Eğer ServBay'in
pg_jieba
yapılandırması doğrudan özel sözlük dosyasını belirtmeye izin veriyorsa veya özel sözlüğünüzpg_jieba
nın varsayılan dizinindeyse, aşağıdaki komut ihtiyaca göre uyarlanabilir:sqlSET pg_jieba.dict_path = '/Applications/ServBay/etc/pg_jieba/'; -- Varsayılan olarak burada ana sözlük ve custom_dict.txt birlikte bulunuyor varsayılmıştır
1Ya da, doğrudan dosya da belirtilebiliyorsa (standart dışıdır, emin olmak için ServBay ayarlarına bakınız):
sqlSET pg_jieba.dict_path = '/Applications/ServBay/etc/pg_jieba/custom_dict.txt'; -- Kullanmadan önce ServBay ayarlarından emin olun
1Önemli:
SET
komutu yalnızca geçerli veri tabanı oturumunda geçerlidir. Kalıcı yapmak için PostgreSQL’inpostgresql.conf
dosyasına uygun yolu eklemeniz gerekir.
Sözlüğü Yeniden Yüklemek
Özel sözlük dosyasını veya pg_jieba.dict_path
ayarını değiştirdiğinizde, değişikliklerin geçerli olması için pg_jieba
ya sözlüğü tekrar yüklemesini bildirmeniz gerekir.
Sözlüğü Yeniden Yükleyin: Aşağıdaki SQL fonksiyonunu çağırın:
sqlSELECT jieba_reload_dict();
1Başarıyla çalıştırdıktan sonra, yeni segmentasyon işlemleri güncellenmiş sözlüğü kullanacaktır.
Sık Sorulan Sorular (SSS)
Soru:
CREATE EXTENSION pg_jieba;
komutunu çalıştırırken "extension "pg_jieba" is not available" hatası alıyorum, ne yapmalıyım? Cevap: Bu genellikle,pg_jieba
uzantı dosyasının PostgreSQL’in uzantılar dizininde olmadığını veya PostgreSQL’in onu bulamadığını gösterir. ServBay'de,pg_jieba
yüklü gelmelidir. Doğru PostgreSQL (ServBay sürümü) ile bağlantı kurduğunuzdan ve ServBay kurulumunun düzgün olduğundan emin olun. Sorun devam ederse, ServBay’i tekrar başlatmayı ya da günlük dosyalarını kontrol etmeyi deneyin.Soru: Özel sözlük çalışmıyor, sebebi ne olabilir? Cevap: Aşağıdakileri kontrol edin:
- Özel sözlük dosyasının yolu doğru mu ve PostgreSQL kullanıcısı bu dosyayı okuyabiliyor mu?
- Sözlük dosyasının formatı doğru mu (satır başına bir kelime, isteğe bağlı frekans ve tür boşlukla ayrılmış olmalı)?
pg_jieba.dict_path
parametresini doğru ayarladınız mı? Unutmayın,SET
komutu yalnızca geçerli oturum için geçerlidir, kalıcı içinpostgresql.conf
dosyasını düzenleyin.SELECT jieba_reload_dict();
fonksiyonuyla sözlüğü yeniden yüklediniz mi?- Eğer
postgresql.conf
dosyasında değişiklik yaptıysanız, PostgreSQL servisini yeniden başlattınız mı?
Soru: Tam metin arama sonuçları beklendiği gibi değil, ne yapabilirim? Cevap: Sonuçların doğruluğu segmentasyon başarısı ve sorgu formülasyonuna bağlıdır.
- Segmentasyon kontrolü:
ts_debug('chinese', 'aranan metin')
fonksiyonuyla belirli bir metninchinese
yapılandırmasında nasıl segmentlendiğini görebilirsiniz. Böylecepg_jieba
nın kelimeleri doğru tanıyıp tanımadığı ve özel sözlüğünüzün etkili olup olmadığını kontrol edebilirsiniz. - Segmentasyon ayarlarını optimize edin:
ALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR ... WITH simple;
komutunda önemli olmayan türleri (örn. yardımcı kelimeler, noktalama) hariç tutarak daha iyi bir segmentasyon elde edebilirsiniz. - Sorgu optimizasyonu:
to_tsquery
'deki arama kelimelerinizin ve mantıksal operatörlerin (&
,|
,!
) arama niyetinizi tam yansıttığından emin olun.
- Segmentasyon kontrolü:
Sonuç
pg_jieba
, PostgreSQL'de Çince tam metin arama sistemi kurmak için güçlü bir araçtır. ServBay'in önceden kurulu pg_jieba
uzantısı sayesinde, geliştiriciler yerel ortamda hızla Çince segmentasyon ve tam metin arama uygulamalarını etkinleştirebilir. Bu makalede anlatılan adımlar doğrultusunda; pg_jieba'nın nasıl etkinleştirileceğini, metin arama yapılandırması ve temel tam metin arama sorgularının nasıl gerçekleştirileceğini ve özel sözlüklerle segmentasyonun nasıl iyileştirileceğini öğrenmiş olmalısınız. Bu teknikleri projelerinizde uygulayarak Çince içeriklerin aranabilirliğini önemli ölçüde artırabilirsiniz.