{"id":31527,"date":"2025-10-10T23:41:18","date_gmt":"2025-10-10T20:41:18","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=31527"},"modified":"2025-10-10T23:41:18","modified_gmt":"2025-10-10T20:41:18","slug":"postgresqlde-tam-metin-arama-full-text-search-kullanimi-ubuntu-16-04-uzerinde-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/postgresqlde-tam-metin-arama-full-text-search-kullanimi-ubuntu-16-04-uzerinde-kapsamli-bir-rehber\/","title":{"rendered":"PostgreSQL&#8217;de Tam Metin Arama (Full-Text Search) Kullan\u0131m\u0131: Ubuntu 16.04 \u00dczerinde Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>PostgreSQL&#8217;de Tam Metin Arama (Full-Text Search) Kullan\u0131m\u0131: Ubuntu 16.04 \u00dczerinde Kapsaml\u0131 Bir Rehber<\/h2>\n<h3>Giri\u015f: Tam Metin Arama Neden \u00d6nemli?<\/h3>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn veri odakl\u0131 d\u00fcnyas\u0131nda, b\u00fcy\u00fck metin koleksiyonlar\u0131 i\u00e7inde h\u0131zl\u0131 ve alakal\u0131 bilgi bulma yetene\u011fi kritik bir \u00f6neme sahiptir. Blog g\u00f6nderileri, makaleler, \u00fcr\u00fcn a\u00e7\u0131klamalar\u0131, yorumlar veya dok\u00fcmanlar gibi metin tabanl\u0131 veriler, kullan\u0131c\u0131lar\u0131n arad\u0131klar\u0131 i\u00e7eri\u011fe kolayca ula\u015fabilmeleri i\u00e7in etkin bir arama mekanizmas\u0131na ihtiya\u00e7 duyar. Geleneksel veritaban\u0131 sorgulama y\u00f6ntemleri, bu t\u00fcr karma\u015f\u0131k arama ihtiya\u00e7lar\u0131n\u0131 kar\u015f\u0131lamakta yetersiz kalabilir. \u0130\u015fte bu noktada Tam Metin Arama (Full-Text Search &#8211; FTS) devreye girer.<\/p>\n<h4>Geleneksel Arama Y\u00f6ntemlerinin S\u0131n\u0131rl\u0131l\u0131klar\u0131<\/h4>\n<p>Veritabanlar\u0131nda metin arama denilince akla ilk gelen y\u00f6ntemlerden biri <code>LIKE<\/code> operat\u00f6r\u00fc veya <code>ILIKE<\/code> (b\u00fcy\u00fck\/k\u00fc\u00e7\u00fck harf duyars\u0131z) operat\u00f6r\u00fc ile yap\u0131lan aramalard\u0131r. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-sql\">SELECT * FROM makaleler WHERE icerik LIKE '%PostgreSQL%';<\/code><\/pre>\n<p>Bu y\u00f6ntem basit aramalar i\u00e7in yeterli olabilirken, ciddi s\u0131n\u0131rlamalara sahiptir:<\/p>\n<p>1.  <strong>Performans:<\/strong> B\u00fcy\u00fck metin s\u00fctunlar\u0131 \u00fczerinde <code>LIKE '%kelime%'<\/code> \u015feklinde yap\u0131lan aramalar, indeks kullanamad\u0131\u011f\u0131 i\u00e7in tam tablo taramas\u0131na (full table scan) yol a\u00e7ar ve \u00e7ok yava\u015f \u00e7al\u0131\u015f\u0131r.<br \/>\n2.  <strong>Alaka D\u00fczeyi:<\/strong> <code>LIKE<\/code> sadece tam e\u015fle\u015fmeler veya k\u0131smi dizgi e\u015fle\u015fmeleri bulur. Bir kelimenin farkl\u0131 \u00e7ekimlerini (\u00f6rne\u011fin &#8220;ko\u015fmak&#8221;, &#8220;ko\u015ftu&#8221;, &#8220;ko\u015fuyor&#8221;) veya e\u015fanlaml\u0131lar\u0131n\u0131 (\u00f6rne\u011fin &#8220;araba&#8221;, &#8220;otomobil&#8221;) dikkate almaz. Bu da arama sonu\u00e7lar\u0131n\u0131n alaka d\u00fczeyini d\u00fc\u015f\u00fcr\u00fcr.<br \/>\n3.  <strong>Dil Deste\u011fi:<\/strong> Dilin morfolojik yap\u0131s\u0131 (k\u00f6k bulma, ekler) g\u00f6z ard\u0131 edilir. \u00d6rne\u011fin, &#8220;kitaplar&#8221; kelimesini arayan bir kullan\u0131c\u0131 &#8220;kitap&#8221; kelimesini i\u00e7eren belgeleri bulamayabilir.<br \/>\n4.  <strong>S\u0131ralama:<\/strong> Arama sonu\u00e7lar\u0131 i\u00e7in do\u011fal bir s\u0131ralama (en alakal\u0131dan en az alakal\u0131ya) mekanizmas\u0131 sunmaz.<\/p>\n<h4>Tam Metin Araman\u0131n Temelleri<\/h4>\n<p>Tam Metin Arama, bu s\u0131n\u0131rlamalar\u0131 a\u015fmak i\u00e7in \u00f6zel olarak tasarlanm\u0131\u015f bir teknolojidir. Bir metin belgesini kelimelere ay\u0131rma (tokenization), gereksiz kelimeleri \u00e7\u0131karma (stop words removal), kelimeleri k\u00f6klerine indirgeme (stemming) ve bu kelimeleri indeksleme gibi ad\u0131mlar\u0131 i\u00e7erir. Bu sayede:<\/p>\n<p>*   <strong>H\u0131zl\u0131 Arama:<\/strong> \u00d6zel indeks yap\u0131lar\u0131 (PostgreSQL&#8217;de genellikle GIN indeksleri) sayesinde \u00e7ok b\u00fcy\u00fck veri setlerinde bile saniyeler i\u00e7inde arama yap\u0131labilir.<br \/>\n*   <strong>Alakal\u0131 Sonu\u00e7lar:<\/strong> Kelime k\u00f6klerini ve bazen e\u015fanlaml\u0131lar\u0131 dikkate alarak daha do\u011fru ve alakal\u0131 sonu\u00e7lar sunar.<br \/>\n*   <strong>Dil Deste\u011fi:<\/strong> Farkl\u0131 dillerin morfolojik yap\u0131lar\u0131na uygun analizler yapabilir.<br \/>\n*   <strong>S\u0131ralama (Ranking):<\/strong> Arama sorgusuyla belgenin ne kadar alakal\u0131 oldu\u011funu g\u00f6steren bir skor \u00fcreterek sonu\u00e7lar\u0131 en alakal\u0131dan ba\u015flayarak s\u0131ralar.<br \/>\n*   <strong>Vurgulama (Highlighting):<\/strong> Arama terimlerinin metin i\u00e7inde vurgulanarak g\u00f6sterilmesini sa\u011flar.<\/p>\n<p>PostgreSQL, kendi i\u00e7inde g\u00fc\u00e7l\u00fc ve esnek bir Tam Metin Arama motoruna sahiptir. Bu makalede, Ubuntu 16.04 i\u015fletim sistemi \u00fczerinde PostgreSQL&#8217;in bu yeteneklerini nas\u0131l kullanaca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz.<\/p>\n<h3>PostgreSQL Tam Metin Arama Bile\u015fenleri<\/h3>\n<p>PostgreSQL&#8217;in Tam Metin Arama sistemi, bir dizi \u00f6zel veri t\u00fcr\u00fc, fonksiyon ve operat\u00f6r etraf\u0131nda in\u015fa edilmi\u015ftir. Bu bile\u015fenleri anlamak, etkili FTS \u00e7\u00f6z\u00fcmleri geli\u015ftirmek i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h4>tsvector: Belgelerin Vekt\u00f6rel Temsili<\/h4>\n<p><code>tsvector<\/code> (text search vector), bir metin belgesinin tam metin arama i\u00e7in optimize edilmi\u015f bir g\u00f6sterimidir. Bir metin <code>tsvector<\/code>&#8216;a d\u00f6n\u00fc\u015ft\u00fcr\u00fcld\u00fc\u011f\u00fcnde, a\u015fa\u011f\u0131daki i\u015flemlerden ge\u00e7er:<\/p>\n<p>1.  <strong>Tokenization (Kelimeye Ay\u0131rma):<\/strong> Metin kelimelere, say\u0131lara, sembollere vb. ayr\u0131l\u0131r.<br \/>\n2.  <strong>Normalization (Normalle\u015ftirme):<\/strong> T\u00fcm kelimeler k\u00fc\u00e7\u00fck harfe d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcr.<br \/>\n3.  <strong>Stop Word Removal (Durak Kelime \u00c7\u0131karma):<\/strong> &#8220;ve&#8221;, &#8220;bir&#8221;, &#8220;bu&#8221;, &#8220;o&#8221; gibi anlams\u0131z veya yayg\u0131n kelimeler (stop words) listeden \u00e7\u0131kar\u0131l\u0131r. Bu kelimeler arama sonu\u00e7lar\u0131n\u0131n alaka d\u00fczeyini etkilemedi\u011fi ve indeks boyutunu art\u0131rd\u0131\u011f\u0131 i\u00e7in genellikle g\u00f6z ard\u0131 edilir.<br \/>\n4.  <strong>Stemming (K\u00f6k Bulma):<\/strong> Kelimeler, dilin kurallar\u0131na g\u00f6re k\u00f6klerine indirgenir. \u00d6rne\u011fin, \u0130ngilizce&#8217;de &#8220;running&#8221;, &#8220;runs&#8221;, &#8220;ran&#8221; kelimeleri &#8220;run&#8221; k\u00f6k\u00fcne indirgenir. T\u00fcrk\u00e7e&#8217;de &#8220;kitaplar&#8221;, &#8220;kitab\u0131&#8221;, &#8220;kitapl\u0131k&#8221; gibi kelimeler &#8220;kitap&#8221; k\u00f6k\u00fcne indirgenebilir.<\/p>\n<p>Sonu\u00e7 olarak <code>tsvector<\/code>, kelime k\u00f6klerinin ve metin i\u00e7indeki konumlar\u0131n\u0131n (iste\u011fe ba\u011fl\u0131) bir listesidir. \u00d6rne\u011fin, &#8220;The quick brown fox jumps over the lazy dog&#8221; c\u00fcmlesi \u0130ngilizce yap\u0131land\u0131rmayla <code>tsvector<\/code>&#8216;a d\u00f6n\u00fc\u015ft\u00fcr\u00fcld\u00fc\u011f\u00fcnde, &#8220;quick&#8221;:2 &#8220;brown&#8221;:3 &#8220;fox&#8221;:4 &#8220;jump&#8221;:5 &#8220;lazi&#8221;:8 &#8220;dog&#8221;:9 gibi bir \u00e7\u0131kt\u0131 verebilir (say\u0131lar kelimelerin orijinal metindeki konumlar\u0131n\u0131 belirtir).<\/p>\n<h4>tsquery: Arama Sorgular\u0131n\u0131n Temsili<\/h4>\n<p><code>tsquery<\/code> (text search query), kullan\u0131c\u0131n\u0131n arama sorgusunun tam metin arama motoru taraf\u0131ndan anla\u015f\u0131labilecek bir g\u00f6sterimidir. <code>tsquery<\/code>&#8216;ler, <code>AND<\/code> (<code>&<\/code>), <code>OR<\/code> (<code>|<\/code>), <code>NOT<\/code> (<code>!<\/code>) ve <code>FOLLOWED BY<\/code> (<code><-><\/code>) gibi mant\u0131ksal operat\u00f6rleri kullanarak kelime k\u00f6klerini birle\u015ftirir. Ayr\u0131ca, \u00f6nek aramalar\u0131 i\u00e7in <code>:*<\/code> gibi \u00f6zel operat\u00f6rler de kullan\u0131labilir.<\/p>\n<p>\u00d6rnekler:<br \/>\n*   <code>PostgreSQL & veritaban\u0131<\/code>: &#8220;PostgreSQL&#8221; ve &#8220;veritaban\u0131&#8221; kelimelerini i\u00e7eren belgeleri bul.<br \/>\n*   <code>PostgreSQL | Ubuntu<\/code>: &#8220;PostgreSQL&#8221; veya &#8220;Ubuntu&#8221; kelimelerini i\u00e7eren belgeleri bul.<br \/>\n*   <code>!Windows<\/code>: &#8220;Windows&#8221; kelimesini i\u00e7ermeyen belgeleri bul.<br \/>\n*   <code>web <-> servis<\/code>: &#8220;web&#8221; kelimesinin hemen ard\u0131ndan &#8220;servis&#8221; kelimesinin geldi\u011fi belgeleri bul (c\u00fcmle arama).<br \/>\n<em>   <code>prog:<\/em><\/code>: &#8220;prog&#8221; ile ba\u015flayan kelimeleri bul (programlama, programc\u0131 vb.).<\/p>\n<h4>Temel Operat\u00f6rler: @@, &#038;&#038;, ||<\/h4>\n<p>PostgreSQL&#8217;de <code>tsvector<\/code> ve <code>tsquery<\/code> aras\u0131ndaki e\u015fle\u015fmeyi kontrol etmek i\u00e7in <code>@@<\/code> operat\u00f6r\u00fc kullan\u0131l\u0131r.<\/p>\n<p>*   <code>tsvector @@ tsquery<\/code>: Bir <code>tsvector<\/code>&#8216;\u0131n bir <code>tsquery<\/code> ile e\u015fle\u015fip e\u015fle\u015fmedi\u011fini kontrol eder. E\u011fer e\u015fle\u015fiyorsa <code>TRUE<\/code>, e\u015fle\u015fmiyorsa <code>FALSE<\/code> d\u00f6ner.<\/p>\n<p>\u00d6rnek:<\/p>\n<pre><code class=\"language-sql\">SELECT 'elma armut muz'::tsvector @@ 'elma'::tsquery; -- TRUE\nSELECT 'elma armut muz'::tsvector @@ 'kiraz'::tsquery; -- FALSE<\/code><\/pre>\n<p><code>&&<\/code> ve <code>||<\/code> operat\u00f6rleri ise <code>tsquery<\/code>&#8216;lerin kendi i\u00e7inde mant\u0131ksal birle\u015fimini sa\u011flar. Bunlar <code>tsquery<\/code> veri tipinin bir par\u00e7as\u0131d\u0131r.<\/p>\n<h4>Metin Arama Yap\u0131land\u0131rmalar\u0131 (Text Search Configurations)<\/h4>\n<p>PostgreSQL&#8217;in Tam Metin Arama sisteminin en g\u00fc\u00e7l\u00fc \u00f6zelliklerinden biri, farkl\u0131 diller ve \u00f6zel ihtiya\u00e7lar i\u00e7in \u00f6zelle\u015ftirilebilen &#8220;metin arama yap\u0131land\u0131rmalar\u0131&#8221;d\u0131r (text search configurations). Bir yap\u0131land\u0131rma, bir metni <code>tsvector<\/code>&#8216;a d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in hangi pars\u00f6r\u00fcn (ayr\u0131\u015ft\u0131r\u0131c\u0131n\u0131n), hangi s\u00f6zl\u00fcklerin (dictionaries) ve hangi durak kelime listelerinin kullan\u0131laca\u011f\u0131n\u0131 tan\u0131mlar.<\/p>\n<p>Her dil i\u00e7in (\u0130ngilizce, Almanca, T\u00fcrk\u00e7e vb.) \u00f6nceden tan\u0131mlanm\u0131\u015f yap\u0131land\u0131rmalar bulunur. \u00d6rne\u011fin, <code>english<\/code> yap\u0131land\u0131rmas\u0131 \u0130ngilizce kelimeleri k\u00f6klerine indirgemek i\u00e7in tasarlanm\u0131\u015ft\u0131r, <code>turkish<\/code> yap\u0131land\u0131rmas\u0131 ise T\u00fcrk\u00e7e kelimeler i\u00e7in benzer i\u015flemleri yapar.<\/p>\n<p>Bir yap\u0131land\u0131rma genellikle \u015fu bile\u015fenleri i\u00e7erir:<br \/>\n*   <strong>Parser (Ayr\u0131\u015ft\u0131r\u0131c\u0131):<\/strong> Metni kelimelere, say\u0131lara vb. ay\u0131r\u0131r.<br \/>\n*   <strong>Dictionaries (S\u00f6zl\u00fckler):<\/strong> Kelimelerin k\u00f6klerini bulmak (stemming), e\u015fanlaml\u0131lar\u0131 i\u015flemek veya durak kelimeleri filtrelemek i\u00e7in kullan\u0131l\u0131r. PostgreSQL, <code>simple<\/code>, <code>snowball<\/code> (k\u00f6k bulma i\u00e7in), <code>ispell<\/code> (geli\u015fmi\u015f k\u00f6k bulma ve e\u015fanlaml\u0131lar i\u00e7in), <code>synonym<\/code> gibi farkl\u0131 s\u00f6zl\u00fck t\u00fcrlerini destekler.<br \/>\n*   <strong>Stop Word Lists (Durak Kelime Listeleri):<\/strong> Hangi kelimelerin g\u00f6z ard\u0131 edilece\u011fini belirler.<\/p>\n<h3>Ubuntu 16.04 \u00dczerinde Ortam Kurulumu<\/h3>\n<p>Bu b\u00f6l\u00fcmde, Ubuntu 16.04 sisteminizde PostgreSQL&#8217;i kurmay\u0131 ve tam metin arama \u00f6zelliklerini kullanmaya ba\u015flamak i\u00e7in gerekli temel ad\u0131mlar\u0131 ele alaca\u011f\u0131z. Ubuntu 16.04 genellikle PostgreSQL 9.5 veya 9.6 s\u00fcr\u00fcm\u00fcn\u00fc depolar\u0131nda bar\u0131nd\u0131r\u0131r. Bu s\u00fcr\u00fcmler FTS i\u00e7in gerekli t\u00fcm temel fonksiyonlar\u0131 ve veri tiplerini i\u00e7erir.<\/p>\n<h4>PostgreSQL Kurulumu ve Veritaban\u0131 Ba\u011flant\u0131s\u0131<\/h4>\n<p>E\u011fer sisteminizde PostgreSQL kurulu de\u011filse, a\u015fa\u011f\u0131daki komutlarla kurabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">sudo apt update\nsudo apt install postgresql postgresql-contrib<\/code><\/pre>\n<p><code>postgresql-contrib<\/code> paketi, tam metin arama i\u00e7in gerekli olan <code>pg_trgm<\/code> gibi ek mod\u00fclleri ve baz\u0131 yararl\u0131 fonksiyonlar\u0131 i\u00e7erir.<\/p>\n<p>Kurulumdan sonra, varsay\u0131lan <code>postgres<\/code> kullan\u0131c\u0131s\u0131 ile veritaban\u0131na ba\u011flanabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">sudo -i -u postgres psql<\/code><\/pre>\n<p>Bu komut sizi PostgreSQL komut sat\u0131r\u0131 aray\u00fcz\u00fcne (psql) ba\u011flayacakt\u0131r.<\/p>\n<h4>\u00d6rnek Veritaban\u0131 ve Tablo Olu\u015fturma<\/h4>\n<p>\u015eimdi tam metin arama yeteneklerini test etmek i\u00e7in basit bir veritaban\u0131 ve tablo olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-sql\">CREATE DATABASE fts_demo;\n\\c fts_demo; -- fts_demo veritaban\u0131na ba\u011flan\n\nCREATE TABLE makaleler (\n    id SERIAL PRIMARY KEY,\n    baslik TEXT NOT NULL,\n    icerik TEXT NOT NULL,\n    yazar TEXT,\n    yayin_tarihi DATE DEFAULT CURRENT_DATE\n);\n\n-- \u00d6rnek veriler ekleyelim\nINSERT INTO makaleler (baslik, icerik, yazar) VALUES\n('PostgreSQL ile Tam Metin Arama', 'Bu makale PostgreSQL veritaban\u0131nda tam metin arama \u00f6zelliklerinin nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 anlatmaktad\u0131r. Performansl\u0131 ve alakal\u0131 sonu\u00e7lar elde etmek i\u00e7in idealdir.', 'Ali Can'),\n('Ubuntu 16.04 Kurulum Rehberi', 'Ubuntu 16.04 LTS s\u00fcr\u00fcm\u00fcn\u00fcn kurulum ad\u0131mlar\u0131 ve temel yap\u0131land\u0131rmalar\u0131 bu rehberde detayl\u0131ca a\u00e7\u0131klanm\u0131\u015ft\u0131r.', 'Ay\u015fe Demir'),\n('Veritaban\u0131 Optimizasyonu \u0130pu\u00e7lar\u0131', 'PostgreSQL veritaban\u0131 performans\u0131n\u0131 art\u0131rmak i\u00e7in indeksleme, sorgu optimizasyonu ve ba\u011flant\u0131 havuzu kullan\u0131m\u0131 gibi konulara de\u011finilmektedir.', 'Mehmet Kaya'),\n('Yeni Nesil Veritaban\u0131 Teknolojileri', 'NoSQL, Graph Database ve NewSQL gibi yeni nesil veritaban\u0131 teknolojileri ve kullan\u0131m alanlar\u0131 hakk\u0131nda genel bir bak\u0131\u015f sunulmaktad\u0131r.', 'Ali Can'),\n('Tam Metin Arama Motorlar\u0131 Kar\u015f\u0131la\u015ft\u0131rmas\u0131', 'PostgreSQL FTS, Elasticsearch ve Solr gibi farkl\u0131 tam metin arama motorlar\u0131n\u0131n avantajlar\u0131 ve dezavantajlar\u0131 kar\u015f\u0131la\u015ft\u0131r\u0131lmaktad\u0131r.', 'Zeynep Y\u0131lmaz');<\/code><\/pre>\n<p>Art\u0131k <code>makaleler<\/code> tablomuzda \u00fczerinde arama yapabilece\u011fimiz metin verilerimiz var.<\/p>\n<h3>Temel Tam Metin Arama Uygulamalar\u0131<\/h3>\n<p>\u015eimdi, PostgreSQL&#8217;in FTS bile\u015fenlerini kullanarak basit aramalar yapmaya ba\u015flayal\u0131m.<\/p>\n<h4>Metni tsvector&#8217;a D\u00f6n\u00fc\u015ft\u00fcrme<\/h4>\n<p>Bir metin s\u00fctununu do\u011frudan aramak yerine, \u00f6nce onu <code>tsvector<\/code> format\u0131na d\u00f6n\u00fc\u015ft\u00fcrmemiz gerekir. Bu i\u015flem <code>to_tsvector()<\/code> fonksiyonu ile yap\u0131l\u0131r. Bu fonksiyon, ilk arg\u00fcman olarak kullan\u0131lacak metin arama yap\u0131land\u0131rmas\u0131n\u0131n ad\u0131n\u0131 (\u00f6rne\u011fin &#8216;english&#8217;, &#8216;turkish&#8217;) ve ikinci arg\u00fcman olarak da metin s\u00fctununu al\u0131r.<\/p>\n<p>\u00d6rnek: <code>makaleler<\/code> tablosundaki <code>icerik<\/code> s\u00fctununu <code>turkish<\/code> yap\u0131land\u0131rmas\u0131n\u0131 kullanarak <code>tsvector<\/code>&#8216;a d\u00f6n\u00fc\u015ft\u00fcrelim:<\/p>\n<pre><code class=\"language-sql\">SELECT to_tsvector('turkish', icerik) FROM makaleler WHERE id = 1;<\/code><\/pre>\n<p>\u00c7\u0131kt\u0131 \u015f\u00f6yle bir \u015feye benzeyecektir:<\/p>\n<pre><code class=\"language-\">'anlat':9 'ara':8 'bu':1 'elde':15 'ed':16 'etmek':14 'ideal':17 'kullan':10 'makale':2 'metin':6,12 'ozellik':11 'performans':13 'postgresql':5 'sonuc':15 'tam':7 'veritaban':4<\/code><\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, kelimeler k\u00f6klerine indirgenmi\u015f (&#8220;anlatmaktad\u0131r&#8221; -> &#8220;anlat&#8221;, &#8220;kullan\u0131laca\u011f\u0131n\u0131&#8221; -> &#8220;kullan&#8221;) ve durak kelimeler \u00e7\u0131kar\u0131lm\u0131\u015ft\u0131r (&#8220;Bu&#8221;).<\/p>\n<h4>tsquery Olu\u015fturma ve Arama Yapma<\/h4>\n<p>Arama yapmak i\u00e7in <code>to_tsquery()<\/code> fonksiyonunu kullanarak arama terimlerini <code>tsquery<\/code> format\u0131na d\u00f6n\u00fc\u015ft\u00fcrmeliyiz. Bu fonksiyon da <code>to_tsvector()<\/code> gibi bir yap\u0131land\u0131rma ad\u0131 ve arama terimlerini al\u0131r.<\/p>\n<p>\u00d6rnek: &#8220;PostgreSQL veritaban\u0131&#8221; kelimelerini arayal\u0131m.<\/p>\n<pre><code class=\"language-sql\">SELECT id, baslik FROM makaleler\nWHERE to_tsvector('turkish', icerik) @@ to_tsquery('turkish', 'PostgreSQL & veritaban\u0131');<\/code><\/pre>\n<p>Bu sorgu, hem &#8220;PostgreSQL&#8221; hem de &#8220;veritaban\u0131&#8221; kelimelerini i\u00e7eren makaleleri bulacakt\u0131r. <code>&<\/code> operat\u00f6r\u00fc &#8220;AND&#8221; anlam\u0131na gelir.<\/p>\n<p>E\u011fer &#8220;Ubuntu&#8221; veya &#8220;PostgreSQL&#8221; kelimelerinden birini aramak istersek:<\/p>\n<pre><code class=\"language-sql\">SELECT id, baslik FROM makaleler\nWHERE to_tsvector('turkish', icerik) @@ to_tsquery('turkish', 'Ubuntu | PostgreSQL');<\/code><\/pre>\n<h4>to_tsvector ve to_tsquery Fonksiyonlar\u0131<\/h4>\n<p>Bu iki fonksiyon, PostgreSQL FTS&#8217;nin temelini olu\u015fturur:<\/p>\n<p>*   <code>to_tsvector([config regconfig], text text)<\/code>: Belirtilen metni, belirtilen yap\u0131land\u0131rmay\u0131 kullanarak bir <code>tsvector<\/code>&#8216;a d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. <code>config<\/code> belirtilmezse, varsay\u0131lan <code>default_text_search_config<\/code> kullan\u0131l\u0131r.<br \/>\n*   <code>to_tsquery([config regconfig], text text)<\/code>: Belirtilen metin sorgusunu, belirtilen yap\u0131land\u0131rmay\u0131 kullanarak bir <code>tsquery<\/code>&#8216;ye d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. <code>config<\/code> belirtilmezse, varsay\u0131lan <code>default_text_search_config<\/code> kullan\u0131l\u0131r.<\/p>\n<p>Bu fonksiyonlar\u0131n do\u011fru yap\u0131land\u0131rmalarla kullan\u0131lmas\u0131, dilin morfolojik yap\u0131s\u0131na uygun arama yap\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Dile \u00d6zel Yap\u0131land\u0131rmalar ve T\u00fcrk\u00e7e Deste\u011fi<\/h3>\n<p>PostgreSQL&#8217;in FTS g\u00fcc\u00fcn\u00fcn \u00f6nemli bir k\u0131sm\u0131, dile \u00f6zel yap\u0131land\u0131rmalar\u0131 desteklemesinden gelir. Bu, her dilin kendine \u00f6zg\u00fc kurallar\u0131na (k\u00f6k bulma, durak kelimeler vb.) g\u00f6re metin analizinin yap\u0131labilmesi demektir.<\/p>\n<h4>Neden Dile \u00d6zel Yap\u0131land\u0131rmalar Kullanmal\u0131y\u0131z?<\/h4>\n<p>Farkl\u0131 dillerin farkl\u0131 morfolojik yap\u0131lar\u0131 vard\u0131r. \u0130ngilizce basit bir k\u00f6k bulma algoritmas\u0131na sahipken, T\u00fcrk\u00e7e gibi sondan eklemeli diller \u00e7ok daha karma\u015f\u0131k bir yap\u0131ya sahiptir. &#8220;Gelecek&#8221;, &#8220;gelecektir&#8221;, &#8220;gelecekteki&#8221; kelimelerinin hepsinin k\u00f6k\u00fc &#8220;gel&#8221; olabilir. E\u011fer do\u011fru dile \u00f6zel yap\u0131land\u0131rma kullan\u0131lmazsa, arama sonu\u00e7lar\u0131 alakas\u0131z veya eksik olabilir. \u00d6rne\u011fin, \u0130ngilizce yap\u0131land\u0131rmas\u0131yla T\u00fcrk\u00e7e bir metni aramak, \u00e7o\u011fu zaman hatal\u0131 sonu\u00e7lar verecektir \u00e7\u00fcnk\u00fc \u0130ngilizce k\u00f6k bulucular T\u00fcrk\u00e7e eklerini tan\u0131maz.<\/p>\n<h4>Mevcut Yap\u0131land\u0131rmalar\u0131 \u0130nceleme<\/h4>\n<p>PostgreSQL&#8217;de hangi metin arama yap\u0131land\u0131rmalar\u0131n\u0131n y\u00fckl\u00fc oldu\u011funu <code>\\dF<\/code> komutuyla g\u00f6rebilirsiniz:<\/p>\n<pre><code class=\"language-sql\">\\dF<\/code><\/pre>\n<p>Bu komut, sistemde tan\u0131ml\u0131 t\u00fcm metin arama yap\u0131land\u0131rmalar\u0131n\u0131 listeler. Genellikle <code>english<\/code>, <code>simple<\/code>, <code>french<\/code>, <code>german<\/code>, <code>turkish<\/code> gibi yap\u0131land\u0131rmalar bulunur.<\/p>\n<p>Mevcut varsay\u0131lan yap\u0131land\u0131rmay\u0131 \u00f6\u011frenmek i\u00e7in:<\/p>\n<pre><code class=\"language-sql\">SHOW default_text_search_config;<\/code><\/pre>\n<p>Bu de\u011feri de\u011fi\u015ftirmek i\u00e7in:<\/p>\n<pre><code class=\"language-sql\">SET default_text_search_config = 'turkish';\n-- veya kal\u0131c\u0131 olarak postgresql.conf dosyas\u0131nda ayarlayabilirsiniz.<\/code><\/pre>\n<h4>T\u00fcrk\u00e7e \u0130\u00e7in Yap\u0131land\u0131rma: &#8216;turkish&#8217;<\/h4>\n<p>PostgreSQL, T\u00fcrk\u00e7e i\u00e7in \u00f6zel bir metin arama yap\u0131land\u0131rmas\u0131 (<code>turkish<\/code>) sunar. Bu yap\u0131land\u0131rma, T\u00fcrk\u00e7e kelimeleri do\u011fru bir \u015fekilde k\u00f6klerine indirgemek (stemming) ve T\u00fcrk\u00e7e durak kelimeleri filtrelemek i\u00e7in tasarlanm\u0131\u015ft\u0131r.<\/p>\n<p><code>turkish<\/code> yap\u0131land\u0131rmas\u0131n\u0131 kullanarak bir metni <code>tsvector<\/code>&#8216;a d\u00f6n\u00fc\u015ft\u00fcrelim ve arama yapal\u0131m:<\/p>\n<pre><code class=\"language-sql\">-- T\u00fcrk\u00e7e metin \u00f6rne\u011fi\nSELECT to_tsvector('turkish', 'kitaplar\u0131m\u0131 okuyordum ve \u00e7ok ilgin\u00e7ti') AS turkce_tsvector;\n\n-- \u00c7\u0131kt\u0131: 'ilgin\u00e7':6 'kitap':1 'oku':2\n\n-- T\u00fcrk\u00e7e arama sorgusu \u00f6rne\u011fi\nSELECT to_tsquery('turkish', 'kitap & ilgin\u00e7') AS turkce_tsquery;\n\n-- \u00c7\u0131kt\u0131: 'kitap' & 'ilgin\u00e7'<\/code><\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, &#8220;kitaplar\u0131m\u0131&#8221; kelimesi &#8220;kitap&#8221; k\u00f6k\u00fcne indirgenmi\u015f, &#8220;okuyordum&#8221; kelimesi &#8220;oku&#8221; k\u00f6k\u00fcne indirgenmi\u015f ve &#8220;ve&#8221;, &#8220;\u00e7ok&#8221; gibi durak kelimeler \u00e7\u0131kar\u0131lm\u0131\u015ft\u0131r.<\/p>\n<h4>\u00d6zel S\u00f6zl\u00fckler ve K\u00f6k Bulma (Stemming)<\/h4>\n<p>PostgreSQL&#8217;in <code>turkish<\/code> yap\u0131land\u0131rmas\u0131 genellikle <code>ispell<\/code> veya <code>snowball<\/code> tabanl\u0131 bir s\u00f6zl\u00fck kullan\u0131r. <code>ispell<\/code> s\u00f6zl\u00fckleri, daha geli\u015fmi\u015f k\u00f6k bulma ve e\u015fanlaml\u0131 deste\u011fi sunabilir. T\u00fcrk\u00e7e i\u00e7in <code>ispell<\/code> s\u00f6zl\u00fc\u011f\u00fc kullanmak, daha do\u011fru k\u00f6k bulma sonu\u00e7lar\u0131 elde etmenizi sa\u011flar.<\/p>\n<p>Ubuntu 16.04&#8217;te <code>ispell<\/code> s\u00f6zl\u00fcklerini kurmak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">sudo apt install ispell-tr<\/code><\/pre>\n<p>Bu paket, T\u00fcrk\u00e7e <code>ispell<\/code> s\u00f6zl\u00fck dosyalar\u0131n\u0131 sisteme kurar. PostgreSQL, bu dosyalar\u0131 otomatik olarak bulup kullanabilir veya \u00f6zel bir yap\u0131land\u0131rma olu\u015fturarak bunlar\u0131 belirtebilirsiniz.<\/p>\n<p>PostgreSQL&#8217;de \u00f6zel bir metin arama yap\u0131land\u0131rmas\u0131 olu\u015fturmak, var olan yap\u0131land\u0131rmalar\u0131 kopyalamak ve s\u00f6zl\u00fckleri, durak kelimeleri veya ayr\u0131\u015ft\u0131r\u0131c\u0131lar\u0131 de\u011fi\u015ftirmek anlam\u0131na gelir. Bu, \u00f6zellikle i\u015f alan\u0131na \u00f6zg\u00fc terimler veya \u00f6zel durak kelimeleriniz oldu\u011funda faydal\u0131d\u0131r. Ancak \u00e7o\u011fu durumda, <code>turkish<\/code> yap\u0131land\u0131rmas\u0131 yeterli olacakt\u0131r.<\/p>\n<h3>Performans \u0130\u00e7in \u0130ndeksleme: GIN ve GiST<\/h3>\n<p>Tam metin araman\u0131n as\u0131l g\u00fcc\u00fc, indeksleme ile ortaya \u00e7\u0131kar. <code>to_tsvector()<\/code> ve <code>to_tsquery()<\/code> fonksiyonlar\u0131 ile arama yapabilirsiniz, ancak bu, her sorguda t\u00fcm metni taramak ve d\u00f6n\u00fc\u015ft\u00fcrmek anlam\u0131na gelir ki bu da \u00e7ok b\u00fcy\u00fck veri setlerinde kabul edilemez derecede yava\u015f olacakt\u0131r. Bu nedenle, <code>tsvector<\/code> s\u00fctunlar\u0131 \u00fczerinde \u00f6zel indeksler olu\u015fturmak zorunludur.<\/p>\n<h4>\u0130ndekslemenin \u00d6nemi<\/h4>\n<p>\u0130ndeksler, veritaban\u0131n\u0131n belirli bir s\u00fctundaki verileri daha h\u0131zl\u0131 bulmas\u0131n\u0131 sa\u011flayan veri yap\u0131lar\u0131d\u0131r. Tam metin arama i\u00e7in, PostgreSQL iki ana indeks t\u00fcr\u00fcn\u00fc destekler:<\/p>\n<p>1.  <strong>GIN (Generalized Inverted Index):<\/strong> Tam metin arama i\u00e7in en yayg\u0131n ve genellikle en iyi performans\u0131 sunan indeks t\u00fcr\u00fcd\u00fcr. Tersine indeks (inverted index) prensibine dayan\u0131r; yani her kelime k\u00f6k\u00fc i\u00e7in, o kelimeyi i\u00e7eren belgelerin bir listesini tutar. Bu, belirli bir kelimeyi i\u00e7eren belgeleri h\u0131zla bulmay\u0131 sa\u011flar.<br \/>\n2.  <strong>GiST (Generalized Search Tree):<\/strong> GiST indeksleri de kullan\u0131labilir, ancak GIN indeksleri tam metin arama i\u00e7in genellikle daha h\u0131zl\u0131d\u0131r ve daha az depolama alan\u0131 kullan\u0131r. GiST, \u00f6zellikle arama terimlerinin belge i\u00e7indeki konumlar\u0131na dayal\u0131 karma\u015f\u0131k aramalar (\u00f6rne\u011fin c\u00fcmle aramalar\u0131) i\u00e7in bazen tercih edilebilir. Ancak genel ama\u00e7l\u0131 FTS i\u00e7in GIN daha yayg\u0131nd\u0131r.<\/p>\n<p>Bizim \u00f6rne\u011fimizde, GIN indeksini kullanaca\u011f\u0131z.<\/p>\n<p><code>makaleler<\/code> tablosuna bir <code>tsvector<\/code> s\u00fctunu ekleyelim ve bu s\u00fctun \u00fczerinde bir GIN indeksi olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-sql\">ALTER TABLE makaleler ADD COLUMN tsv TSVECTOR;<\/code><\/pre>\n<p>\u015eimdi bu <code>tsv<\/code> s\u00fctununu mevcut verilerimizle doldural\u0131m:<\/p>\n<pre><code class=\"language-sql\">UPDATE makaleler SET tsv = to_tsvector('turkish', baslik || ' ' || icerik);<\/code><\/pre>\n<p>Burada <code>baslik<\/code> ve <code>icerik<\/code> s\u00fctunlar\u0131n\u0131 birle\u015ftirerek tek bir <code>tsvector<\/code> olu\u015fturduk. <code>|| ' ' ||<\/code> ile aralar\u0131na bir bo\u015fluk koymak, kelimelerin birbirine yap\u0131\u015fmas\u0131n\u0131 engeller.<\/p>\n<p>\u015eimdi <code>tsv<\/code> s\u00fctunu \u00fczerinde GIN indeksini olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-sql\">CREATE INDEX tsv_gin ON makaleler USING GIN (tsv);<\/code><\/pre>\n<p>Bu indeks, <code>makaleler<\/code> tablosundaki <code>tsv<\/code> s\u00fctunundaki t\u00fcm <code>tsvector<\/code> verilerini indeksleyecektir. Art\u0131k aramalar\u0131m\u0131z bu indeks \u00fczerinden \u00e7ok daha h\u0131zl\u0131 yap\u0131lacakt\u0131r.<\/p>\n<h4>tsvector S\u00fctununu Otomatik G\u00fcncelleme: Trigger Kullan\u0131m\u0131<\/h4>\n<p><code>tsv<\/code> s\u00fctununu manuel olarak g\u00fcncellemek pratik de\u011fildir. <code>makaleler<\/code> tablosuna yeni bir kay\u0131t eklendi\u011finde veya mevcut bir kay\u0131t g\u00fcncellendi\u011finde <code>tsv<\/code> s\u00fctununun otomatik olarak g\u00fcncellenmesini sa\u011flamal\u0131y\u0131z. PostgreSQL 12 ve \u00fczeri s\u00fcr\u00fcmlerde &#8220;Generated Columns&#8221; bu i\u015fi daha zarif bir \u015fekilde yaparken, Ubuntu 16.04&#8217;teki PostgreSQL s\u00fcr\u00fcmleri (9.5\/9.6) i\u00e7in trigger (tetikleyici) kullanmak en uygun y\u00f6ntemdir.<\/p>\n<p>Bir trigger fonksiyonu olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-sql\">CREATE OR REPLACE FUNCTION update_makaleler_tsv() RETURNS TRIGGER AS $$\nBEGIN\n    NEW.tsv := to_tsvector('turkish', NEW.baslik || ' ' || NEW.icerik);\n    RETURN NEW;\nEND;\n$$ LANGUAGE plpgsql;<\/code><\/pre>\n<p>Bu fonksiyon, <code>NEW<\/code> (yeni eklenecek veya g\u00fcncellenecek sat\u0131r) \u00fczerindeki <code>baslik<\/code> ve <code>icerik<\/code> s\u00fctunlar\u0131n\u0131 kullanarak <code>tsv<\/code> s\u00fctununu doldurur.<\/p>\n<p>\u015eimdi bu fonksiyonu <code>makaleler<\/code> tablosuna bir trigger olarak ba\u011flayal\u0131m:<\/p>\n<pre><code class=\"language-sql\">CREATE TRIGGER tsv_update_trigger\nBEFORE INSERT OR UPDATE ON makaleler\nFOR EACH ROW EXECUTE PROCEDURE update_makaleler_tsv();<\/code><\/pre>\n<p>Bu trigger, her <code>INSERT<\/code> veya <code>UPDATE<\/code> i\u015fleminden \u00f6nce <code>update_makaleler_tsv<\/code> fonksiyonunu \u00e7al\u0131\u015ft\u0131racak ve <code>tsv<\/code> s\u00fctununu otomatik olarak g\u00fcncelleyecektir.<\/p>\n<p>Art\u0131k aramalar\u0131m\u0131z\u0131 <code>tsv<\/code> s\u00fctunu \u00fczerinden yapabiliriz:<\/p>\n<pre><code class=\"language-sql\">SELECT id, baslik FROM makaleler\nWHERE tsv @@ to_tsquery('turkish', 'PostgreSQL & veritaban\u0131');<\/code><\/pre>\n<p>Bu sorgu, GIN indeksini kullanarak \u00e7ok daha h\u0131zl\u0131 \u00e7al\u0131\u015facakt\u0131r.<\/p>\n<h3>Geli\u015fmi\u015f Tam Metin Arama \u00d6zellikleri<\/h3>\n<p>PostgreSQL FTS, sadece temel e\u015fle\u015fmelerin \u00f6tesinde, arama deneyimini zenginle\u015ftiren bir\u00e7ok geli\u015fmi\u015f \u00f6zellik sunar.<\/p>\n<h4>Arama Sonu\u00e7lar\u0131n\u0131 S\u0131ralama (Ranking): ts_rank ve ts_rank_cd<\/h4>\n<p>Arama sonu\u00e7lar\u0131n\u0131n alaka d\u00fczeyine g\u00f6re s\u0131ralanmas\u0131, kullan\u0131c\u0131 deneyimi i\u00e7in kritik \u00f6neme sahiptir. PostgreSQL, <code>ts_rank()<\/code> ve <code>ts_rank_cd()<\/code> fonksiyonlar\u0131 ile bu s\u0131ralamay\u0131 sa\u011flar. Bu fonksiyonlar, bir <code>tsvector<\/code> ile bir <code>tsquery<\/code> aras\u0131ndaki e\u015fle\u015fmenin ne kadar g\u00fc\u00e7l\u00fc oldu\u011funu g\u00f6steren bir say\u0131sal skor (rank) d\u00f6nd\u00fcr\u00fcr.<\/p>\n<p>Rank skoru, arama terimlerinin belgede ka\u00e7 kez ge\u00e7ti\u011fi, ne kadar seyrek oldu\u011fu, belge i\u00e7indeki konumlar\u0131 (\u00f6rne\u011fin ba\u015fl\u0131kta m\u0131, i\u00e7erikte mi) gibi fakt\u00f6rlere dayan\u0131r.<\/p>\n<p>*   <code>ts_rank(weights float4[], vector tsvector, query tsquery [, normalization integer])<\/code>: A\u011f\u0131rl\u0131klar (weights) ile belirli alanlara \u00f6ncelik verebilirsiniz.<br \/>\n*   <code>ts_rank_cd(vector tsvector, query tsquery [, normalization integer])<\/code>: &#8220;Cover Density&#8221; algoritmas\u0131n\u0131 kullanan bir di\u011fer s\u0131ralama fonksiyonudur. Genellikle <code>ts_rank<\/code>&#8216;ten daha iyi sonu\u00e7lar verdi\u011fi d\u00fc\u015f\u00fcn\u00fcl\u00fcr.<\/p>\n<p><strong>A\u011f\u0131rl\u0131kland\u0131rma ve S\u0131ralama Algoritmalar\u0131:<\/strong><br \/>\n<code>ts_rank<\/code> fonksiyonunda <code>weights<\/code> parametresi, farkl\u0131 alanlara (\u00f6rne\u011fin ba\u015fl\u0131k, anahtar kelimeler, i\u00e7erik) farkl\u0131 a\u011f\u0131rl\u0131klar vermenizi sa\u011flar. PostgreSQL, <code>tsvector<\/code> i\u00e7inde kelimelerin konumlar\u0131n\u0131 saklayabilir ve bu konumlar\u0131 <code>A<\/code>, <code>B<\/code>, <code>C<\/code>, <code>D<\/code> etiketleriyle i\u015faretleyebilir. <code>A<\/code> en y\u00fcksek a\u011f\u0131rl\u0131k, <code>D<\/code> en d\u00fc\u015f\u00fck a\u011f\u0131rl\u0131kt\u0131r.<\/p>\n<p>\u00d6rne\u011fin, <code>baslik<\/code> s\u00fctununa daha y\u00fcksek a\u011f\u0131rl\u0131k vermek i\u00e7in <code>tsvector<\/code> olu\u015ftururken bu etiketleri kullanabiliriz:<\/p>\n<pre><code class=\"language-sql\">-- Trigger fonksiyonunu g\u00fcncelleyelim\nCREATE OR REPLACE FUNCTION update_makaleler_tsv() RETURNS TRIGGER AS $$\nBEGIN\n    NEW.tsv :=\n        setweight(to_tsvector('turkish', NEW.baslik), 'A') ||\n        setweight(to_tsvector('turkish', NEW.yazar), 'B') || -- Yazar ismine de a\u011f\u0131rl\u0131k verelim\n        setweight(to_tsvector('turkish', NEW.icerik), 'C');\n    RETURN NEW;\nEND;\n$$ LANGUAGE plpgsql;\n\n-- Mevcut verileri g\u00fcncelleyelim\nUPDATE makaleler SET tsv = update_makaleler_tsv(); -- Trigger manuel \u00e7al\u0131\u015ft\u0131r\u0131lmaz, update ile tetiklenir\n-- veya basit\u00e7e:\nUPDATE makaleler SET baslik = baslik; -- t\u00fcm sat\u0131rlar\u0131 tetiklemek i\u00e7in basit bir update\n\n-- \u015eimdi s\u0131ral\u0131 arama yapal\u0131m:\nSELECT\n    id,\n    baslik,\n    ts_rank_cd(tsv, to_tsquery('turkish', 'PostgreSQL & veritaban\u0131')) AS rank_score\nFROM makaleler\nWHERE tsv @@ to_tsquery('turkish', 'PostgreSQL & veritaban\u0131')\nORDER BY rank_score DESC;<\/code><\/pre>\n<p>Bu sorgu, arama terimlerini i\u00e7eren makaleleri, alaka d\u00fczeyine g\u00f6re en y\u00fcksek skordan ba\u015flayarak s\u0131ralayacakt\u0131r.<\/p>\n<h4>Vurgulama ve \u00d6zet Olu\u015fturma: ts_headline<\/h4>\n<p>Kullan\u0131c\u0131lar, arama terimlerinin metin i\u00e7inde nerede ge\u00e7ti\u011fini g\u00f6rmek isterler. <code>ts_headline()<\/code> fonksiyonu, arama terimlerinin ge\u00e7ti\u011fi ilgili k\u0131s\u0131mlar\u0131 (snippet) \u00e7\u0131kar\u0131r ve bu terimleri vurgulayarak g\u00f6sterir.<\/p>\n<pre><code class=\"language-sql\">ts_headline([config regconfig], document text, query tsquery [, options text])<\/code><\/pre>\n<p>\u00d6rnek:<\/p>\n<pre><code class=\"language-sql\">SELECT\n    id,\n    baslik,\n    ts_headline('turkish', icerik, to_tsquery('turkish', 'PostgreSQL & veritaban\u0131'),\n                'StartSel=<b>, StopSel=<\/b>, MaxFragments=3, FragmentDelimiter=..., MaxWords=10, MinWords=5') AS snippet\nFROM makaleler\nWHERE tsv @@ to_tsquery('turkish', 'PostgreSQL & veritaban\u0131')\nORDER BY ts_rank_cd(tsv, to_tsquery('turkish', 'PostgreSQL & veritaban\u0131')) DESC;<\/code><\/pre>\n<p>Bu sorgu, &#8220;PostgreSQL&#8221; ve &#8220;veritaban\u0131&#8221; kelimelerini i\u00e7eren makalelerden ilgili k\u0131s\u0131mlar\u0131 <code><b><\/code> etiketleri aras\u0131na alarak vurgulayacak ve bir \u00f6zet sunacakt\u0131r. <code>options<\/code> parametresiyle vurgulama bi\u00e7imini ve \u00f6zetin uzunlu\u011funu ayarlayabilirsiniz.<\/p>\n<h4>C\u00fcmle Arama (Phrase Search)<\/h4>\n<p>Bazen belirli bir kelime grubunun belirli bir s\u0131rada ve yak\u0131nl\u0131kta bulunmas\u0131 istenir (\u00f6rne\u011fin &#8220;tam metin arama&#8221;). Bu t\u00fcr aramalar i\u00e7in <code><-><\/code> operat\u00f6r\u00fc kullan\u0131l\u0131r. Bu operat\u00f6r, iki terimin art arda gelmesini gerektirir. <code>N <-> M<\/code> ise N kelimenin M kelime ile aras\u0131nda bir bo\u015fluk olmas\u0131n\u0131 ifade eder.<\/p>\n<pre><code class=\"language-sql\">-- \"tam metin\" ifadesini ara\nSELECT id, baslik FROM makaleler\nWHERE tsv @@ to_tsquery('turkish', 'tam <-> metin');\n\n-- \"veritaban\u0131 performans\" ifadesini ara\nSELECT id, baslik FROM makaleler\nWHERE tsv @@ to_tsquery('turkish', 'veritaban\u0131 <-> performans');<\/code><\/pre>\n<h4>\u00d6nek E\u015fle\u015ftirme (Prefix Matching)<\/h4>\n<p>Kullan\u0131c\u0131lar genellikle bir kelimenin sadece ba\u015flang\u0131c\u0131n\u0131 yazarak arama yapmak isterler (\u00f6rne\u011fin &#8220;prog&#8221; yazarak &#8220;programlama&#8221;, &#8220;programc\u0131&#8221; gibi kelimeleri bulmak). <code>tsquery<\/code> i\u00e7inde <code>:*<\/code> operat\u00f6r\u00fc ile \u00f6nek e\u015fle\u015ftirme yapabilirsiniz.<\/p>\n<pre><code class=\"language-sql\">-- \"veritaban\u0131\" kelimesinin k\u00f6k\u00fcnden t\u00fcreyen ve \"opt\" ile ba\u015flayan kelimeleri ara (optimizasyon, optimize vb.)\nSELECT id, baslik FROM makaleler\nWHERE tsv @@ to_tsquery('turkish', 'veritaban\u0131 & opt:*');<\/code><\/pre>\n<h4>E\u015fanlaml\u0131lar ve \u00d6zel S\u00f6zl\u00fckler<\/h4>\n<p>PostgreSQL FTS, e\u015fanlaml\u0131lar (synonyms) ve \u00f6zel s\u00f6zl\u00fckler kullanarak arama sonu\u00e7lar\u0131n\u0131n alaka d\u00fczeyini daha da art\u0131rman\u0131za olanak tan\u0131r.<\/p>\n<p>*   <strong><code>synonym<\/code> S\u00f6zl\u00fc\u011f\u00fc:<\/strong> Belirli kelimeler veya kelime gruplar\u0131 i\u00e7in e\u015fanlaml\u0131lar tan\u0131mlaman\u0131z\u0131 sa\u011flar. \u00d6rne\u011fin, &#8220;otomobil&#8221; arand\u0131\u011f\u0131nda &#8220;araba&#8221; i\u00e7eren belgelerin de bulunmas\u0131n\u0131 sa\u011flayabilirsiniz.<br \/>\n    Bir <code>synonym<\/code> s\u00f6zl\u00fc\u011f\u00fc olu\u015fturmak i\u00e7in \u00f6nce bir s\u00f6zl\u00fck dosyas\u0131 haz\u0131rlaman\u0131z gerekir (\u00f6rne\u011fin <code>my_synonyms.txt<\/code>):<\/p>\n<pre><code class=\"language-\">araba otomobil\n    pc bilgisayar<\/code><\/pre>\n<p>    Daha sonra PostgreSQL i\u00e7inde bu s\u00f6zl\u00fc\u011f\u00fc tan\u0131mlars\u0131n\u0131z:<\/p>\n<pre><code class=\"language-sql\">CREATE TEXT SEARCH DICTIONARY my_synonym_dict (\n        TEMPLATE = synonym,\n        SYNONYMS = '\/path\/to\/my_synonyms.txt' -- Dosya yolu\n    );<\/code><\/pre>\n<p>    Ve ard\u0131ndan bu s\u00f6zl\u00fc\u011f\u00fc bir yap\u0131land\u0131rmaya eklersiniz.<\/p>\n<p>*   <strong><code>ispell<\/code> S\u00f6zl\u00fc\u011f\u00fc:<\/strong> Daha geli\u015fmi\u015f k\u00f6k bulma ve e\u015fanlaml\u0131 deste\u011fi sunar. \u00d6zellikle T\u00fcrk\u00e7e gibi diller i\u00e7in <code>snowball<\/code>&#8216;dan daha iyi sonu\u00e7lar verebilir. <code>ispell-tr<\/code> paketi ile kurulan T\u00fcrk\u00e7e <code>ispell<\/code> s\u00f6zl\u00fckleri, PostgreSQL yap\u0131land\u0131rmalar\u0131nda kullan\u0131labilir.<\/p>\n<p>Bu geli\u015fmi\u015f \u00f6zellikler, arama motorunuzu kullan\u0131c\u0131lar\u0131n beklentilerine daha uygun hale getirmenizi sa\u011flar.<\/p>\n<h3>U\u00e7tan Uca Bir \u00d6rnek Uygulama<\/h3>\n<p>\u015eimdiye kadar \u00f6\u011frendiklerimizi bir araya getirerek daha kapsaml\u0131 bir \u00f6rnek olu\u015ftural\u0131m.<\/p>\n<h4>\u00d6rnek Tablo Yap\u0131s\u0131 ve Veri Ekleme<\/h4>\n<p>Yukar\u0131da olu\u015fturdu\u011fumuz <code>makaleler<\/code> tablosunu ve verileri kullanmaya devam edelim.<\/p>\n<h4>tsvector S\u00fctunu ve Trigger Olu\u015fturma<\/h4>\n<p>Daha \u00f6nce olu\u015fturdu\u011fumuz <code>tsv<\/code> s\u00fctununu ve <code>tsv_update_trigger<\/code>&#8216;\u0131 kulland\u0131\u011f\u0131m\u0131z\u0131 varsay\u0131yoruz. E\u011fer hen\u00fcz yapmad\u0131ysan\u0131z, yukar\u0131daki &#8220;tsvector S\u00fctununu Otomatik G\u00fcncelleme: Trigger Kullan\u0131m\u0131&#8221; b\u00f6l\u00fcm\u00fcndeki ad\u0131mlar\u0131 uygulay\u0131n. \u00d6zellikle <code>setweight<\/code> kullanarak <code>baslik<\/code> ve <code>yazar<\/code> s\u00fctunlar\u0131na daha y\u00fcksek a\u011f\u0131rl\u0131k verdi\u011fimiz trigger fonksiyonunu kullanmak \u00f6nemlidir.<\/p>\n<pre><code class=\"language-sql\">-- Trigger fonksiyonunu tekrar olu\u015ftural\u0131m veya g\u00fcncelleyelim\nCREATE OR REPLACE FUNCTION update_makaleler_tsv() RETURNS TRIGGER AS $$\nBEGIN\n    NEW.tsv :=\n        setweight(to_tsvector('turkish', NEW.baslik), 'A') ||\n        setweight(to_tsvector('turkish', NEW.yazar), 'B') ||\n        setweight(to_tsvector('turkish', NEW.icerik), 'C');\n    RETURN NEW;\nEND;\n$$ LANGUAGE plpgsql;\n\n-- Trigger'\u0131 olu\u015ftural\u0131m (e\u011fer yoksa)\nCREATE TRIGGER tsv_update_trigger\nBEFORE INSERT OR UPDATE ON makaleler\nFOR EACH ROW EXECUTE PROCEDURE update_makaleler_tsv();\n\n-- Mevcut verileri trigger ile g\u00fcncelleyelim (herhangi bir s\u00fctunu update ederek trigger'\u0131 tetikleyebiliriz)\nUPDATE makaleler SET baslik = baslik;<\/code><\/pre>\n<h4>GIN \u0130ndeksi Ekleme<\/h4>\n<p><code>tsv<\/code> s\u00fctunu \u00fczerinde GIN indeksini zaten olu\u015fturmu\u015ftuk:<\/p>\n<pre><code class=\"language-sql\">CREATE INDEX IF NOT EXISTS tsv_gin ON makaleler USING GIN (tsv);<\/code><\/pre>\n<p><code>IF NOT EXISTS<\/code> ile indeksin zaten var olup olmad\u0131\u011f\u0131n\u0131 kontrol ederek hata almay\u0131 \u00f6nleriz.<\/p>\n<h4>S\u0131ral\u0131 ve Vurgulu Arama Sorgular\u0131<\/h4>\n<p>\u015eimdi, kullan\u0131c\u0131lar\u0131n en alakal\u0131 sonu\u00e7lar\u0131 g\u00f6rmelerini sa\u011flayan ve arama terimlerini vurgulayan bir sorgu olu\u015ftural\u0131m. &#8220;PostgreSQL performans&#8221; kelime grubunu arayal\u0131m.<\/p>\n<pre><code class=\"language-sql\">SELECT\n    id,\n    baslik,\n    ts_rank_cd(tsv, to_tsquery('turkish', 'PostgreSQL & performans')) AS rank_score,\n    ts_headline('turkish', icerik, to_tsquery('turkish', 'PostgreSQL & performans'),\n                'StartSel=<b>, StopSel=<\/b>, MaxFragments=3, FragmentDelimiter=..., MaxWords=15, MinWords=5') AS snippet\nFROM makaleler\nWHERE tsv @@ to_tsquery('turkish', 'PostgreSQL & performans')\nORDER BY rank_score DESC;<\/code><\/pre>\n<p>Bu sorgu:<br \/>\n1.  <code>to_tsquery('turkish', 'PostgreSQL & performans')<\/code> ile arama sorgusunu olu\u015fturur.<br \/>\n2.  <code>tsv @@ ...<\/code> ile <code>tsv<\/code> s\u00fctununda e\u015fle\u015fen belgeleri bulur (GIN indeksi sayesinde h\u0131zl\u0131).<br \/>\n3.  <code>ts_rank_cd()<\/code> ile her belgenin alaka skorunu hesaplar.<br \/>\n4.  <code>ORDER BY rank_score DESC<\/code> ile en alakal\u0131dan en az alakal\u0131ya do\u011fru s\u0131ralar.<br \/>\n5.  <code>ts_headline()<\/code> ile arama terimlerinin ge\u00e7ti\u011fi yerleri vurgulayarak bir \u00f6zet (snippet) olu\u015fturur.<\/p>\n<p>Bu \u00f6rnek, PostgreSQL&#8217;in Tam Metin Arama yeteneklerini birle\u015ftirerek ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l kullan\u0131labilece\u011fini g\u00f6stermektedir.<\/p>\n<h3>Dikkat Edilmesi Gerekenler ve En \u0130yi Uygulamalar<\/h3>\n<p>PostgreSQL FTS g\u00fc\u00e7l\u00fc bir ara\u00e7 olsa da, en iyi performans\u0131 ve do\u011fru sonu\u00e7lar\u0131 elde etmek i\u00e7in baz\u0131 \u00f6nemli noktalar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmak gerekir.<\/p>\n<h4>Performans Ayarlar\u0131 ve Optimizasyon<\/h4>\n<p>*   <strong>GIN \u0130ndeksi Bak\u0131m\u0131:<\/strong> GIN indeksleri, <code>UPDATE<\/code> ve <code>DELETE<\/code> i\u015flemleri sonras\u0131nda \u015fi\u015febilir (bloat). D\u00fczenli <code>VACUUM FULL<\/code> veya <code>REINDEX<\/code> i\u015flemleri gerekebilir, ancak bunlar tablo kilitlenmelerine neden olabilir. PostgreSQL&#8217;in otomatik <code>VACUUM<\/code> ayarlar\u0131n\u0131 do\u011fru yapmak \u00f6nemlidir.<br \/>\n*   <strong><code>work_mem<\/code> Ayar\u0131:<\/strong> Karma\u015f\u0131k sorgular ve b\u00fcy\u00fck veri setleri i\u00e7in <code>work_mem<\/code> ayar\u0131n\u0131 art\u0131rmak, indeks olu\u015fturma ve baz\u0131 arama i\u015flemleri s\u0131ras\u0131nda performans\u0131 art\u0131rabilir.<br \/>\n*   <strong><code>shared_buffers<\/code> Ayar\u0131:<\/strong> Veritaban\u0131n\u0131n genel performans\u0131 i\u00e7in <code>shared_buffers<\/code> ayar\u0131n\u0131n do\u011fru yap\u0131lmas\u0131 kritik \u00f6neme sahiptir.<br \/>\n*   <strong><code>default_text_search_config<\/code>:<\/strong> Oturum veya veritaban\u0131 genelinde varsay\u0131lan yap\u0131land\u0131rmay\u0131 do\u011fru dile ayarlamak, her <code>to_tsvector<\/code> ve <code>to_tsquery<\/code> \u00e7a\u011fr\u0131s\u0131nda yap\u0131land\u0131rma belirtme ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r ve kod okunabilirli\u011fini art\u0131r\u0131r.<br \/>\n*   <strong>Trigger vs. Generated Columns (PostgreSQL 12+):<\/strong> Ubuntu 16.04&#8217;teki PostgreSQL s\u00fcr\u00fcmlerinde trigger kullanmak zorunlu olsa da, daha yeni s\u00fcr\u00fcmlerde <code>GENERATED<\/code> s\u00fctunlar, <code>tsvector<\/code> s\u00fctununu otomatik g\u00fcncellemenin daha temiz ve verimli bir yoludur. M\u00fcmk\u00fcnse daha yeni bir PostgreSQL s\u00fcr\u00fcm\u00fcne ge\u00e7i\u015f d\u00fc\u015f\u00fcn\u00fclmelidir.<\/p>\n<h4>Do\u011fru Yap\u0131land\u0131rma Se\u00e7imi<\/h4>\n<p>Kullan\u0131lan dil i\u00e7in en uygun metin arama yap\u0131land\u0131rmas\u0131n\u0131 se\u00e7mek \u00e7ok \u00f6nemlidir. T\u00fcrk\u00e7e metinler i\u00e7in <code>turkish<\/code> yap\u0131land\u0131rmas\u0131 kullan\u0131lmal\u0131d\u0131r. E\u011fer i\u015f alan\u0131na \u00f6zg\u00fc terimler veya \u00f6zel e\u015fanlaml\u0131lar varsa, \u00f6zel s\u00f6zl\u00fckler ve yap\u0131land\u0131rmalar olu\u015fturmak gerekebilir.<\/p>\n<h4>Kaynak T\u00fcketimi ve \u00d6l\u00e7eklenebilirlik<\/h4>\n<p>*   <strong>Depolama Alan\u0131:<\/strong> <code>tsvector<\/code> s\u00fctunlar\u0131 ve GIN indeksleri, orijinal metin verilerinden \u00f6nemli \u00f6l\u00e7\u00fcde daha fazla depolama alan\u0131 kaplayabilir. \u00d6zellikle \u00e7ok b\u00fcy\u00fck metin verileriyle \u00e7al\u0131\u015f\u0131rken bu durum g\u00f6z \u00f6n\u00fcnde bulundurulmal\u0131d\u0131r.<br \/>\n*   <strong>Bellek Kullan\u0131m\u0131:<\/strong> GIN indeksleri, arama s\u0131ras\u0131nda bellek yo\u011fun olabilir. B\u00fcy\u00fck sorgular veya \u00e7ok say\u0131da e\u015fzamanl\u0131 sorgu, sistem belle\u011fini zorlayabilir.<br \/>\n*   <strong>\u0130\u015flemci Y\u00fck\u00fc:<\/strong> <code>to_tsvector<\/code> d\u00f6n\u00fc\u015f\u00fcm i\u015flemi ve indeksleme, \u00f6zellikle <code>INSERT<\/code> ve <code>UPDATE<\/code> i\u015flemleri s\u0131ras\u0131nda CPU yo\u011fun olabilir. Trigger kullan\u0131l\u0131yorsa, her yazma i\u015fleminde bu maliyet olu\u015facakt\u0131r.<\/p>\n<h4>Harici Arama Motorlar\u0131 ile Kar\u015f\u0131la\u015ft\u0131rma<\/h4>\n<p>PostgreSQL FTS, bir\u00e7ok uygulama i\u00e7in m\u00fckemmel bir \u00e7\u00f6z\u00fcmd\u00fcr. Ancak \u00e7ok b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalar (terabaytlarca metin verisi, saniyede binlerce arama sorgusu) veya \u00e7ok karma\u015f\u0131k, \u00e7ok dilli arama gereksinimleri i\u00e7in Elasticsearch veya Apache Solr gibi harici arama motorlar\u0131 daha uygun olabilir. Bu sistemler, da\u011f\u0131t\u0131k mimarileri, geli\u015fmi\u015f analiz yetenekleri ve daha zengin API&#8217;leri ile bu t\u00fcr senaryolarda \u00f6ne \u00e7\u0131karlar.<\/p>\n<p>PostgreSQL FTS&#8217;nin avantajlar\u0131:<br \/>\n*   Veritaban\u0131 i\u00e7inde entegre olmas\u0131, ayr\u0131 bir sistem kurma ve y\u00f6netme ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r.<br \/>\n*   \u0130\u015flem b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc (ACID) korur.<br \/>\n*   Daha k\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli projeler i\u00e7in kurulumu ve kullan\u0131m\u0131 kolayd\u0131r.<\/p>\n<p>Nihayetinde, do\u011fru arama \u00e7\u00f6z\u00fcm\u00fcn\u00fc se\u00e7mek, projenin \u00f6l\u00e7e\u011fine, b\u00fct\u00e7esine, geli\u015ftirici becerilerine ve spesifik arama gereksinimlerine ba\u011fl\u0131d\u0131r.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>PostgreSQL&#8217;in Tam Metin Arama (Full-Text Search) yetenekleri, metin tabanl\u0131 veriler i\u00e7inde h\u0131zl\u0131, alakal\u0131 ve dilbilgisel olarak do\u011fru aramalar yapma konusunda g\u00fc\u00e7l\u00fc ve esnek bir \u00e7\u00f6z\u00fcm sunar. Ubuntu 16.04 gibi bir Linux ortam\u0131nda PostgreSQL&#8217;i kurup yap\u0131land\u0131rarak, <code>tsvector<\/code> ve <code>tsquery<\/code> veri tipleri, <code>to_tsvector()<\/code>, <code>to_tsquery()<\/code>, <code>ts_rank()<\/code>, <code>ts_headline()<\/code> fonksiyonlar\u0131 ve GIN indeksleri gibi temel bile\u015fenleri kullanarak etkili bir arama motoru olu\u015fturabilirsiniz.<\/p>\n<p>Dile \u00f6zel yap\u0131land\u0131rmalar, \u00f6zellikle T\u00fcrk\u00e7e gibi morfolojik a\u00e7\u0131dan zengin diller i\u00e7in, arama sonu\u00e7lar\u0131n\u0131n kalitesini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Trigger&#8217;lar arac\u0131l\u0131\u011f\u0131yla <code>tsvector<\/code> s\u00fctunlar\u0131n\u0131n otomatik olarak g\u00fcncellenmesi ve GIN indekslerinin kullan\u0131lmas\u0131, b\u00fcy\u00fck veri setlerinde bile y\u00fcksek performansl\u0131 aramalar\u0131n yap\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Bu makalede sunulan bilgiler ve \u00f6rnekler, PostgreSQL FTS&#8217;nin temel prensiplerini ve pratik uygulamalar\u0131n\u0131 anlaman\u0131za yard\u0131mc\u0131 olmay\u0131 ama\u00e7lamaktad\u0131r. Kendi projelerinizde bu g\u00fc\u00e7l\u00fc \u00f6zelli\u011fi kullanarak kullan\u0131c\u0131lar\u0131n\u0131za daha iyi bir arama deneyimi sunabilirsiniz. Unutmay\u0131n, her sistemde oldu\u011fu gibi, performans optimizasyonu ve do\u011fru yap\u0131land\u0131rma se\u00e7imi, ba\u015far\u0131l\u0131 bir FTS uygulamas\u0131n\u0131n anahtarlar\u0131d\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"PostgreSQL&#8217;de Tam Metin Arama (Full-Text Search) Kullan\u0131m\u0131: Ubuntu 16.04 \u00dczerinde Kapsaml\u0131 Bir Rehber\nGiri\u015f: Tam Metin Arama Neden \u00d6nemli?\nG\u00fc","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1468],"tags":[],"class_list":{"0":"post-31527","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-ubuntu","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>PostgreSQL&#039;de Tam Metin Arama (Full-Text Search) Kullan\u0131m\u0131: Ubuntu 16.04 \u00dczerinde Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/postgresqlde-tam-metin-arama-full-text-search-kullanimi-ubuntu-16-04-uzerinde-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PostgreSQL&#039;de Tam Metin Arama (Full-Text Search) Kullan\u0131m\u0131: Ubuntu 16.04 \u00dczerinde Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"PostgreSQL&#039;de Tam Metin Arama (Full-Text Search) Kullan\u0131m\u0131: Ubuntu 16.04 \u00dczerinde Kapsaml\u0131 Bir Rehber Giri\u015f: Tam Metin Arama Neden \u00d6nemli? G\u00fc\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/postgresqlde-tam-metin-arama-full-text-search-kullanimi-ubuntu-16-04-uzerinde-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-10T20:41:18+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"26 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/postgresqlde-tam-metin-arama-full-text-search-kullanimi-ubuntu-16-04-uzerinde-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/postgresqlde-tam-metin-arama-full-text-search-kullanimi-ubuntu-16-04-uzerinde-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"PostgreSQL&#8217;de Tam Metin Arama (Full-Text Search) Kullan\u0131m\u0131: Ubuntu 16.04 \u00dczerinde Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2025-10-10T20:41:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/postgresqlde-tam-metin-arama-full-text-search-kullanimi-ubuntu-16-04-uzerinde-kapsamli-bir-rehber\/\"},\"wordCount\":4000,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Ubuntu\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/postgresqlde-tam-metin-arama-full-text-search-kullanimi-ubuntu-16-04-uzerinde-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/postgresqlde-tam-metin-arama-full-text-search-kullanimi-ubuntu-16-04-uzerinde-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/postgresqlde-tam-metin-arama-full-text-search-kullanimi-ubuntu-16-04-uzerinde-kapsamli-bir-rehber\/\",\"name\":\"PostgreSQL'de Tam Metin Arama (Full-Text Search) Kullan\u0131m\u0131: Ubuntu 16.04 \u00dczerinde Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-10T20:41:18+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/postgresqlde-tam-metin-arama-full-text-search-kullanimi-ubuntu-16-04-uzerinde-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/postgresqlde-tam-metin-arama-full-text-search-kullanimi-ubuntu-16-04-uzerinde-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/postgresqlde-tam-metin-arama-full-text-search-kullanimi-ubuntu-16-04-uzerinde-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PostgreSQL&#8217;de Tam Metin Arama (Full-Text Search) Kullan\u0131m\u0131: Ubuntu 16.04 \u00dczerinde Kapsaml\u0131 Bir Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"PostgreSQL'de Tam Metin Arama (Full-Text Search) Kullan\u0131m\u0131: Ubuntu 16.04 \u00dczerinde Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/postgresqlde-tam-metin-arama-full-text-search-kullanimi-ubuntu-16-04-uzerinde-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"PostgreSQL'de Tam Metin Arama (Full-Text Search) Kullan\u0131m\u0131: Ubuntu 16.04 \u00dczerinde Kapsaml\u0131 Bir Rehber","og_description":"PostgreSQL'de Tam Metin Arama (Full-Text Search) Kullan\u0131m\u0131: Ubuntu 16.04 \u00dczerinde Kapsaml\u0131 Bir Rehber Giri\u015f: Tam Metin Arama Neden \u00d6nemli? G\u00fc","og_url":"https:\/\/fatihsoysal.com\/blog\/postgresqlde-tam-metin-arama-full-text-search-kullanimi-ubuntu-16-04-uzerinde-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-10T20:41:18+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"26 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/postgresqlde-tam-metin-arama-full-text-search-kullanimi-ubuntu-16-04-uzerinde-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/postgresqlde-tam-metin-arama-full-text-search-kullanimi-ubuntu-16-04-uzerinde-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"PostgreSQL&#8217;de Tam Metin Arama (Full-Text Search) Kullan\u0131m\u0131: Ubuntu 16.04 \u00dczerinde Kapsaml\u0131 Bir Rehber","datePublished":"2025-10-10T20:41:18+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/postgresqlde-tam-metin-arama-full-text-search-kullanimi-ubuntu-16-04-uzerinde-kapsamli-bir-rehber\/"},"wordCount":4000,"commentCount":2,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Ubuntu"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/postgresqlde-tam-metin-arama-full-text-search-kullanimi-ubuntu-16-04-uzerinde-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/postgresqlde-tam-metin-arama-full-text-search-kullanimi-ubuntu-16-04-uzerinde-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/postgresqlde-tam-metin-arama-full-text-search-kullanimi-ubuntu-16-04-uzerinde-kapsamli-bir-rehber\/","name":"PostgreSQL'de Tam Metin Arama (Full-Text Search) Kullan\u0131m\u0131: Ubuntu 16.04 \u00dczerinde Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-10T20:41:18+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/postgresqlde-tam-metin-arama-full-text-search-kullanimi-ubuntu-16-04-uzerinde-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/postgresqlde-tam-metin-arama-full-text-search-kullanimi-ubuntu-16-04-uzerinde-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/postgresqlde-tam-metin-arama-full-text-search-kullanimi-ubuntu-16-04-uzerinde-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PostgreSQL&#8217;de Tam Metin Arama (Full-Text Search) Kullan\u0131m\u0131: Ubuntu 16.04 \u00dczerinde Kapsaml\u0131 Bir Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31527","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=31527"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31527\/revisions"}],"predecessor-version":[{"id":31528,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31527\/revisions\/31528"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31527"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31527"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31527"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}