Tam Metin Arama — LIKE '%kira%' Neden Hem Yavaş Hem Eksik?
Önce şunu oku: SQL İndeksleme ve EXPLAIN
30 saniyede özet
Metinde kelime aramak için LIKE '%...%' bütün tabloyu okur ve büyük harf, ek ya da Türkçe İ yüzünden sonuç kaçırır. Ters indeks her kelimeyi geçtiği satırlara bağlar; dili bilen bir analizle hem hızlı hem doğru arar.
Kalın bir kitapta bir kelimeyi arıyorsun. Her sayfayı tek tek okuyabilirsin, ya da kitabın sonundaki dizine bakıp kelimenin geçtiği sayfalara doğrudan gidebilirsin. Ama dizini hazırlayan kişi “Kira” ile “kirası”nı ayrı kelimeler saydıysa, aradığın sayfaların çoğunu kaçırırsın.
-
Bayt: Hareketlerde arama ekledik: WHERE description LIKE '%kira%'. Basit ve çalışıyor!
-
Sen: Müşteri altı kira ödemesinden yalnızca dördünü gördü. Bir de araç kiralamayı gösterdi.
-
Bayt: Bir de sorgu milyon satırlık tabloda saniyeler sürüyor...
-
Bayt: Biz harf arıyoruz, müşteri kelime arıyor. Kitabın dizinine bakalım.
LIKE neden yetmez?
LIKE '%kira%' metnin herhangi bir yerinde bu harf dizisini arar. Baştaki joker karakter yüzünden B-tree indeks kullanılamaz; veritabanı her satırı tek tek okur.
Üstelik harf dizisi arar, kelime değil. “Araç kiralama”yı bulur, çünkü harfler içinde geçer; “KİRA ödemesi”ni ise büyük harf yüzünden kaçırır.
Kafam karıştı, daha basit anlat
LIKE ‘%kira%’ her satırı okur ve kelime değil harf arar.
WHERE description LIKE '%kira%' neden büyük bir tabloda yavaştır?
LIKE '%kira%' sorgusu 'Araç kiralama' satırını neden bulur?
Kelimeden satıra
Ters indeks kurduk ama metinleri yalnızca varsayılan kurallarla küçük harfe çevirdik. 'KİRA ödemesi' satırı 'kira' aramasında bulunur mu? Cevabı göster
Bulunmaz. Varsayılan küçük harf kuralı Türkçe “İ” harfini “i” yerine “i ve üstünde bir nokta” olarak çevirir; kelime “kira” ile eşleşmez. Üstelik “kirası” da ayrı bir kelime sayılır.
Adım adım oku
- Her sayfayı tek tek okumak: yavaş.
- Kitabın sonundaki dizin: kelime → sayfalar.
- Dizin dili bilmezse: 'Kira', 'kirası' ayrı kelime.
- Doğru arama, dili bilen bir dizinle yapılır.
Bir ters indeksHer kelimeyi geçtiği satırların listesine bağlayan yapı. Tam metin araması tabloyu değil, yalnızca aranan kelimenin listesini okur.Sözlükte gör →, her kelimeyi geçtiği satırların listesine bağlar. Arama, tabloyu değil yalnızca aranan kelimenin listesini okur; bu yüzden tablo büyüdükçe bile hızlı kalır.
Ama ters indeks, metni kelimelere ayıran kurallar kadar iyidir. Türkçe küçük harf (I→ı, İ→i) ve ekleri atan bir kök bulmaBir kelimeyi eklerinden arındırıp köküne indirmek: 'kirası' ve 'kirasi' 'kira' olur. Ekli dillerde aramanın doğruluğu buna bağlıdır.Sözlükte gör → adımı, “KİRA”, “Kira” ve “kirası”nı aynı kelimeye indirir.
Kafam karıştı, daha basit anlat
Ters indeks kelimeden satıra gider. Dilin kurallarını bilirse her yazımı aynı kelimede toplar.
Ters indeks (inverted index) nedir?
Kök bulma (stemming) arama için neden önemlidir?
Kendin gör
Hareketlerde "kira" ara
Tohum 524053Arama: kira
- Ekim kirası
- KİRA ödemesi
- Kira depozitosu
- Market alışverişi
- Elektrik faturası
- Araç kiralama
- kira artışı farkı
- Okul taksidi
- İş yeri kirası
- Kırtasiye
- Su faturası
- Ev kirasi
Oynat ya da adımla: önce satırlar okunur, sonra sonuç gelir.
Şu an ne oldu?
LIKE '%kira%' (bütün tabloyu tara)
12 hareketin 6’sı gerçekten kira ödemesi.
Görevler0/3
Bütün tabloyu oku ve yine de kira kaçıraçık
İpucu
Varsayılan ayarlar yeter.
"KİRA" yazan hareketi Türkçe büyük İ yüzünden kaçıraçık
İpucu
Dili bilmeyen bir indeks.
Altı kira ödemesini de bul, başka hiçbir şey bulmaaçık
İpucu
Türkçeyi bilen bir analiz.
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
- Varsayılanla oynat. LIKE ‘%kira%’: bütün tablo okundu, iki kira kaçtı, araç kiralama yanlışlıkla eşleşti.
- “LIKE ‘kira%’ + B-tree” seç. Hızlı, ama yalnızca “kira” ile başlayan tek hareket bulundu.
- “Ters indeks, varsayılan küçük harf” seç. Yalnızca iki sonuç: “KİRA” ve “kirası” kaçtı.
- “Ters indeks, Türkçe analiz” seç. Altı kira ödemesinin hepsi bulundu, yanlış eşleşme yok.
Ters indeks var ama metinler varsayılan kurallarla küçük harfe çevrilmiş. 'KİRA ödemesi' neden bulunamaz?
LIKE 'kira%' sorgusu indeks kullanabilir ama ne kaçırır?
Tuzaklar
Varsayılan dil ayarıyla yetinmek: İngilizce kurallar Türkçe İ’yi ve ekleri tanımaz. Arama yapılandırmasını Türkçe seç ve gerçek verilerle dene.
Her şeyi tek bir sorguda aramak. IBAN ya da müşteri numarası gibi kodlar kelime değildir; onları ayrı bir alanda, tam eşleşmeyle ara. Tam metin araması serbest yazı içindir.
İndeksi güncel tutmayı unutmak. Ayrı bir arama sunucusu kullanıyorsan, veritabanındaki değişikliğin oraya da ulaştığından emin ol. Aksi hâlde yeni hareketler aramada görünmez.
Kafam karıştı, daha basit anlat
Türkçe yapılandır, kodları ayrı ara, arama indeksini güncel tut.
Müşteri arama kutusuna bir IBAN yazdı. Nasıl aranmalı?
Derinleş · Hareket araması: PostgreSQL'de Türkçe tam metin 4 dosya · ~58 satır · ilk okumada atlayabilirsin
Kendini sına
LIKE '%kira%' sorgusu bir B-tree indeksini kullanarak hızlıca çalışır.
Arama ayrı bir arama sunucusunda (örneğin Elasticsearch) tutuluyor. Yeni hareketler aramada görünmüyor. Olası sebep nedir?
Aklında kalacak üç şey
- 1 Baştaki joker karakterli LIKE ('%kira%') B-tree indeksi kullanamaz ve bütün tabloyu okur. Üstelik harf dizisi arar: 'kiralama'yı bulur, 'KİRA'yı kaçırır.
- 2 Ters indeks her kelimeyi geçtiği satırlara bağlar; arama, tabloyu değil yalnızca o kelimenin listesini okur.
- 3 Ters indeks, metni kelimelere ayıran kurallar kadar iyidir. Türkçe küçük harf ve ek temizleme olmadan 'KİRA' ve 'kirası' ayrı kelimeler sayılır.
4 kart sonraki derste seni bekliyor